6 votos

La forma más rápida de convertir shapefile a postgis en java

He estado usando geoherramientas para leer archivos de forma e importarlos a postgis. Desafortunadamente, cuando se importan archivos grandes, esto lleva a un retraso masivo --8000% de shp2pgsql canalizado en pgsql-- que asumo que es causado mayormente por inserciones individuales de datos.

Asumiendo que la cantidad de tiempo que toma escribir las características en el vertedero no es excesivo, esto debería diezmar masivamente la exorbitante cantidad de tiempo requerida para importar el shapefile.

Mi plan es convertir todos los atributos de las características en filas de cadenas y luego usar la funcionalidad de copia en el jdbc para cargar los datos en masa -pero no conozco ninguna función en el jdbc o en cualquier otro lugar que pueda convertir los objetos de java en cadenas compilables de volcado postgres.

Abajo hay una muestra de la salida de shp2pgsql -que es esencialmente lo que quiero replicar usando java.

SET CLIENT_ENCODING TO UTF8;
SET STANDARD_CONFORMING_STRINGS TO ON;
BEGIN;
CREATE TABLE "raw_data"."mud" (gid serial,
"objectid" numeric(10,0),
"tcmud_name" varchar(50),
"shape_area" numeric,
"shape_len" numeric);
ALTER TABLE "raw_data"."mud" ADD PRIMARY KEY (gid);
SELECT AddGeometryColumn('raw_data','mud','geom','2277','MULTIPOLYGON',2);
COPY "raw_data"."mud" ("objectid","tcmud_name","shape_area","shape_len",geom) FROM stdin;
14  LAKEWAY MUD 9.60083055833e+004  1.24005179036e+003  0106000020E50800000100000001030000000100000005000000E03113F38C20474188DA1ADB9142634140726A6B94204741B07B4EE669426341007FCF91FE1F4741D0BE4D2668426341A03E7819F71F474190631C1B90426341E03113F38C20474188DA1ADB91426341
16  LAKEWAY MUD 1.99805337165e+004  5.90416771226e+002  0106000020E5080000010000000103000000010000000900000040CA100AE92F474110A13411B3466341E09D3C7DE42F474198B6CE82AA466341A0BA19BD912F4741F08A1B80AF466341940F2FE9912F4741E9D4FBCEB24663410005BDDD902F4741B0CC491BB646634120440ECA8C2F4741403B9018BC466341E0865D22ED2F4741D06DCE02BA466341E0AAB0DAEA2F474170988569B646634140CA100AE92F474110A13411B3466341
17  LAKEWAY MUD 2.55495765553e+004  6.75755882634e+002  0106000020E5080000010000000103000000010000000800000080183EE7062F4741A03A533557466341208801F3F52E4741E836A58E55466341805FC108D32E4741685B85F96446634140DE1C01CF2E4741D8E7CCEA6A466341A063D3DFC92E47415008A8CE71466341E0CBB53AF42E4741A848726374466341C0F32A05292F4741588B715F5A46634180183EE7062F4741A03A533557466341
20  LAKEWAY MUD 1.54327655151e+004  5.08037611343e+002  0106000020E5080000010000000103000000010000000500000000A3626F4F284741402A23586044634140FFC13E36284741A8F42ECF4D44634100E74A4A06284741604256135244634140943F531F284741409C39B66344634100A3626F4F284741402A235860446341
27  WTCMUD NO. 7    6.92786595456e+005  3.61805221358e+003  0106000020E50800000100000001030000000100000018000000C0063953CF464741107CA79ED538634100190A95D246474110AE1AA1DA386341C0240A3EDE474741D866062A0439634180FC86331F484741B8A81D80EE386341E03C4D782848474190155C7FC2386341203E3FAAED4747418056C1F598386341C0BE4FB8ED474741B0F4E3B28A386341A08A5238C947474180DBCB047E386341E036F588A6474741389250786438634140FEF57170474741205693EF523863416028CABB3F4747414897B23D503863410081AAA732474741989B78844F386341601450391A474741903F8F535138634140948698EB46474170D55FC754386341A0068BD6D9464741703CF3B85C386341001E6513CC464741E0D4F5E06238634140A9C648CC464741C8048B7274386341A06B007ACC4647415043AEA684386341E07EA77ECC464741D8E2993086386341A00B156BE0464741B845446E91386341008BC1BB15474741C004DF82AF386341C05D1BB7EC464741401E7AF3C0386341C0EF4FB5CB464741B0DF1CFCCE386341C0063953CF464741107CA79ED5386341
...
\.
CREATE INDEX "mud_geom_gist" ON "raw_data"."mud" USING GIST ("geom");
COMMIT;

En resumen, estoy buscando la manera más rápida, fácil y robusta de subir cualquier shapefile a postgis en java.

No me importa si las soluciones utilizan geoherramientas, ya que he encontrado que las geoherramientas son muy engorrosas para mis necesidades muy simples -- cambiar el nombre de la columna de geometría de "the_geom" a "geom", por ejemplo, requiere generar un nuevo esquema desde cero con el nuevo nombre de la geometría, iterar a través de todas las características del almacén de datos de la forma, generar una nueva característica en el nuevo esquema, y luego mapear individualmente cada atributo del antiguo esquema al atributo correspondiente en el nuevo esquema!

2voto

Nick Puntos 3115

No soy un experto en Java, pero sé que Java soporta subprocesos, así que podrías hacer el tipo de cosas que yo haría en Python de la siguiente manera.

  • Escriba un simple bucle para iterar sobre sus archivos de forma
  • Para cada perfil de forma, se genera un subproceso para llamar ogr2ogr para tirar el shapefile de una sola vez en PostGIS sin tener que crear un archivo de volcado primero
  • Enjuague y repita

GDAL/OGR tiene Encuadernaciones de Java para que puedas usarlos para otras tareas de geoprocesamiento también. Sé que no es GeoTools pero ogr2ogr es una herramienta tan maravillosa del ejército suizo que ningún profesional de los SIG debería estar sin ella.

EDITAR:
No tienes que instalar FWToools para conseguir ogr2ogr, puedes conseguirlo. aquí

1voto

Adam Ernst Puntos 6939

Si usted está viendo compromisos individuales, entonces usted tiene su transacción mal configurada - intente algo como:

        Transaction transaction = new DefaultTransaction("create");

    String typeName = newDataStore.getTypeNames()[0];
    SimpleFeatureSource featureSource = newDataStore.getFeatureSource(typeName);

    if (featureSource instanceof SimpleFeatureStore) {
        SimpleFeatureStore featureStore = (SimpleFeatureStore) featureSource;

        /*
         * SimpleFeatureStore has a method to add features from a
         * SimpleFeatureCollection object, so we use the ListFeatureCollection
         * class to wrap our list of features.
         */
        SimpleFeatureCollection collection = new ListFeatureCollection(TYPE, features);
        featureStore.setTransaction(transaction);
        try {
            featureStore.addFeatures(collection);
            transaction.commit();

        } catch (Exception problem) {
            problem.printStackTrace();
            transaction.rollback();

        } finally {
            transaction.close();
        }
        System.exit(0); // success!
    } else {
        System.out.println(typeName + " does not support read/write access");
        System.exit(1);
    }

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