【地理信息可视化】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()
相关推荐
小锋学长生活大爆炸5 小时前
【教程】Cupy、Numpy、Torch互相转换
pytorch·numpy·cupy
鱼灯几许2 天前
Python爬虫
爬虫·python·numpy
爱折腾的小码农2 天前
记一次宝塔centos出现Failed to start crond.service: Unit crond.service not found.解决
python·centos·numpy
正义的彬彬侠5 天前
XGBoost算法Python代码实现
python·决策树·机器学习·numpy·集成学习·boosting·xgboost
竹笋常青6 天前
《流星落凡尘》
django·numpy
西柚小萌新7 天前
七.numpy模块
numpy
FreedomLeo19 天前
Python数据分析NumPy和pandas(二十三、数据清洗与预处理之五:pandas的分类类型数据)
python·数据分析·numpy·pandas·categoricals·数据分类分析·建模和机器学习
Kalika0-010 天前
NumPy Ndarray学习
python·学习·numpy
上海亚商投顾11 天前
上海亚商投顾:沪指缩量调整 华为概念股午后爆发
numpy
表示这么伤脑筋的题我不会12 天前
请用python写一段训练模型【InsCode AI 创作助手】
python·numpy