使用folium绘制区域轮廓与网格线
我们的第92篇原创
作者:才哥
☆
大家好,我是才哥。
上次咱们介绍过《 想知道所在的城市有多少条道路?我用python发现北京一共有1.5万条道路! 》,其中关于北京行政区域轮廓及网格的绘制有朋友感兴趣,今天我们就来简单介绍一下。
先看效果:
1. 绘制区域轮廓
这里用到的是
folium
绘图库,folium
是js上著名的地理信息可视化库leaflet.js
为Python提供的接口,通过它,我们可以通过在Python端编写代码操纵数据,来调用leaflet的相关功能,基于内建的osm或自行获取的osm资源和地图原件进行地理信息内容的可视化,以及制作优美的可交互地图。 https://python-visualization.github.io/folium/
绘制区域轮廓用到的是
PolyLine
方法,本质上就是将区域的若干个经纬度坐标点一一连线,颗粒度约细则轮廓越精确。所以,这里我们要绘制北京市的行政区域轮廓的话,需要先获取其经纬度坐标点列表。
在上期案例《 想知道所在的城市有多少条道路?我用python发现北京一共有1.5万条道路! 》中我们已经获取了北京市的行政区域轮廓经纬度坐标点列表,这里就演示一下绘制过程:
import folium
m = folium.Map([39.929986, 116.395645], # 北京市中心区域经纬度
zoom_start=9, # 默认放大倍数
route = folium.PolyLine(
locations, # 坐标点列表
weight=3, # 线宽
color='blue', # 线条颜色
opacity=0.8, # 透明度
).add_to(m)
# m.save( '区域.html')
输出结果如下:
区域
到这里,大家对
folium
绘制轮廓就有了一定的了解,是不是还蛮简单的,那就简单定义一个函数吧。
# 定义一个绘图函数,参数是经纬度坐标点列表、线宽、颜色和透明度
def drow_m(locations,weight,color,opacity):
route = folium.PolyLine(
locations,
weight=weight,
color=color,
opacity=opacity
).add_to(m)
接下来,我们再演示一下矩形区域以及区域内网格的绘制过程。
2. 绘制矩形区域
详情过程大家可以参考《 想知道所在的城市有多少条道路?我用python发现北京一共有1.5万条道路! 》,这里就放代码了,部分代码做简单讲解。
import requests
import pandas as pd
import os
url = 'https://restapi.amap.com/v3/config/district?'
key = '你的key'
keywords = '北京'
params = {
'key':key,
'keywords':keywords,
'subdistrict':0,
'extensions':'all',
r = requests.get(url,params=params)
data = r.json()
polyline = data['districts'][0]['polyline']
polyline_list = polyline.split(';')
df = pd.DataFrame(polyline_list,columns=['经纬度'])
df[['经度','纬度']] = df['经纬度'].str.split(',',n=1,expand=True).astype(float)
# 获取区域边界经纬度
latitude_max = df['经度'].max()
latitude_min = df['经度'].min()
longitude_max = df['纬度'].max()
longitude_min = df['纬度'].min()
# 北京行政区域边界经纬度点
locations = [[x[1],x[0]] for x in [list(eval(e)) for e in polyline_list]]
# 北京行政区域所在矩形区域
location = [[39.442758, 115.423411], [39.442758, 117.514625],
[41.060816, 117.514625], [41.060816, 115.423411],
[39.442758, 115.423411]]
由于高德api获取的经纬度是经度在前、纬度在后,但是
folium
中
纬度在前、经度在后
。所以这里需要做简单的经纬度位置调换的操作,以满足需求格式。
绘制矩形区域 :
drow_m(location,3,'black',0.8)
矩形区域
3. 绘制网格线
对于网格部分,我们需要获取网格线两端的经纬度,每条线是2对经纬度坐标点。
# 绘制网格,这里按照20*20共400个网格
def get_polygons(latitude_num,longitude_num):
latitude_step = (latitude_max - latitude_min)/latitude_num
longitude_step = (longitude_max - longitude_min)/longitude_num
polygons = []
for i in range(latitude_num):
latitude_right = latitude_min + latitude_step * (i+1)
polygons.append([[longitude_max,latitude_right],[longitude_min,latitude_right]])
for j in range(longitude_num):
longitude_down = longitude_max - longitude_step * (j+1)
polygons.append([[longitude_down,latitude_min],[longitude_down,latitude_max]])
return polygons