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()