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.