1 votos

Crear un Shapefile ESRI a partir de WKT con OGR

Quiero crear un ESRI Shapefile capa de un CSV archivo. En mi CSV Tengo varios atributos (texto, numéricos) y geometría en WKT estilo. Tengo un problema con el campo de geometría que se trunca a un campo de cadena (254 caracteres), porque no sé cómo declararlo.

Cómo crear ESRI Shapefile datos geométricos de WKT con ogr ? ogr.CreateGeometryFromWkt() ¿no es el buen camino?

Tal vez con operadores de formato de cadena ?

Archivo fuente CSV:

serialnumber;name;objectnumber;city;geom
034002002;Peter;1;34086;POLYGON ((676923.736 6265215.412,676954.294 ... )) 
034002003;John;2;34284;POLYGON ((678870.753 6264475.605,678867.203 ... )) 
034002004;Steeve;3;34086;POLYGON ((678001.823 6264195.123,677975.609 ... ))

He encontrado este método que explican cómo analizar un archivo delimitado CSV para crear un ESRI Shapefile . Estoy usando Python 3.7.4 y GDAL 2.3.3.

Script en Python:

# -*- coding: utf-8 -*-    
import osgeo.ogr as ogr
import osgeo.osr as osr
import csv
import os
os.environ['GDAL_DATA'] = os.environ['CONDA_PREFIX'] + r'\Library\share\gdal'
os.environ['PROJ_LIB'] = os.environ['CONDA_PREFIX'] + r'\Library\share'

myInput = 'input.csv'

with open(myInput, 'r', encoding='utf-8') as csv_file:
    reader = csv.DictReader(csv_file, delimiter=';', quotechar='"')

    # set up the shapefile driver
    driver = ogr.GetDriverByName("ESRI Shapefile")

    # create the data source
    data_source = driver.CreateDataSource("output.shp")

    # create the spatial reference
    srs = osr.SpatialReference()
    srs.ImportFromEPSG(2154)

    # create the layer
    layer = data_source.CreateLayer("output", srs, ogr.wkbPolygon)

    # Add the fields we're interested in
    field_serialnumber = ogr.FieldDefn("serialnumber", ogr.OFTString)
    field_serialnumber.SetWidth(9)
    layer.CreateField(field_serialnumber)
    field_name = ogr.FieldDefn("name", ogr.OFTString)
    field_name.SetWidth(50)
    layer.CreateField(field_name)
    layer.CreateField(ogr.FieldDefn("objectnumber", ogr.OFTInteger))
    field_city = ogr.FieldDefn("city", ogr.OFTString)
    field_city.SetWidth(5)
    layer.CreateField(field_city)
    layer.CreateField(ogr.FieldDefn("geom"))

    # Process the text file and add the attributes and features to the shapefile
    for row in reader:
        # create the feature
        feature = ogr.Feature(layer.GetLayerDefn())
        # Set the attributes using the values from the delimited text file
        feature.SetField("serialnumber", row['serialnumber'])
        feature.SetField("name", row['name'])
        feature.SetField("objectnumber", row['objectnumber'])
        feature.SetField("city", row['city'])
        feature.SetField("geom", row['geom'])

        # create the WKB for the feature using Python string formatting
        wkt = (row['geom'])
        polygon = ogr.CreateGeometryFromWkt(wkt)

        # Set the feature geometry using the point
        feature.SetGeometry(polygon)

        # Create the feature in the layer (shapefile)
        layer.CreateFeature(feature)

        # Dereference the feature
        feature = None

        # Save and close the data source
        data_source = None

PS: QGIS es capaz de traducir mi CSV a una capa cuando lo importo como capa de origen delimitada, por lo que estoy seguro de que estos datos son válidos.

2voto

Cristy Puntos 153

¡Ya lo tengo! Fue un problema de identificación con la última instrucción que guardar y cerrar la fuente de datos, debe estar fuera de la for bucle. También he eliminado mi campo geom en el ESRI Shapefile No lo necesito. Una respuesta completa para @Ian Turton : Estoy usando DictReader para acceder a mis campos por sus nombres, que es una forma más fácil que los índices (si lo he entendido bien).

He aquí una sintaxis correcta :

# -*- coding: utf-8 -*-    
import osgeo.ogr as ogr
import osgeo.osr as osr
import csv
import os
os.environ['GDAL_DATA'] = os.environ['CONDA_PREFIX'] + r'\Library\share\gdal'
os.environ['PROJ_LIB'] = os.environ['CONDA_PREFIX'] + r'\Library\share'

myInput = 'input.csv'

with open(myInput, 'r', encoding='utf-8') as csv_file:
    reader = csv.DictReader(csv_file, delimiter=';', quotechar='"')

    # set up the shapefile driver
    driver = ogr.GetDriverByName("ESRI Shapefile")

    # create the data source
    data_source = driver.CreateDataSource("output.shp")

    # create the spatial reference
    srs = osr.SpatialReference()
    srs.ImportFromEPSG(2154)

    # create the layer
    layer = data_source.CreateLayer("output", srs, ogr.wkbPolygon)

    # Add the fields we're interested in
    field_serialnumber = ogr.FieldDefn("serialnumber", ogr.OFTString)
    field_serialnumber.SetWidth(9)
    layer.CreateField(field_serialnumber)
    field_name = ogr.FieldDefn("name", ogr.OFTString)
    field_name.SetWidth(50)
    layer.CreateField(field_name)
    layer.CreateField(ogr.FieldDefn("objectnumber", ogr.OFTInteger))
    field_city = ogr.FieldDefn("city", ogr.OFTString)
    field_city.SetWidth(5)
    layer.CreateField(field_city)        

    # Process the text file and add the attributes and features to the shapefile
    for row in reader:
        # create the feature
        feature = ogr.Feature(layer.GetLayerDefn())
        # Set the attributes using the values from the delimited text file
        feature.SetField("serialnumber", row['serialnumber'])
        feature.SetField("name", row['name'])
        feature.SetField("objectnumber", row['objectnumber'])
        feature.SetField("city", row['city'])

        # create the WKT for the feature using Python string formatting
        wkt = (row['geom'])
        polygon = ogr.CreateGeometryFromWkt(wkt)

        # Set the feature geometry using the point
        feature.SetGeometry(polygon)

        # Create the feature in the layer (shapefile)
        layer.CreateFeature(feature)

        # Dereference the feature
        feature = None

    # Save and close the data source
    data_source = None

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