当前位置: 首页 > news >正文

【QGIS_Python】在QGIS的Python控制台生成SHP格式点数据并显示标注

参考文章: 「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)} 个省会城市坐标点")

结果示例:

相关文章:

  • ZigMa:一种DiT风格的Zigzag Mamba扩散模型
  • Stream 流中 flatMap 方法详解
  • ADB简单入门
  • Verilog-HDL/SystemVerilog/Bluespec SystemVerilog vscode 配置
  • 一、蓝绿、灰度、滚动发布有什么不同
  • 网络安全攻防万字全景指南 | 从协议层到应用层的降维打击手册(全程图表对比,包你看到爽)
  • 内存高级话题
  • 如何根据 CUDA 配置安装 PyTorch 和 torchvision(大模型 环境经验)
  • C++学习之nginx+fastDFS
  • 详解Springboot的启动流程
  • 【HarmonyOS NEXT】关键资产存储开发案例
  • 纯内网环境安装1Panel面板与商店应用
  • 版本控制器Git ,Gitee如何连接Linux Gitee和Github区别
  • 信号的捕捉(操作部分)
  • 在linux上启动微服务
  • 前端模块化
  • Kubernetes学习笔记-项目简单部署
  • C语言复习笔记--数组
  • 网络编程之解除udp判断客户端是否断开
  • 调研报告:Hadoop 3.x Ozone 全景解析
  • 30平米的无障碍酒吧里,我们将偏见折叠又摊开
  • 哪种“网红减肥法”比较靠谱?医学专家和运动专家共同解答
  • 上海市重大工程一季度开局良好,崇明线等按既定计划加快建设
  • 国务院关税税则委员会公布公告调整对原产于美国的进口商品加征关税措施
  • 汇源果汁发文:经营情况一切正常
  • 时代中国控股:前4个月销售额18.1亿元,境外债重组协议押后聆讯至5月底