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()
[,
,
,
,
,
,
,
,
,
]
# 创建地图投影
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()