【地理信息可视化】basemap(cartopy)+geopandas显示地图-01

import warnings
warnings.filterwarnings('ignore')

import os

import numpy as np
from scipy.stats import norm
import pandas as pd

import seaborn as sns
import matplotlib.pyplot as plt
get_ipython().run_line_magic('matplotlib', 'inline')

plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False
import cartopy.crs as ccrs
import geopandas as gpd
import cartopy.io.shapereader as shpreader
from shapely.geometry import Polygon
from matplotlib.patches import Polygon as mpl_polygon
import cartopy.feature as cfeature

地理边界

国边界

country_CN = gpd.read_file('ChinaAdminDivisonSHP/1. Country/country.shp', encoding='utf-8')  # 用高德最新API
# country_CN = country_CN.to_crs("epsg:3857")  # 墨卡托
country_CN.head()

| | cn_adcode | cn_name | geometry |

0 100000 中华人民共和国 MULTIPOLYGON (((112.06067 3.86216, 112.06139 3...

省边界

province_CN = gpd.read_file('ChinaAdminDivisonSHP/2. Province/province.shp', encoding='utf-8')
# province_CN = province_CN.to_crs("epsg:3857")  # 墨卡托
province_CN.head()

| | pr_adcode | pr_name | cn_adcode | cn_name | geometry |
| 0 | 110000 | 北京市 | 100000 | 中华人民共和国 | POLYGON ((116.77565 40.02168, 116.77456 40.019... |
| 1 | 120000 | 天津市 | 100000 | 中华人民共和国 | POLYGON ((117.84713 39.40774, 117.84725 39.407... |
| 2 | 130000 | 河北省 | 100000 | 中华人民共和国 | MULTIPOLYGON (((118.27675 38.98087, 118.27262 ... |
| 3 | 140000 | 山西省 | 100000 | 中华人民共和国 | POLYGON ((110.61098 34.60730, 110.59450 34.603... |

4 150000 内蒙古自治区 100000 中华人民共和国 POLYGON ((124.52522 48.14594, 124.52310 48.145...

市边界

city_CN = gpd.read_file('ChinaAdminDivisonSHP/3. City/city.shp', encoding='utf-8')
# city_CN = city_CN.to_crs("epsg:3857")  # 墨卡托
city_CN.head()

| | ct_adcode | ct_name | pr_adcode | pr_name | cn_adcode | cn_name | geometry |
| 0 | 110100 | 北京城区 | 110000 | 北京市 | 100000 | 中华人民共和国 | POLYGON ((115.88575 40.21880, 115.88619 40.219... |
| 1 | 120100 | 天津城区 | 120000 | 天津市 | 100000 | 中华人民共和国 | POLYGON ((117.84713 39.40774, 117.84725 39.407... |
| 2 | 130100 | 石家庄市 | 130000 | 河北省 | 100000 | 中华人民共和国 | POLYGON ((113.83957 38.75839, 113.84087 38.757... |
| 3 | 130200 | 唐山市 | 130000 | 河北省 | 100000 | 中华人民共和国 | MULTIPOLYGON (((118.27675 38.98087, 118.27262 ... |

4 130300 秦皇岛市 130000 河北省 100000 中华人民共和国 MULTIPOLYGON (((119.43834 39.78659, 119.43843 ...

区线边界

district_CN = gpd.read_file('ChinaAdminDivisonSHP/4. District/district.shp', encoding='utf-8')  # 用高德最新的保险一下,前面的有误
district_CN = district_CN.to_crs("epsg:3857") # 墨卡托
district_CN.head()

| | dt_adcode | dt_name | ct_adcode | ct_name | pr_adcode | pr_name | cn_adcode | cn_name | geometry |
| 0 | 110101 | 东城区 | 110100 | 北京城区 | 110000 | 北京市 | 100000 | 中华人民共和国 | POLYGON ((12956215.380 4860265.340, 12956417.5... |
| 1 | 110102 | 西城区 | 110100 | 北京城区 | 110000 | 北京市 | 100000 | 中华人民共和国 | POLYGON ((12956810.382 4861461.271, 12956736.8... |
| 2 | 110105 | 朝阳区 | 110100 | 北京城区 | 110000 | 北京市 | 100000 | 中华人民共和国 | MULTIPOLYGON (((12962478.548 4847709.502, 1296... |
| 3 | 110106 | 丰台区 | 110100 | 北京城区 | 110000 | 北京市 | 100000 | 中华人民共和国 | POLYGON ((12960395.761 4841543.850, 12960396.7... |

4 110107 石景山区 110100 北京城区 110000 北京市 100000 中华人民共和国 POLYGON ((12929933.961 4864988.608, 12930138.2...
district_CN.tail()

| | dt_adcode | dt_name | ct_adcode | ct_name | pr_adcode | pr_name | cn_adcode | cn_name | geometry |
| 2871 | 820004 | 大堂区 | 820000 | 澳门特别行政区 | 820000 | 澳门特别行政区 | 100000 | 中华人民共和国 | POLYGON ((12639324.746 2530934.847, 12638911.4... |
| 2872 | 820005 | 风顺堂区 | 820000 | 澳门特别行政区 | 820000 | 澳门特别行政区 | 100000 | 中华人民共和国 | POLYGON ((12638470.703 2533062.510, 12638492.2... |
| 2873 | 820006 | 嘉模堂区 | 820000 | 澳门特别行政区 | 820000 | 澳门特别行政区 | 100000 | 中华人民共和国 | POLYGON ((12640225.654 2529452.013, 12639731.3... |
| 2874 | 820007 | 路凼填海区 | 820000 | 澳门特别行政区 | 820000 | 澳门特别行政区 | 100000 | 中华人民共和国 | POLYGON ((12640764.107 2526565.564, 12640801.1... |

2875 820008 圣方济各堂区 820000 澳门特别行政区 820000 澳门特别行政区 100000 中华人民共和国 POLYGON ((12640823.329 2524414.206, 12640705.4...

九段线

nine_dotted_line = gpd.read_file('ChinaAdminDivisonSHP/5. NineDot/china_nine_dotted_line.shp', encoding='utf-8')
# nine_dotted_line = nine_dotted_line.to_crs("epsg:3857") # 墨卡托
nine_dotted_line.head()

| | ACC | BOUND_L_ | BOUND_L_ID | BST | FNODE_ | F_CODE | GEO_CODE | LENGTH | LPOLY_ | RPOLY_ | TNODE_ | USE | geometry |
| 0 | 0 | 9800 | 9824 | 0 | 0 | FA000 | 61010 | 1.194710 | 0 | 0 | 0 | 23 | LINESTRING (109.30151 16.19954, 109.30843 16.1... |
| 1 | 0 | 9801 | 9825 | 0 | 0 | FA000 | 61010 | 1.042980 | 0 | 0 | 0 | 23 | LINESTRING (110.32325 12.24050, 110.32273 12.2... |
| 2 | 0 | 9802 | 9826 | 0 | 0 | FA000 | 61010 | 1.075450 | 0 | 0 | 0 | 23 | LINESTRING (108.30202 6.01089, 108.29263 6.036... |
| 3 | 0 | 9803 | 9827 | 0 | 0 | FA000 | 61010 | 0.959055 | 0 | 0 | 0 | 23 | LINESTRING (122.50662 23.46772, 122.64263 24.0... |

4 0 9804 9828 0 0 FA000 61010 1.141370 0 0 0 23 LINESTRING (121.91169 21.69752, 121.90547 21.6...

省中心

df_pcenter = pd.read_csv('ChinaAdminDivisonSHP/省市中心坐标位置LBC各省市中心.csv', encoding='gbk')
df_pcenter.head()

| | 所在省 | 城市名 | 纬度 | 经度 | Unnamed: 4 |
| 0 | 安徽省 | 合肥 | 31.52 | 117.17 | NaN |
| 1 | 安徽省 | 安庆 | 30.31 | 117.02 | NaN |
| 2 | 安徽省 | 蚌埠 | 32.56 | 117.21 | NaN |
| 3 | 安徽省 | 亳州 | 33.52 | 115.47 | NaN |

4 安徽省 巢湖 31.36 117.52 NaN

世界地图

fig = plt.figure(figsize=(10, 6))
ax = plt.axes(projection=ccrs.PlateCarree())
ax.coastlines()
plt.show()

中国地图

nine_dotted_line['geometry'].tolist()
[<LINESTRING (12167387.996 1827842.778, 12168159.16 1826594.017, 12168484.442...>,
 <LINESTRING (12281127.992 1373091.205, 12281070.24 1371301.869, 12281024.378...>,
 <LINESTRING (12056125.408 670360.39, 12055079.919 673202.074, 12054498.998 6...>,
 <LINESTRING (13637374.815 2688680.782, 13652515.292 2753408.109, 13663805.89...>,
 <LINESTRING (13571147.226 2475246.867, 13570455.046 2474367.56, 13568041.334...>,
 <LINESTRING (13358192.816 2153792.267, 13357807.233 2153114.823, 13356523.94...>,
 <LINESTRING (13253844.382 1808071.354, 13253837.587 1804722.766, 13253835.03...>,
 <LINESTRING (13195657.119 1221510.362, 13197233.42 1224320.29, 13198671.285 ...>,
 <LINESTRING (12862310.992 798944.642, 12869707.548 807745.865, 12871348.396 ...>,
 <LINESTRING (12444913.859 379653.954, 12447959.45 379987.789, 12450069.112 3...>]
# 创建地图投影
crs = ccrs.LambertConformal(central_longitude=105, central_latitude=35, standard_parallels=(30, 60))
# 创建子图
fig, ax = plt.subplots(figsize=(16, 9), subplot_kw={'projection': crs})
# 绘制边界
ax.add_geometries(country_CN['geometry'], crs=ccrs.PlateCarree(), edgecolor='black', facecolor='none')
# 绘制九段线
for line in nine_dotted_line['geometry'].tolist():
    ax.add_geometries(line, crs=ccrs.PlateCarree(), edgecolor='black', facecolor='none')
# 设置地图范围
ax.set_extent([73, 135, 2.5, 53], crs=ccrs.PlateCarree())
# 显示图像
plt.show()

西安地图

city_CN.head()

| | ct_adcode | ct_name | pr_adcode | pr_name | cn_adcode | cn_name | geometry |
| 0 | 110100 | 北京城区 | 110000 | 北京市 | 100000 | 中华人民共和国 | POLYGON ((115.88575 40.21880, 115.88619 40.219... |
| 1 | 120100 | 天津城区 | 120000 | 天津市 | 100000 | 中华人民共和国 | POLYGON ((117.84713 39.40774, 117.84725 39.407... |
| 2 | 130100 | 石家庄市 | 130000 | 河北省 | 100000 | 中华人民共和国 | POLYGON ((113.83957 38.75839, 113.84087 38.757... |
| 3 | 130200 | 唐山市 | 130000 | 河北省 | 100000 | 中华人民共和国 | MULTIPOLYGON (((118.27675 38.98087, 118.27262 ... |

4 130300 秦皇岛市 130000 河北省 100000 中华人民共和国 MULTIPOLYGON (((119.43834 39.78659, 119.43843 ...
xiann = city_CN[city_CN['ct_name']=='西安市']
xiann

| | ct_adcode | ct_name | pr_adcode | pr_name | cn_adcode | cn_name | geometry |

307 610100 西安市 610000 陕西省 100000 中华人民共和国 MULTIPOLYGON (((109.16775 33.80217, 109.16661 ...
# 获取几何形状的边界坐标  
bounds = xiann['geometry'].bounds  
bounds

| | minx | miny | maxx | maxy |

307 107.663753 33.693877 109.822432 34.743103
# 创建地图投影
crs = ccrs.LambertConformal(central_longitude=107.94, central_latitude=33.94, standard_parallels=(34, 60))
# 创建子图
fig, ax = plt.subplots(figsize=(8, 8), subplot_kw={'projection': crs})
ax.add_geometries(xiann['geometry'], crs=ccrs.PlateCarree(), edgecolor='black', facecolor='none')
# 设置地图范围
ax.set_extent([bounds['minx'], bounds['maxx'], bounds['miny'], bounds['maxy']], crs=ccrs.PlateCarree())
# 显示图像,为毛就不能大一点地图?
plt.show()

标记点

center = df_pcenter[df_pcenter['城市名']=='西安']
lon = float(center['经度'].values[0])
lat = float(center['纬度'].values[0])
# 创建地图投影
crs = ccrs.LambertConformal(central_longitude=107.94, central_latitude=33.94, standard_parallels=(34, 60))
# 创建子图
fig, ax = plt.subplots(figsize=(8, 8), subplot_kw={'projection': crs})
ax.add_geometries(xiann['geometry'], crs=ccrs.PlateCarree(), edgecolor='black', facecolor='none')
# 在地图上绘制红色地点标记
ax.scatter(lon, lat, color='red', s=50, transform=ccrs.PlateCarree())
# 设置地图范围
ax.set_extent([bounds['minx'], bounds['maxx'], bounds['miny'], bounds['maxy']], crs=ccrs.PlateCarree())
# 显示图像,为毛就不能大一点地图?
plt.show()
相关推荐
弱冠少年12 小时前
websockets库使用(基于Python)
开发语言·python·numpy
A_lvvx2 天前
07_矩形圆形绘制
开发语言·python·numpy
星霜旅人2 天前
Python数据分析篇--NumPy--进阶
python·数据分析·numpy
敲代码不忘补水4 天前
Python NumPy 数据分析:处理复杂数据的高效方法
python·数据分析·numpy
Thetoicxdude5 天前
[Day 80] 區塊鏈與人工智能的聯動應用:理論、技術與實踐
人工智能·web3·numpy
Thetoicxdude5 天前
[Day 82] 區塊鏈與人工智能的聯動應用:理論、技術與實踐
人工智能·web3·numpy
凭栏落花侧5 天前
数据预处理:数据挖掘的第一步
人工智能·python·数据挖掘·conda·numpy·pandas·pip
cndes7 天前
Numpy 和 Pandas的区别与高效协同
numpy·pandas
跟德姆(dom)一起学AI7 天前
0基础跟德姆(dom)一起学AI 数据处理和统计分析08-日期类型处理,Matplotlib介绍
开发语言·人工智能·python·信息可视化·numpy·matplotlib
deephub8 天前
8种数值变量的特征工程技术:利用Sklearn、Numpy和Python将数值转化为预测模型的有效特征
人工智能·python·机器学习·numpy·sklearn·特征工程