如何在PyQGIS中获取shapefile几何类型?

7 投票
3 回答
9890 浏览
提问于 2025-04-18 17:04

我正在写一个脚本,这个脚本需要知道加载的shapefile的几何类型。

但是我查阅了pyqgis的手册和API,还是搞不清楚怎么去调用它。

实际上,我在理解API方面也遇到了困难,所以如果能对这个话题提供一些帮助,我会非常感激。

谢谢你!

3 个回答

1

QgsGeometry 有一个叫做 wkbType的方法,它可以返回你想要的信息。

5

我在寻找一种方法,可以把几何图形的类型以字符串形式表示,经过了很多很多的搜索,终于在文档中找到了一个简单的方法:

geomTypeString=qgis.core.QgsWkbTypes.displayString(int(layer.wkbType()))

这个方法可以返回 'Point'(点)、'LineString'(线)、'Polygon'(多边形)、'MultiPoint'(多点)等,它能“识别”QGIS中所有的几何类型。

不过为了我的需求,我在处理 'Point25D' 和其他一些奇怪的类型时遇到了一些麻烦,所以我添加了一些限制,只保留平面上的类型(点、线、多边形)。

geomFlatTypeString=qgis.core.QgsWkbTypes.displayString(int(
    qgis.core.QgsWkbTypes.flatType(int(in_layer.wkbType()))))

顺便说一下,我的目标是创建一个内存层的副本,不管原始层是什么类型,这里是完整的代码:

def copyLayer(in_layer,condition=None):
    #condition=function to test features and return True or False______
    if condition==None:
        def condition(f):
            return True
    typeGeom=qgis.core.QgsWkbTypes.displayString(int(
        qgis.core.QgsWkbTypes.flatType(int(in_layer.wkbType()))))
    crsId=in_layer.crs().authid()
    out_layer=QgsVectorLayer(typeGeom+"?crs="+crsId,
                             in_layer.name()+"_copie",
                             "memory")
    fields=in_layer.dataProvider().fields().toList()
    out_layer.dataProvider().addAttributes(fields)
    out_layer.updateFields()
    features=[f for f in in_layer.getFeatures() if condition(f)]
    out_layer.dataProvider().addFeatures(features)
    return out_layer
10

这个命令很简单:

layer=qgis.utils.iface.mapCanvas().currentLayer()

if layer.wkbType()==QGis.WKBPoint:
    print 'Layer is a point layer'

if layer.wkbType()==QGis.WKBLineString:
    print 'Layer is a line layer'

if layer.wkbType()==QGis.WKBPolygon:
    print 'Layer is a polygon layer'

if layer.wkbType()==QGis.WKBMultiPolygon:
    print 'Layer is a multi-polygon layer'

if layer.wkbType()==100:
    print 'Layer is a data-only layer'

你可以用数字(1,2,3,4)来代替 QGis.WKB**** 这种写法,但上面提到的方式写出来的代码更容易阅读。

在手册中的具体参考可以在这里找到: http://docs.qgis.org/testing/en/docs/pyqgis_developer_cookbook/geometry.html

撰写回答