Ya que mencionaste que tenías acceso a docker, puedes utilizar esta imagen postgis para limpiar/exportar sus geometrías en un solo docker run
comando:
docker run -it --rm -e POSTGRES_PASSWORD=mysecretpassword \
--mount type=bind,source=<host_shapefile_location>,target=/tmp/shapedir \
mdillon/postgis bash -c "
apt-get update && apt-get install gdal-bin && tee /docker-entrypoint-initdb.d/z.sh <<EOF
psql -c $'CREATE DATABASE ogr WITH TEMPLATE = 'template_postgis''
ogr2ogr -f 'PostgreSQL' -a_srs 'EPSG:<YOUR_SRID>' PG:'host=localhost user=postgres dbname=ogr password=mysecretpassword' /tmp/shapedir/myshp.shp -nlt MULTIPOLYGON -lco GEOMETRY_NAME=geom -nln myshp
ogr2ogr -overwrite -f 'ESRI Shapefile' /tmp/shapedir/output.shp PG:'host=localhost user=postgres dbname=ogr password=mysecretpassword' -sql 'SELECT myfield, st_collectionextract(st_makevalid(st_buffer(st_makevalid(geom),0)),3) FROM myshp'
EOF
/docker-entrypoint.sh postgres"
Este comando hace lo siguiente:
- Bind monta el directorio del host que contiene el shapefile en /tmp/shapedir en el contenedor.
- Instala GDAL "vainilla" en el contenedor.
- Crea una base de datos Postgis adecuada para procesar el shapefile.
- Utiliza ogr2ogr para importar el shapefile en la base de datos recién creada (y coacciona la geometría a MULTIPOLYGON en aras de la simplicidad y la cordura)
- Limpia las geometrías mediante
st_makevalid(geom)
y st_buffer(geom,0)
y luego aplica st_collectionextract(geom,3)
para garantizar que sólo se devuelvan los multipolígonos.
- Exporta la geometría limpiada al directorio anfitrión especificado.
Una vez que su shapefile limpio se haya exportado con éxito, sólo tiene que ctrl +c
en su terminal para detener y eliminar el contenedor temporal.
Nota: Asegúrese de proporcionar explícitamente el código EPSG correcto a través de a_srs
-OGR no es bueno para autodetectarlo. Puede buscar la proyección correcta pegando el contenido del archivo .prj aquí
0 votos
Conozco la solución PostGIS, pero requiere algunos pasos adicionales para su configuración.