前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >使用folium绘制区域轮廓与网格线

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

作者头像
可以叫我才哥
发布2021-08-05 15:28:53
7.2K1
发布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万条道路!》中我们已经获取了北京市的行政区域轮廓经纬度坐标点列表,这里就演示一下绘制过程:

代码语言:javascript
复制
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
# m.save( '区域.html')

输出结果如下:

区域

到这里,大家对folium绘制轮廓就有了一定的了解,是不是还蛮简单的,那就简单定义一个函数吧。

代码语言:javascript
复制
# 定义一个绘图函数,参数是经纬度坐标点列表、线宽、颜色和透明度
def drow_m(locations,weight,color,opacity):
    route = folium.PolyLine(
        locations,
        weight=weight,
        color=color,
        opacity=opacity
    ).add_to(m)

接下来,我们再演示一下矩形区域以及区域内网格的绘制过程。

2. 绘制矩形区域

详情过程大家可以参考《想知道所在的城市有多少条道路?我用python发现北京一共有1.5万条道路!》,这里就放代码了,部分代码做简单讲解。

代码语言:javascript
复制
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纬度在前、经度在后。所以这里需要做简单的经纬度位置调换的操作,以满足需求格式。

绘制矩形区域

代码语言:javascript
复制
drow_m(location,3,'black',0.8)
m

矩形区域

3. 绘制网格线

对于网格部分,我们需要获取网格线两端的经纬度,每条线是2对经纬度坐标点。

代码语言:javascript
复制
# 绘制网格,这里按照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

polygons = get_polygons(20,20)

网格中经度线两端纬度不变,纬度线两端经度不变。

在绘制的过程中,需要注意的是每条线单独绘制,不能线线互连。

绘制网格线

代码语言:javascript
复制
for polygon in polygons:
    drow_m(polygon,1,'black',0.8)
m

网格线

以上就是本次全部内容,感兴趣的可以玩玩,比如通过高德API获取大学、景区、饭店等经纬度信息,然后绘制分布之类的。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-07-17,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 可以叫我才哥 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1. 绘制区域轮廓
  • 2. 绘制矩形区域
  • 3. 绘制网格线
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档