python 显示地图

2022-05-22 15:02:50 浏览数 (3)

之前写了一篇,

有份近10年的地震数据,你会怎样用python分析呢?

有人留言说,想要将数据显示地图上。 比如地震网上这种效果。

显示图表的库非常多,这里我们试用一个轻量级第三方 folium 库。

三行代码就可以在本地生成一个render.html地图网页文件。

代码语言:javascript复制
import folium
world_map = folium.Map(location=[28.5, 100.40], zoom_start=4)
world_map.save('render.html')

详细使用可以查看其文档。

在地图指定的经纬度上标记也非常简单。选取一种标记方式即可,我这里采用圆标记。

代码语言:javascript复制
folium.CircleMarker(
                    location=[50, 100.40],
                    radius=2,
                    popup='Laurelhurst Park',
                    color='#ff0000',
                    fill=True,
                    fill_color='#3186cc'
                ).add_to(self.world_map)

除了圆,还有很多其它形式,比如下面这种:

下面做一个GUI,将网页内嵌到里面。

根据中国大概的经纬度范围,粗略的过滤数据,通过滑动条,显示不同级别的地震点。

近十年二级以上地震效果

近十年四级以上地震效果

近十年六级以上地震效果

近十年七级以上地震效果

根据可视化的效果,大家能看出些什么吗?


完整的代码:

代码语言:javascript复制
import sys
import os
from PySide2.QtWidgets import *
from PySide2.QtCore import *
from PySide2.QtWebEngineWidgets import QWebEngineView
import json
import folium

with open('earthquake1.json',encoding='utf-8') as f:
    data = json.load(f)
    
longitudes = data['longitude']
latitudes = data['latitude']
levels = data['level']

class MyCharts(QWidget):
    def __init__(self):
        super().__init__()
        self.resize(1500,1500)
        self.V_l = QVBoxLayout()
        self.h_l = QHBoxLayout()
        self.label = QLabel('地震等级')
        self.label2 = QLabel('0级')
        self.slider = QSlider(orientation=Qt.Horizontal)
        self.slider.setMinimum(1)
        self.slider.setMaximum(9)
        self.slider.setTickPosition(QSlider.TicksAbove)
        self.slider.setTickInterval(1)
        self.h_l.addWidget(self.label)
        self.h_l.addWidget(self.label2)
        self.h_l.addWidget(self.slider)
        self.browser = QWebEngineView()
        self.V_l.addWidget(self.browser)
        self.V_l.addLayout(self.h_l)
        self.setLayout(self.V_l)
        self.show()
        self.init_map()
        self.init_set()
        self.slider.valueChanged.connect(self.add_marker)
        
    def init_map(self):
        self.world_map = folium.Map(location=[28.5, 100.40], zoom_start=4)
        self.world_map.save('render.html')
        
    def init_set(self):
        self.browser.load(QUrl.fromLocalFile(
                        os.path.realpath("render.html")))
        
    def add_marker(self):
        self.level = self.slider.value()
        self.label2.setText(f'{self.level}级')
        print(self.level,type(self.level))
        self.world_map = folium.Map(location=[28.5, 100.40], zoom_start=4)
        for x, y, level in zip(longitudes, latitudes, levels):
            if (73.5 < float(x) < 135) and (4 < float(y) < 53.5) and float(level) > self.level:
                folium.CircleMarker(
                    location=[y, x],
                    radius=2,
                    popup='Laurelhurst Park',
                    color='#ff0000',
                    fill=True,
                    fill_color='#3186cc'
                ).add_to(self.world_map)
        self.world_map.save('render.html')
        self.init_set()
        
if __name__ == "__main__":
    app = QApplication(sys.argv)
    window = MyCharts()
    sys.exit(app.exec_())
代码语言:javascript复制
(全文完)

1 人点赞