Как получить тип геометрии шейп-файла в PyQGIS?

Я пишу сценарий, который зависит от знания типа геометрии загруженного шейп-файла. но я просмотрел кулинарную книгу и API pyqgis и не могу понять, как это назвать.

на самом деле, у меня проблемы с интерпретацией API, поэтому любой свет, пролитый на эту тему, будет оценен.

Спасибо


person Steven Lutz    schedule 12.08.2014    source источник


Ответы (3)


Команда проста:

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

person PCamargo    schedule 14.08.2014
comment
У меня есть несколько шейп-файлов, полученных из ArcMap. Когда я печатаю их wkbType(), все они представляют собой числа, такие как 3001, 3002, 3003 и даже -2147483645, -2147483646 и -2147483647, но некоторые действительно равны 1 (соответствует точке) и 3 (соответствует многоугольнику). Как случилось такое исход? Это из-за конвертации или что-то еще? - person banbar; 17.07.2017
comment
Это правильно. Полный список существующих типов находится здесь: qgis.org/api/qgswkbtypes_8h_source.html (начиная с в строке 68). - person PCamargo; 18.07.2017

Ищете способ получить тип геометрии в строке и после долгих поисков, наконец, нашел чистый метод в документах:

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

это даст «Point», «LineString», «Polygon», «MultiPoint».... и знает все типы геометрии в Qgis.

Для моей цели у меня все еще были некоторые проблемы с «Point25D» и другими странными типами, поэтому я добавил это, чтобы ограничить его плоскими (Point, Line, Poly)

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

Для Info целью был метод, который создает дубликат слоя памяти любого типа, вот полный код:

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
person gui3    schedule 22.08.2017
comment
в QGIS 3 кажется QgsWkbTypes (регистр немного отличается). - person Florian H.; 02.03.2020

QgsGeometry имеет метод wkbType, который возвращает то, что вы хотите.

person lcoandrade    schedule 12.04.2015