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,    #最小缩放倍数,由于folium地图控件有良好的交互效果,因此可以进行自由的缩放操作
               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)
#生成栅格
#选定起始点 不断生成四方格 由于经纬度与距离的转换公式不同 因此需要进行增量的调整
#栅格大小 5km*5km
#生成400个格子
for i in range(20):
    for j in range(20):
    #folium.Polygon函数用来生成封闭的图形,我们需要提供四个顶点的信息
        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')

看看效果
在这里插入图片描述
放大之后在这里插入图片描述
在这里我们选定一个研究区域对其火灾情况进行研究
在这里插入图片描述
这是我们研究的一个区域中无人机分布
在这里插入图片描述
[数据集戳这里]
数据集

  • 8
    点赞
  • 103
    收藏
    觉得还不错? 一键收藏
  • 10
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值