环境和数据准备
安装 gma:
pip install gma
本文基于:gma 2.1.6,Python 3.12
本文用到的OSM矢量数据为:
链接: https://pan.baidu.com/s/1GEQbOFnTAlSHGa7erdxFDA?pwd=86mb
提取码: 86mb
本文用到的洛阳市区县范围矢量数据l来源于:
https://www.shengshixian.com/
绘制全市
import matplotlib.pyplot as plt
from gma.map import inres, plot
from gma import io
import numpy as np
np.random.seed(0)
xian = io.ReadVector(r"2024\县级\T2024年初县级.shp")
luoyang = xian.SelectWhere('地级 = "洛阳市"')
gdb = io.Open("OSM_洛阳.gdb")
radColors = {
'gis_osm_landuse_a_free_1': '#EEE8AA',
'gis_osm_pois_a_free_1': '#7CCD7C',
'gis_osm_railways_free_1': 'black',
'gis_osm_water_a_free_1': '#87CEFA',
'gis_osm_waterways_free_1': '#87CEFA',
} ## 定义部分图层的颜色
newly = luoyang.Dissolve()
newBou2 = newly.Boundary
############################################################# 绘制内容
MapF = plot.MapFrame(BaseMapProj = 3857, Extent = newBou2)
MapF.AddLayer(newly, FaceColor = '#F0FFF044', LineWidth = 0)
for layer in gdb.iteritems():
radFColor = radColors.get(layer.Name, np.random.uniform(size = 4))
radLColor = radColors.get(layer.Name, 'lightgray')
zo = 20 if 'Line' in layer.GeomType else None
MapF.AddLayer(layer, FaceColor = radFColor, LineColor = radLColor, PointSize=1, Zorder = zo)
MapF.AddLayer(newly, FaceColor = 'none', LineColor = 'black', LineWidth = 0.1)
############################################################# 绘制内容
MapF.Axes.set_title('洛阳市', fontdict={'family':'SimSun'}, y = 0.99)
plt.savefig("洛阳市.jpg", dpi = 300, bbox_inches = 'tight')
绘制7区7县
import matplotlib.pyplot as plt
from gma.map import inres, plot
from gma import io
import numpy as np
np.random.seed(0)
xian = io.ReadVector(r"2024\县级\T2024年初县级.shp")
luoyang = xian.SelectWhere('地级 = "洛阳市"')
gdb = io.Open("OSM_洛阳.gdb")
radColors = {
'gis_osm_landuse_a_free_1': '#EEE8AA',
'gis_osm_pois_a_free_1': '#7CCD7C',
'gis_osm_railways_free_1': 'black',
'gis_osm_water_a_free_1': '#87CEFA',
'gis_osm_waterways_free_1': '#87CEFA',
} ## 定义部分图层的颜色
newBou2 = luoyang.Boundary
for feature in luoyang:
fields = feature.FieldsInfo
name = fields.at[0, 'Values']
bou = feature.Boundary
newBou = [bou[0] - (bou[2] - bou[0]) * 0.2,
bou[1] - (bou[3] - bou[1]) * 0.2,
bou[2] + (bou[2] - bou[0]) * 0.2,
bou[3] + (bou[3] - bou[1]) * 0.2,
]
print(name, bou)
############################################################# 绘制内容
MapF = plot.MapFrame(BaseMapProj = 3857, Extent = newBou)
MapF.AddFeature(feature, FaceColor = '#F0FFF044', LineWidth = 0)
for layer in gdb.iteritems():
ply = layer.Clip(feature)
radFColor = radColors.get(layer.Name, np.random.uniform(size = 4))
radLColor = radColors.get(layer.Name, 'lightgray')
try:
MapF.AddLayer(ply, FaceColor = radFColor, LineColor = radLColor, PointSize=1)
except:
pass
MapF.AddFeature(feature, FaceColor = 'none', LineColor = 'black', LineWidth = 0.1)
############################################################# 绘制内容
MapF.Axes.set_title(name, fontdict={'family':'SimSun'}, y = 0.99)
############################################################# 鹰眼图
subBounds = [-0.1, 0.95, 0.4, 0.4]
subAxes = MapF.Axes.inset_axes(subBounds)
MapF2 = plot.MapFrame(Axes = subAxes, BaseMapProj = 3857, Extent = newBou2)
MapF2.AddFeature(feature, FaceColor = '#9BCD9B', LineWidth = 0)
MapF2.AddLayer(luoyang.Copy(), FaceColor = 'none', LineColor = 'gray')
############################################################# 鹰眼图
plt.savefig(f"{name}.jpg", dpi = 300, bbox_inches = 'tight')