7 votos

¿Cómo identificar punto de polígono shapefiles en python?

Tengo un script que realiza diversas funciones en los shapefiles, la mayoría de los cuales son polígono base. Sin embargo, algunos archivos son en base a puntos y tengo que especificar donde estos archivos están editando el script. Hay una técnica en python que permite que la secuencia de comandos para identificar cuales son los shapefiles de los polígonos, que son los puntos, y ejecutar las funciones necesarias. Me han proporcionado un fragmento (de pruebas) de mi script por debajo de la cual se concentra principalmente en el polígono shapefiles y me han comentado que la última línea de código que incluye la función que uso para el punto de shapefiles.

Algún consejo/orientación son más que bienvenidos como todavía estoy aprendiendo mi camino a través de python.

Estoy usando QGIS 2.6.0.

##Test=name
import os
import glob
from os.path import expanduser
home = expanduser("~")

#   Folder path of the directory and the "Results" folder
path_dir = home + "\Desktop\Test\\"
path_res = path_dir + "Results\\"

def run():
#   Set directory and search for all .shp files
    os.chdir(path_dir + "Shapefiles\\")
    for fname in glob.glob("*.shp"): 
#   Clip .shp files with the polygon shapefile "Grid.shp" and save files to Result folder (How to specify this for polygons only?)
        polygon_output=processing.runalg("qgis:clip", path_dir + "Grid.shp", fname, path_res  + "/"+ fname)
#   (How to identify point shapefiles and run the following command?)
#        point_output=processing.runalg("qgis:distancetonearesthub", path_dir + "Grid.shp", fname, 'HubName', 0, 0, path_res  + "/"+ fname)
run()

EDITAR:

Gracias a la ayuda de todos, me las arreglé para conseguir un guión de trabajo (a pesar de que todo el código podría ser mejorado enormemente!).

##Test=name
import os
import glob
from qgis.core import *
from os.path import expanduser
home = expanduser("~")

#   Folder path of the Results for shapefiles
path_dir = home + "\Desktop\Test\\"
path_res = path_dir + "Results\\"

def run():
#   Set directory and search for all polygon .shp files
    os.chdir(path_dir + "Shapefiles\\")
    for fname in glob.glob("*.shp"): 
        shapefile = QgsVectorLayer( os.chdir(path_dir + "Shapefiles\\"), fname, "ogr" )
        print shapefile.geometryType()

#   Clip .shp files with the polygon shapefile "Grid.shp" and save files to Result folder
        if shapefile.geometryType() == 3:
            polygon_output=processing.runalg("qgis:clip", path_dir + "Grid.shp", fname, path_res  + "/"+ fname)

#   Use Distance to nearest hub function on point.shp files with the polygon shapefile "Grid.shp" as Hub layer and save files to Result folder  
        if shapefile.geometryType() == 3:
            point_output=processing.runalg("qgis:distancetonearesthub", path_dir + "Grid.shp", fname, 'HubName', 0, 0, path_res  + "/"+ fname)
run()

4voto

Steven Parkes Puntos 625

Necesita abrirlo como unQgsVectorLayer

 layer = QgsVectorLayer('/path/to/shapefile_folder/test.shp', 'test', 'ogr')

QgsVectorLayer los objetos tienen un método llamado geometryType . Si llama a ese método de la capa recién creada:

>>> print layer.geometryType()
2

Donde 0 puntos, 1 es líneas y 2 polígonos

3voto

rkthkr Puntos 6651

Supongo que la "correcta" es la utilización de QGIS' API que me espero que expondrían. Pero no sé cómo hacerlo.


Una alternativa es buscar sin el shapefile de sí mismo. Los fundamentos de la especificación en la Wikipedia: https://en.wikipedia.org/wiki/Shapefile#Shapefile_shape_format_.28.shp.29

Lo que quiero es: bytes 32–35 de la cabecera principal que dicta lo que el tipo de geometría. Los valores de este son enteros y debe ser:

Value Shape Type
0 Null Shape
1 Point
3 PolyLine
5 Polygon
8 MultiPoint
11 PointZ
13 PolyLineZ
15 PolygonZ
18 MultiPointZ
21 PointM
23 PolyLineM
25 PolygonM
28 MultiPointM
31 MultiPatch

Así que todo lo que necesita hacer es analizar el encabezado del archivo en Python para determinar aquellos.

Para referencia, el oficial Shapefile "Especificación" (en realidad, un papel en blanco) es: http://www.esri.com/library/whitepapers/pdfs/shapefile.pdf

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X