当前位置: 首页 > 后端技术 > Python

Python画“地图”神器,大开眼界!

时间:2023-03-25 23:33:56 Python

之前给大家介绍过各种Python可视化模块,但是用它们做地理可视化非常简单。所以想画出更好的可视化地图?想在地图上自由设置各种参数?想要获得灵活的交互体验?今天就到这里,Python地图绘制神器folium,上手开启!folium介绍及安装Folium建立在Python生态的数据应用能力和Leaflet.js库的映射能力之上。数据在Python中进行操作,然后通过folium在Leaflet地图中可视化。与国内百度的pyecharts相比,folium更加灵活,可以自定义绘图区域,展示形式更加多样。Folium简介Folium是一个开源库,它建立在Python生态系统的数据整理能力和Leaflet.js库的映射能力之上。使用Python处理数据并使用Folium在Leaflet地图上将其可视化。Folium可以在交互式Leaflet地图上轻松可视化Python处理的数据。它不仅可以在地图上显示数据的分布,还可以使用Vincent/Vega在地图上进行标记。这个开源库有许多来自OpenStreetMap、MapQuestOpen、MapQuestOpenAerial、Mapbox和Stamen的内置地图元素,并支持使用Mapbox或CloudmadeAPI密钥的自定义地图元素。Folium支持GeoJSON和TopoJSON两种文件格式的叠加。也可以将数据连接到这两种文件格式的叠加层。最后,可以使用color-brewer配色方案创建分布图。Folium允许您使用Python强大的生态系统来处理数据,然后将其与Leaflet地图一起显示。Folium具有来自OpenStreetMap、MapQuestOpen、MapQuestOpenAerial、Mapbox和Stamen的一些内置地图元素(tilesets),并支持使用Mapbox或CloudmadeAPI密钥的自定义地图元素。Folium支持GeoJSON和TopJSON覆盖,绑定数据以创建等值线图。但是,Folium库在绘制热图时,需要联网才能显示。安装foliumpipinstallfolium-ihttp://pypi.douban.com/simple--trusted-hostpypi.douban.com▲这里直接使用国内豆瓣源,基本都是用folium来显示地图类为folium.Map,类声明如下:classfolium.Map(location=None,width='100%',height='100%',left='0%',top='0%',position='relative',tiles='OpenStreetMap',attr=None,min_zoom=0,max_zoom=18,zoom_start=10,min_lat=-90,max_lat=90,min_lon=-180,max_lon=180,max_bounds=False,crs='EPSG3857',control_scale=False,prefer_canvas=False,no_touch=False,disable_3d=False,png_enabled=False,zoom_control=True,**kwargs)几个重要参数:location:经纬度,list或tuple格式,顺序为latitude,longitudezoom_start:缩放值,默认为10,值越大,比例尺越小,地图缩放级别越大展示style,默认为“OpenStreetMap”,即打开街道显示crs:GeographyCoordinatereferencesystem,默认为“EPSG3857”mapofeachlevelworldmapimportfoliumprint(folium.__version__)#definetheworldmapworld_map=folium.map()#saveworldmapworld_map.save('test_01.html')结果如下:currentfoliumVersion:0.11.0nationalmapimportfolium#定义国家地图national_map=folium.Map(location=[35.3,100.6],zoom_start=4)#savenationalmapnational_map.save('test_02.html')结果如下:其实改变城市级地图的地图显示就是改变显示的经纬度和缩放比例,省市级、市级、县级的用法类似。这是城市级别的示例,例如北京:importfolium#definethenationalmapcity_map=folium.Map(location=[39.93,116.40],zoom_start=10)#savenationalmapcity_map.save('test_03.html')在地图上标记普通标记用Marker添加普通标记,可以选择标记的样式importfoliumbj_map=folium.Map(location=[39.93,115.40],zoom_start=12,tiles='StamenTerrain')folium.Marker(location=[39.95,115.33],popup='Mt.HoodMeadows',icon=folium.Icon(icon='cloud')).add_to(bj_map)folium.Marker(location=[39.96,115.32],popup='TimberlineLodge',icon=folium.Icon(color='green')).add_to(bj_map)folium.Marker(location=[39.93,115.34],popup='SomeOtherLocation',icon=folium.Icon(color='red',icon='info-sign')#markcoloricon).add_to(bj_map)bj_map.save('test_04.html')结果如下:用Circle和CircleMarker添加圆形标记importfoliumbj_map=folium.Map(location=[39.93,116.40],zoom_start=12,tiles='StamenToner')folium.Circle(radius=200,location=(39.92,116.43),popup='TheWaterfront',color='#00FFFF',#colorfill=False,#fill).add_to(bj_map)Markfolium.Circle=(39.93,116.38),radius=50,#圆的半径popup='LaurelhurstPark',color='#FF1493',fill=True,fill_color='#FFD700').add_to(bj_map)bj_map.save('test_05.html')结果如下:dynamictaggingimportfoliumdynamic_tagging=folium.Map(location=[46.8527,-121.7649],tiles='StamenTerrain',zoom_start=13)folium.Marker([46.8354,-121.7325],popup='CampMuir').add_to(dynamic_tagging)dynamic_tagging.add_child(folium.ClickForMarker(popup='Waypoint'))dynamic_tagging.save('test_html')结果如下:实战案例以地图上停车场的地理位置数据可视化为例,熟悉folium地图可视化的使用获取经纬度数据停车场地理位置数据来源于互联网,数据真实可靠。我们先用Python爬虫获取数据#数据源:http://219.136.133.163:8000/Pages/Commonpage/login.aspximportrequestsimportcsvimportjsonimportloggingheaders={'X-Requested-With':'XMLHttpRequest','User-Agent':'Mozilla/5.0(WindowsNT10.0;WOW64)AppleWebKit/537.36(KHTML,likeGecko)Chrome/65.0.3325.181Safari/537.36'}记录。basicConfig(level=logging.INFO,format='%(asctime)s-%(levelname)s:%(message)s')url='http://219.136.133.163:8000/Pages/Commonpage/AsyGetData.asmx/GetParkList's=requests.session()s.get(url,headers=headers)foriinrange(1,318):data={'cp':str(i),'ps':'10','kw':'','lon':'undefined','lat':'undefined','type':'undefined'}url='http://219.136.133.163:8000/Pages/Commonpage/AsyGetData.asmx/GetParkList'#提交表单数据res=s.post(url,data=data,headers=headers)#重置编码res.encoding='utf-8'#strtojson以便于提取数据result=json.loads(res.text)['Result']forjinresult:park_name=j['ParkName']Lon=j['Longitude']Lat=j['Latitude']withopen('parkings.csv','a+',newline='',encoding='gb18030')asf:f_csv=csv.writer(f)f_csv.writerow([park_name,Lon,Lat])logging.info([park,_name,)的结果如下:一共3170个停车场位置数据foliummapvisualizationimportpandasaspdimportfolium#readcsvdatadata=pd.read_csv('parkings.csv',encoding='gbk')#importlatitudeandlongitudedatapark_map=folium.Map(location=[data['latitude'].mean(),data['longitude'].mean()],zoom_start=10,control_scale=True,)#实例化folium.map.FeatureGroup对象事件=folium.map.FeatureGroup()forname,rowindata.iterrows():incidents.add_child(folium.CircleMarker(#CircleMarker表示花圈(row["latitude"],row["longitude"#]),纬度和每个停车场的经度坐标radius=7,#圆半径color='#FF1493',#标志外圈ColorFill=TRUE,#是否填充fill_color='#00ff00',#填充颜色fill_opaCity=0.4#填充透明度))Park_map.add_child(incidents)Park_map.save('PARK_MAP1.HTML",我们统计一下停车的数量每个地方的地段从foliumimportpluginsdata=pd.read_csv('parkings.csv',encoding='gbk')park_map=folium.Map(location=[data['latitude'].mean(),data['longitude'].mean()],zoom_start=10,control_scale=True,)marker_cluster=plugins.MarkerCluster().add_to(park_map)forname,rowindata.iterrows():folium.Marker(位置=[row["latitude"],row["longitude"]]).add_to(marker_cluster)park_map.save('park_map2.html')效果如下:这个可以用于每个本地停车场的数量地图上统计了停车场,地图不断放大后,还可以显示每个停车场的具体位置,非常方便,以上就是本次分享的全部内容,如果还想了解更多tPython,请前往公众号:Python编程学习圈,每日干货分享,发送“J”还能领取大量学习资料。