參考文章:?「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)} 個省會城市坐標點")
結果示例: