相关文章推荐
会开车的香菜  ·  成語典 | 電子書·  7 月前    · 
打酱油的排球  ·  中央广播电视总台《2024年春节联欢晚会》节 ...·  10 月前    · 
英勇无比的铁链  ·  2021年深圳市工业产品质量监督抽查产品目录 ...·  1 年前    · 
豪情万千的山羊  ·  Python|使用PUSH ...·  1 年前    · 
机灵的煎饼果子  ·  ThingsBoard 3.3.3 发布 ...·  1 年前    · 
Code  ›  使用folium绘制区域轮廓与网格线开发者社区
社区功能 经纬度
https://cloud.tencent.com/developer/article/1856621
直爽的乒乓球
1 年前
作者头像
可以叫我才哥
0 篇文章

使用folium绘制区域轮廓与网格线

前往专栏
腾讯云
开发者社区
文档 意见反馈 控制台
首页
学习
活动
专区
工具
TVP
文章/答案/技术大牛
发布
首页
学习
活动
专区
工具
TVP
返回腾讯云官网
社区首页 > 专栏 > 可以叫我才哥 > 使用folium绘制区域轮廓与网格线

使用folium绘制区域轮廓与网格线

作者头像
可以叫我才哥
发布 于 2021-08-05 15:28:53
3.6K 1
发布 于 2021-08-05 15:28:53
举报

我们的第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
 
推荐文章
会开车的香菜  ·  成語典 | 電子書
7 月前
打酱油的排球  ·  中央广播电视总台《2024年春节联欢晚会》节目单发布_有戏_澎湃新闻-The Paper
10 月前
英勇无比的铁链  ·  2021年深圳市工业产品质量监督抽查产品目录--抽查目录
1 年前
豪情万千的山羊  ·  Python|使用PUSH PLUS推送每日任务完成情况_python使用pushplus推送自动化测试结果-CSDN博客
1 年前
机灵的煎饼果子  ·  ThingsBoard 3.3.3 发布 · 物联网平台
1 年前
今天看啥   ·   Py中国   ·   codingpro   ·   小百科   ·   link之家   ·   卧龙AI搜索
删除内容请联系邮箱 2879853325@qq.com
Code - 代码工具平台
© 2024 ~ 沪ICP备11025650号