摘要: Shapefile 是一种以矢量格式表示地理数据的文件格式。Shapefile 定义点、线和多边形,shapefile 格式由 ESRI 开发,通常称为 ESRI shapefile。Shapefile 并不是表示矢量数据的唯一方法。Geopackages、...
Shapefile 是一种以矢量格式表示地理数据的文件格式。Shapefile 定义点、线和多边形,shapefile 格式由 ESRI 开发,通常称为 ESRI shapefile。Shapefile 并不是表示矢量数据的唯一方法。Geopackages、GeoJSON、KML、CSV 和数据库结构也可以有效地表示矢量数据。本文将具体演示如何在 QGIS 中创建和编辑 shapefile。
许多工具都会创建 shapefile,但通常需要的是创建一个空白 shapefile。这在 QGIS 中很容易做到。使用 “New Shapefile Layer” 工具在 QGIS 中创建一个新的 shapefile。
- 从主菜单中选择“图层”>“创建图层”>“新建 Shapefile 图层”。
- 设置 shapefile 的文件名。
- 选择几何类型(点、线或多边形)。
- 选择适当的坐标参考系(EPSG:4326 - WGS 84 是一个不错的通用选择)。
- 添加所需的字段(即列),这些将出现在属性表中。 如果需要,可随时添加字段。
- 单击“确定”创建 shapefile。
这将创建一个不包含任何功能的空 shapefile(有关如何创建 shapefile 的信息,请参阅下图)。接下来将描述如何向 shapefile 添加特征。
Shapefile 创建选项。
在 QGIS 中将功能添加到 Shapefile
现在已经有了一个 shapefile,需要向其中添加功能。
使用“数字化工具栏”在 QGIS 中添加或编辑要素,它看起来如下图所示(但某些选项可能呈灰色)。如果没有看到它,请从“视图”>“工具栏”将其添加到界面。
- 单击“图层”面板中的 shapefile 图层
- 单击数字化工具栏中的切换编辑按钮(铅笔图标)
- 单击数字化工具栏中的添加 几何 功能
- 左键单击地图画布以创建点(或直线或多边形的顶点) 如果要创建一条线或多边形, 则需要右键单击才能完成该要素(对于生成的值,可跳过此步骤,或将值设置为 NULL)
- 根据提示输入字段信息
- 单击“确定”保存该功能
- 在数字化工具栏上选择“保存图层编辑”
- 关闭编辑
现在已将特征添加到 shapefile 中,并且这些特征已保存到磁盘中。您将能够访问任何可以读取 shapefile 的程序中的数据和功能。
使用 QGIS 创建 Shapefile 的其他方法
除了创建空 shapefile 之外,QGIS 还有其他方法从其他格式导入数据。
在表格文件中显示地理数据。在 QGIS 中,可以显示来自分隔文本文件(例如 CSV)的地理数据。选择“图层”>“添加图层”>“添加分隔文本图层”。指定 X、Y 列(或 WKT 几何定义列),然后单击“确定”将数据添加到地图。
从不同的矢量格式创建 shapefile。如果有其他矢量格式的文件,例如 geopackage、geojson、kml 等,可以在“图层”面板中右键单击该文件,然后选择“导出”>“要素另存为”,然后选择输出文件类型为 ESRI Shapefile。
QGIS 处理工具和插件。许多处理工具和插件会根据给定的输入参数创建具有不同表示形式的 shapefile。例如,QGIS 有多种工具可以以各种方式创建随机点。
在 QGIS 中使用 Python 创建 Shapefile
QGIS Python API 还支持创建 shapefile。Python API 非常强大,因为可以自动创建 shapefile。
使用 Python API 创建 shapefile 有多种不同的方法。第一种是将特征直接写入文件。下面的代码对此进行了演示。
# create fields<font></font>
layerFields = QgsFields()<font></font>
layerFields.append(QgsField('ID', QVariant.Int))<font></font>
layerFields.append(QgsField('Value', QVariant.Double))<font></font>
layerFields.append(QgsField('Name', QVariant.String))<font></font>
<font></font>
# set the file name<font></font>
fn = 'C:/temp/newpoints.shp'<font></font>
<font></font>
# create the shapefile<font></font>
writer = QgsVectorFileWriter(fn, 'UTF-8', layerFields,QgsWkbTypes.Point, QgsCoordinateReferenceSystem('EPSG:26912'), 'ESRI Shapefile')<font></font>
<font></font>
# create a feature and add geometry<font></font>
feat = QgsFeature()<font></font>
feat.setGeometry(QgsGeometry.fromPointXY(QgsPointXY(455618, 4632221)))<font></font>
<font></font>
# set attribute values for the feature<font></font>
feat.setAttributes([1, 1.1, 'one'])<font></font>
<font></font>
# add the feature to the shapefile<font></font>
writer.addFeature(feat)<font></font>
<font></font>
# add the layer to the QGIS interface<font></font>
layer = iface.addVectorLayer(fn, '', 'ogr')<font></font>
<font></font>
del(writer)
在第二个示例中,将把特征写入层(在内存中),然后将该层写入文件,此示例还展示了创建字段的不同方法。
lyr = QgsVectorLayer("Point", "my_point", "memory")<font></font>
id_field = QgsField("ID", QVariant.Int)<font></font>
layer.dataProvider().addAttributes([id_field])<font></font>
lyr.updateFields()<font></font>
<font></font>
feat = QgsFeature()<font></font>
feat.setAttributes([1])<font></font>
<font></font>
point = QgsGeometry.fromPointXY(QgsPointXY(455618, 4632221))<font></font>
feat.setGeometry(point)<font></font>
<font></font>
error_code = QgsVectorFileWriter.writeAsVectorFormat(layer, "/path/to/shapefile.shp", "utf-8", QgsCoordinateReferenceSystem('EPSG:26912'), "ESRI Shapefile")<font></font>
if error_code == QgsVectorFileWriter.NoError:<font></font>
print("Shapefile created!")<font></font>
else:<font></font>
print("Problem with shapefile creation")
shapefile 将在指定的路径中创建。
现在您是在 QGIS 中创建 shapefile 的专家了!去搞点数据吧!