参考文章: 「GIS教程」使用DeepSeek辅助QGIS快速制图 | 麻辣GIS
示例代码说明:使用参考文章中的省会城市坐标点,左侧增加一列城市序号code, 图层标注显示 code + 城市名称,同时在指定路径下生成对应SHP格式点数据。
import os
from qgis.core import QgsVectorLayer, QgsField, QgsFeature, QgsGeometry, QgsPointXY, QgsProject, QgsMarkerSymbol, QgsPalLayerSettings, QgsVectorLayerSimpleLabeling
from qgis.PyQt.QtCore import QVariant# 创建省会城市坐标字典(名称, 经度, 纬度)
capital_cities = {"北京": (116.4074, 39.9042), "天津": (117.1994, 39.0851), "石家庄": (114.4995, 38.0409),"太原": (112.5489, 37.8706), "呼和浩特": (111.7510, 40.8415), "沈阳": (123.4315, 41.8057),"长春": (125.3236, 43.8160), "哈尔滨": (126.5350, 45.8022), "上海": (121.4737, 31.2304),"南京": (118.7969, 32.0603), "杭州": (120.1551, 30.2741), "合肥": (117.2272, 31.8206),"福州": (119.2965, 26.0745), "南昌": (115.8581, 28.6829), "济南": (117.1205, 36.6510),"郑州": (113.6253, 34.7466), "武汉": (114.3054, 30.5928), "长沙": (112.9388, 28.2278),"广州": (113.2644, 23.1291), "南宁": (108.3663, 22.8176), "海口": (110.1999, 20.0440),"重庆": (106.5516, 29.5630), "成都": (104.0665, 30.5728), "贵阳": (106.6302, 26.6477),"昆明": (102.8329, 24.8801), "拉萨": (91.1406, 29.6455), "西安": (108.9398, 34.3416),"兰州": (103.8342, 36.0611), "西宁": (101.7778, 36.6173), "银川": (106.2309, 38.4872),"乌鲁木齐": (87.6168, 43.8256), "香港": (114.1694, 22.3193), "澳门": (113.5439, 22.1987),"台北": (121.5645, 25.0330)}# 定义输出 Shapefile 路径
output_dir = "C:/Users/QGIS/data/output" # 修改为你的输出目录
output_shp = os.path.join(output_dir, "provincial_capitals.shp")# 创建点图层
layer = QgsVectorLayer("Point?crs=EPSG:4326", "Provincial Capitals", "memory")
provider = layer.dataProvider()# 添加字段
provider.addAttributes([QgsField("code", QVariant.Int),QgsField("city", QVariant.String),QgsField("longitude", QVariant.Double),QgsField("latitude", QVariant.Double)])
layer.updateFields()# 添加要素
code = 1 # 从1开始编号
for city, (lon, lat) in capital_cities.items():feat = QgsFeature()feat.setGeometry(QgsGeometry.fromPointXY(QgsPointXY(lon, lat)))feat.setAttributes([code, city, lon, lat])provider.addFeature(feat)code += 1 # 编号递增# 设置符号样式
symbol = QgsMarkerSymbol.createSimple({'name': 'circle', 'color': 'red', 'size': '5.0'})
layer.renderer().setSymbol(symbol)# 添加标注设置
label_settings = QgsPalLayerSettings()
label_settings.isExpression = True # 启用表达式
label_settings.fieldName = "concat(code, ', ', city)" # 使用表达式拼接 code 和 city
label_settings.placement = QgsPalLayerSettings.AroundPoint
label_settings.enabled = True
# 设置字体样式
text_format = QgsTextFormat()
text_format.setFont(QFont("Arial", 20)) # 设置字体为 Arial,大小为 20
text_format.setColor(QColor("black")) # 设置字体颜色为黑色
label_settings.setFormat(text_format)labeler = QgsVectorLayerSimpleLabeling(label_settings)
layer.setLabeling(labeler)
layer.setLabelsEnabled(True)# 保存为 Shapefile
error = QgsVectorFileWriter.writeAsVectorFormat(layer, output_shp, "UTF-8", driverName="ESRI Shapefile")
if error[0] == QgsVectorFileWriter.NoError:print(f"Shapefile 已成功保存到: {output_shp}")
else:print(f"保存 Shapefile 时出错: {error[1]}")# 添加到地图(可选)
QgsProject.instance().addMapLayer(layer)
print(f"已成功加载 {len(capital_cities)} 个省会城市坐标点")
结果示例: