Python实现地图栅格化
引言 以2021年美赛B题为背景,研究为了应对澳洲山火的无人机配比问题。 在正式进入求解之前,我们需要对地图环境进行建模。 一般来说,求解无人机路径问题时,我们选择对地图数据栅格化处理,然后将之由GIS信息转化为可供编程求解的信息。 地图栅格化思路 为了将地图栅格化,我们要明白格子是如何生成的, 两种思路: 1.生成两组连续的数,在地图上互相划线,即一组代表起始点数组,另一组代表终止点数组。 2.一个格子一个格子画,确定好格子四周的信息,然后循环画格子。
本文将使用第二种方法进行绘图,python代码如下 我们将使用python的folium库进行绘图 这个库应该需要用conda命令进行安装,或者在其他的相关库配备完全的情况下可以用pip直接安装。 对于另外的地理信息绘图库Geopandas,我们需要先从网页下载几个whl文件,后用pip install 文件名.whl 安装这个文件,然后再pip就好
import folium
import pandas as pd
import webbrowser as wb
import numpy as np
archive = pd.read_csv('dataset_of_vctria.csv')
latitude = archive['latitude'].head(30000)
longitude = archive['longitude'].head(30000)
m = folium.Map(location=[np.mean(latitude), np.mean(longitude)],
width='100%',
height='100%',
zoom_start=5,
min_zoom=0,
max_zoom=18,
tiles='OpenStreetMap',
attr="http://ditu.amap.com/"
)
def pointpoint(m, latitude, lontitude):
point = folium.map.FeatureGroup()
for lat, lon in zip(latitude, longitude):
point.add_child(
folium.CircleMarker(
(lat, lon),
radius=2,
color='red',
fill=True,
fill_color='red',
fill_opacity=1,
)
)
m.add_child(point)
for i in range(20):
for j in range(20):
folium.Polygon(
[
[-38.02 + 0.04 * j, 142.91 + i * 0.05],
[-38.02 + 0.04 * j, 142.91 + (i + 1) * 0.05],
[-38.02 + 0.04 * (j + 1), 142.91 + (i + 1) * 0.05],
[-38.02 + 0.04 * (j + 1), 142.91 + i * 0.05]
], color='orange', weight=1
).add_to(m)
'''
如果要填充格子
folium.Polygon(
[
[-38.02 + 0.04 * j, 142.91 + i * 0.05],
[-38.02 + 0.04 * j, 142.91 + (i + 1) * 0.05],
[-38.02 + 0.04 * (j + 1), 142.91 + (i + 1) * 0.05],
[-38.02 + 0.04 * (j + 1), 142.91 + i * 0.05]
], color='orange', weight=1,fill=True, fill_color='blue', fill_opacity=0.2 # 最后一个参数是透明度(0-1)
).add_to(m)
'''
m.add_child(folium.LatLngPopup())
'''
这里提一句,pycharm使用这个控件的时候可能会存在打不开这个图的问腿,所以我们采用保存为网页格式,然后用浏览器打开,但是如果数据量过大的时候会存在很难进行交互,以及卡顿的情况。
'''
m.save('map.html')
wb.open('map.html')
看看效果 放大之后 在这里我们选定一个研究区域对其火灾情况进行研究 这是我们研究的一个区域中无人机分布
|