4 votos

Extraer x, y, z de todos los nodos / vértices de un shapefile de polígono único en un archivo de texto.

Quiero guardar todas las coordenadas x, y, z de todos los nodos (vértices) de un shapefile polígono a un archivo de texto mediante programación Python en QGIS Python Console.

import ogr, os, sys
fn = r'E:\Sreeraj\Thailand\Level 0\Thailand.shp'
driver = ogr.GetDriverByName('ESRI Shapefile')
ds = ogr.Open(fn) 
numLayers = ds.GetLayerCount()
print 'The file contains ', numLayers, ' Layers'
layer = ds.GetLayer(0)
print layer.GetName(), ' contains ', layer.GetFeatureCount(), ' features'
f=layer.GetFeatureCount()
v=0
s=1
file = open(r'E:\Sreeraj\Thailand\Thailand_Level 0.txt','w')
file.write('Sl No' '\t' 'X' '\t' 'Y' '\t' 'Z' '\t' 'Polygon ID' '\n')
for v in range(f):
    feature= layer.GetFeature(v)
    geometry= feature.GetGeometryRef()
    print ' Feature contains the Geometry', geometry.GetGeometryName()
    print ' It contains', geometry.GetGeometryCount(), geometry.GetGeometryName()
    ring = geometry.GetGeometryRef(r)
    print geometry.GetGeometryName(), ' contains the Geometry', ring.GetGeometryName()
    print ' It contains', ring.GetPointCount(), ' points in a ', ring.GetGeometryName()
    pointsX = []; pointsY = []; pointsZ = []
    numpoints = ring.GetPointCount()
    for p in range(numpoints):
        lon, lat, z = ring.GetPoint(p)
        pointsX.append(lon)
        pointsY.append(lat)
        pointsZ.append(z)
        x = [str(s), '\t', str(lon), '\t', str(lat), '\t', str(z), '\t', str(v), '\n']
        file.writelines(x)
        s=s+1

Por lo tanto, he dado más arriba el código python completo. Esto está funcionando perfectamente para la extracción de los nodos / vértices de Tailandia estados, distritos, etc.

Pero, cuando tengo un shapefile (aquí, Thailand.shp) con sólo 1 único polígono, que es la frontera del país; entonces este código no funciona. No estoy recibiendo ningún error, pero tampoco estoy recibiendo la salida x, y, z coordenadas de cada nodo de este shapefile frontera del país en particular, que es sólo un único polígono.

A continuación se muestra la salida que estoy recibiendo.

The file contains  1  Layers
Thailand  contains  1  features
Feature contains the Geometry MULTIPOLYGON
It contains 595 MULTIPOLYGON
MULTIPOLYGON  contains the Geometry POLYGON
It contains 0  points in a  POLYGON

Y estoy recibiendo la salida de archivo de texto que está vacío.

Este código python anterior no funciona sólo en el caso del shapefile de límites de países (polígono único). Si tomo un shapefile con todos los estados, distritos de Tailandia; entonces el código anterior está trabajando.

Cuando probé este mismo código para el shapefile de los estados, obtuve el resultado que se muestra a continuación y todos los valores x,y,z de todos los nodos se guardaron en el archivo de texto de salida.

The file contains  1  Layers
THA_Adm1_GISTA_plyg_v5  contains  77  features
Feature contains the Geometry MULTIPOLYGON
It contains 2 MULTIPOLYGON
MULTIPOLYGON  contains the Geometry POLYGON
It contains 0  points in a  POLYGON
Feature contains the Geometry POLYGON
It contains 1 POLYGON
POLYGON  contains the Geometry LINEARRING
It contains 25015  points in a  LINEARRING
Feature contains the Geometry POLYGON
It contains 1 POLYGON
POLYGON  contains the Geometry LINEARRING
It contains 16116  points in a  LINEARRING
Feature contains the Geometry POLYGON
It contains 1 POLYGON
POLYGON  contains the Geometry LINEARRING
It contains 41120  points in a  LINEARRING
Feature contains the Geometry POLYGON
It contains 1 POLYGON
POLYGON  contains the Geometry LINEARRING
It contains 33636  points in a  LINEARRING
Feature contains the Geometry POLYGON
It contains 1 POLYGON
POLYGON  contains the Geometry LINEARRING
It contains 16774  points in a  LINEARRING
Feature contains the Geometry POLYGON
It contains 1 POLYGON
POLYGON  contains the Geometry LINEARRING
It contains 19105  points in a  LINEARRING
Feature contains the Geometry MULTIPOLYGON
It contains 155 MULTIPOLYGON
MULTIPOLYGON  contains the Geometry POLYGON
It contains 0  points in a  POLYGON
Feature contains the Geometry POLYGON
It contains 1 POLYGON
POLYGON  contains the Geometry LINEARRING
It contains 8501  points in a  LINEARRING
..........................................................
// and many lines of outputs like this. This is correct. 

Sin embargo, para el archivo shapefile de límites (polígono único), no obtengo resultados.

1voto

kayplex Puntos 16

La solución a este problema es utilizar la herramienta Multiparts to Singleparts para convertir el archivo shape actual de límites multipoligonales en un archivo shape poligonal. A continuación, tome este shapefile de salida de la frontera del país como entrada para el programa python. A continuación, el programa python se ejecutará correctamente.

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