[Gvsig_desarrolladores] Duda al crear un campo Geometry en una tabla para PostgreSQL

Joaquin Jose del Cerro Murciano jjdelcerro en gvsig.org
Jue Mar 2 11:19:39 CET 2017


El 1 de marzo de 2017, 18:23, Iago Alonso Alonso <ialonso en enxenio.es>
escribió:

> Hola Francisco, perdón por el doble correo pero aunque me crea la tabla
> sigo teniendo varios errores y no entiendo cómo es capaz de crear la tabla.
>
> Aunque como he indicado, la tabla se crea, salen algunos errores  y no se
> rellena con datos. Los datos los tomo de un ShapeFile (y en la misma
> carpeta están el .prj, .dbf y .shx) los cuales inserto en una tabla
> temporal en BD Postgres (que es la que estoy intentado generar por código)
> para luego copiarlos a la tabla en BD Postgres que reamente quiero.
>
> Durante la creación de la tabla, cuando lee los campos en el bucle de la
> línea *499* de la clase *JDBCServerExplorer*, vuelve a devolver un *NULL*
> cuando llega al campo de geometría en
>
> sqlAttr = helper*.getSqlFieldDescription(*(FeatureAttributeDescriptor)
> attrs.next()*)*;
>
> por lo que la sentencia queda:
>
> ["CAMPO_1" integer DEFAULT '0' NOT NULL , "CAMPO_2" varchar(6) DEFAULT ''
> NOT NULL , "CAMPO_3" varchar(16) DEFAULT '' NOT NULL , "CAMPO_4" double
> precision DEFAULT '0.0' NOT NULL , "CAMPO_5" integer DEFAULT '0' NOT NULL ,
> "CAMPO_6" integer DEFAULT '0' NOT NULL , "CAMPO_7" integer DEFAULT '0' NOT
> NULL , "CAMPO_8" bigint DEFAULT '0' NOT NULL , "CAMPO_9" bigserial NOT NULL
> PRIMARY KEY ]
>
> en lugar de
>
> ["CAMPO_1" integer DEFAULT '0' NOT NULL , "CAMPO_2" varchar(6) DEFAULT ''
> NOT NULL , "CAMPO_3" varchar(16) DEFAULT '' NOT NULL , "CAMPO_4" double
> precision DEFAULT '0.0' NOT NULL , "CAMPO_5" integer DEFAULT '0' NOT NULL ,
> "CAMPO_6" integer DEFAULT '0' NOT NULL , "CAMPO_7" integer DEFAULT '0' NOT
> NULL , "CAMPO_8" bigint DEFAULT '0' NOT NULL *, geometry
> geometry(MultiPoint,25829),* "CAMPO_10" bigserial NOT NULL PRIMARY KEY ]
>
> Y al crear el STRING con el SQL, queda:
>
> Create table "esquema"."tablaTemporal"("CAMPO_1" integer DEFAULT '0' NOT
> NULL , "CAMPO_2" varchar(6) DEFAULT '' NOT NULL , "CAMPO_3" varchar(16)
> DEFAULT '' NOT NULL , "CAMPO_4" double precision DEFAULT '0.0' NOT NULL ,
> "CAMPO_5" integer DEFAULT '0' NOT NULL , "CAMPO_6" integer DEFAULT '0' NOT
> NULL , "CAMPO_7" integer DEFAULT '0' NOT NULL , "CAMPO_8" bigint DEFAULT
> '0' NOT NULL , "CAMPO_9" bigserial NOT NULL PRIMARY KEY)
>
> en lugar de
>
> Create table "esquema"."tablaTemporal"("CAMPO_1" integer DEFAULT '0' NOT
> NULL , "CAMPO_2" varchar(6) DEFAULT '' NOT NULL , "CAMPO_3" varchar(16)
> DEFAULT '' NOT NULL , "CAMPO_4" double precision DEFAULT '0.0' NOT NULL ,
> "CAMPO_5" integer DEFAULT '0' NOT NULL , "CAMPO_6" integer DEFAULT '0' NOT
> NULL , "CAMPO_7" integer DEFAULT '0' NOT NULL , "CAMPO_8" bigint DEFAULT
> '0' NOT NULL , *geometry geometry(MultiPoint,25829)*, "CAMPO_10"
> bigserial NOT NULL PRIMARY KEY)
>
> Por tanto, cuando va a crear la tabla y exportar los datos:
>
> crearTabla*.export(*featureStore.getFeatureSet()*)*;
>
> y llega a la clase *DefaultDataManager* y entra en el bucle *WHILE* en la
> línea 789 del método *createProvider* ocurre una excepción e intenta:
>
> *retry = openErrorHandler.canRetryOpen(e, parameters);*
>
> Y acaba lanzando una: *InitializeException*
>
> org.gvsig.fmap.dal.exception.InitializeException: *Error intializing
> resource 'PostgreSQL'.*
> at org.gvsig.fmap.dal.impl.DefaultDataManager.createProvider(
> DefaultDataManager.java:815)
> at org.gvsig.fmap.dal.impl.DefaultDataManager.intializeDataStore(
> DefaultDataManager.java:777)
> at org.gvsig.fmap.dal.impl.DefaultDataManager.localOpenStore(
> DefaultDataManager.java:364)
> at org.gvsig.fmap.dal.impl.DefaultDataManager.openStore(
> DefaultDataManager.java:448)
> .........
> Caused by: org.gvsig.fmap.dal.exception.InitializeException: Error
> intializing resource '{unknow}'.
> at org.gvsig.fmap.dal.impl.DataStoreProviderToFeatureStor
> eProviderFactoryWrapper.createProvider(DataStoreProviderToFeatureStor
> eProviderFactoryWrapper.java:61)
> at org.gvsig.fmap.dal.impl.DefaultDataManager.createProvider(
> DefaultDataManager.java:797)
> ... 9 more
> Caused by: java.lang.IllegalArgumentException: *argument type mismatch*
> at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
> at sun.reflect.NativeConstructorAccessorImpl.newInstance(
> NativeConstructorAccessorImpl.java:62)
> at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(
> DelegatingConstructorAccessorImpl.java:45)
> at java.lang.reflect.Constructor.newInstance(Constructor.java:422)
> at org.gvsig.fmap.dal.impl.DataStoreProviderToFeatureStor
> eProviderFactoryWrapper.createProvider(DataStoreProviderToFeatureStor
> eProviderFactoryWrapper.java:59)
> ... 10 more
>
> Pero si miro en el pgAdmin III veo que se ha creado la tabla con el campo
> de geometría, aunque está vacía sin los datos.
>
> ¿Cómo es posible que cree la tabla con el campo de geometría si le falta
> la información en el String del SQL? ¿Y los dos errores que salen, tienen
> que ver con eso, o es por algún otro motivo? ¿Estoy entendiendo algo mal
> del funcionamiento de gvSIG?
>

Asi sin pensar mucho...
para añadir un campo de tipo geometria en PostgreSQL+PostGIS no se hace en
el create table. Se usa la funcion AddGeometryColumn que se ejecuta tras el
create table.

Un saludo
Joaquin



> Un saludo y gracias.
>
> El 28-02-2017 11:04 AM, Francisco Puga escribió:
>
> Hola Iago,
>
> Lo del campo geometry a veces a mi también me da algún problema. No me
> queda muy claro lo que intentas hacer, si crear una nueva tabla desde
> código o sólo iterar por los registros, pero te enlazo dos clases que te
> pueden dar una pista.
>
> Esta coge un shp de disco y mete los registros en una tabla de la base de
> datos
> https://github.com/iCarto/sixhiara/blob/gvsig2/src/main/
> java/es/icarto/gvsig/sixhiara/ImportExploracoesExtension.java#L102
>
> Esta lee shps de disco y crea shps en disco
> https://github.com/iCarto/es.icarto.gvsig.commons/blob/
> gvsig2/src/main/java/es/icarto/gvsig/commons/datasources/SHPFactory.java
>
> El truco diría que está en buscar el campo de geometría no por nombre si
> no por tipo.
>
> Feature srcFeat  = null; // vendrá de algún sitio
> FeatureType srcType = srcFeat.getType();
> FeatureAttributeDescriptor[] atts = srcType.getAttributeDescriptors();
> for (int i = 0; i < atts.length; i++) {
>   int attType = atts[i].getType();
> if (attType == org.gvsig.fmap.geom.DataTypes.GEOMETRY) {
> // Hacer algo con la geometría
> } else {
>         // Hacer algo con el resto de campos
>   }
> }
>
>
> La otra forma de acceder sencilla de acceder a la geometría es:
>
> Feature srcFeat  = null; // vendrá de algún sitio
> Geometry srcGeom = srcFeat.getDefaultGeometry();
>
> El 24 de febrero de 2017, 13:04, Iago Alonso Alonso <ialonso en enxenio.es>
> escribió:
>
>> Buenas, he decompilado la clase *PostgreSQLHelper* y he visto esto en el
>> método. ¿Qué sentido tiene?
>>
>> public String getSqlFieldDescription(FeatureAttributeDescriptor attr) throws DataException {*
>>       if (attr.getType() == 66) {
>>             return null;
>>       }
>>       *return super.getSqlFieldDescription(attr);}
>>
>> El 24-02-2017 10:42 AM, Iago Alonso Alonso escribió:
>>
>> Hola, tengo dudas sobre como definir una columna en una tabla para
>> PostgreSQL del tipo GEOMETRY. A la hora de crear la tabla, obtengo del
>> *FeatureSet* los *DynFields* que contiene y para cada uno obtengo su
>> nombre (que usaré como nombre de la columna) y su tipo (que usaré como tipo
>> del dato para esa columna). En el caso de Integer, bigint, varchar o double
>> precision no tengo problemas pero cuando llego al campo de la geometría es
>> donde tengo los problemas.
>>
>> Para el campo de geometría, miro el nombre del fichero que tengo ese
>> momento para ser qué tipo de geometría se corresponde con la tabla y con la
>> función *getGeometryType()* que he hecho, devuelto un *Geometry.TYPES.<el
>> tipo que corresponde>* (Point, Polygon, Line....)
>>
>> int size = featureSet.getDefaultFeatureType().size();
>> DynField[] values = featureSet.getDefaultFeatureType().getDynFields();
>> for (int i = 0; i < size; i++) {
>>      String name = values[i].getName();
>>      Integer type = values[i].getType();
>>      if (!name.equals("GEOMETRY")) {
>>          featureType.add(name, type);
>>      } else {
>>         String idTabla = featureSet.getDefaultFeatureType().getId();
>>         int tipoGeometria = getGeometryType(idTabla);
>>         featureType.add(name, DataTypes.GEOMETRY).setGeometr
>> yType(Geometry.SUBTYPES.GEOM2D, tipoGeometria);
>>      }
>> }
>>
>> El problema viene en tiempo de ejecución, al hacer *explorer.add(storeName,
>> newFeatureStoreParameters, true);*, haciendo debug he llegado hasta la
>> clase *JDBCServerExplorer.class*. En la línea 499, hay un bucle *WHILE*
>> que obtiene los campos y su tipo y crea el equivalente *SQL* para la
>> consulta. He observado que cuando llega al campo que debe llevar la
>> geometría, la línea:
>>
>> *sqlAttr = helper.getSqlFieldDescription((FeatureAttributeDescriptor)
>> attrs.next());*
>>
>> Devuelve *NULL*, pero haciendo F5 no puedo acceder a *PostgreSQLHelper*
>> y ver lo que el método *getSqlFieldDescription* intenta hacer para crear
>> el *SQL*. Y en el log obtengo:
>>
>> ERROR [Thread-7] (ExportToJDBC.java:101) - Error al inicializar el store:
>> org.gvsig.fmap.dal.exception.InitializeException: Error intializing
>> resource 'PostgreSQL'.
>> at org.gvsig.fmap.dal.impl.DefaultDataManager.createProvider(De
>> faultDataManager.java:815)
>> at org.gvsig.fmap.dal.impl.DefaultDataManager.intializeDataStor
>> e(DefaultDataManager.java:777)
>> at org.gvsig.fmap.dal.impl.DefaultDataManager.localOpenStore(De
>> faultDataManager.java:364)
>> at org.gvsig.fmap.dal.impl.DefaultDataManager.openStore(Default
>> DataManager.java:448)
>> ...
>> Caused by: org.gvsig.fmap.dal.exception.InitializeException: Error
>> intializing resource '{unknow}'.
>> at org.gvsig.fmap.dal.impl.DataStoreProviderToFeatureStoreProvi
>> derFactoryWrapper.createProvider(DataStoreProviderToFeatureS
>> toreProviderFactoryWrapper.java:61)
>> at org.gvsig.fmap.dal.impl.DefaultDataManager.createProvider(De
>> faultDataManager.java:797)
>> ... 7 more
>> *Caused by: java.lang.IllegalArgumentException: argument type mismatch*
>> at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
>> at sun.reflect.NativeConstructorAccessorImpl.newInstance(Native
>> ConstructorAccessorImpl.java:62)
>> at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(De
>> legatingConstructorAccessorImpl.java:45)
>> at java.lang.reflect.Constructor.newInstance(Constructor.java:422)
>> at org.gvsig.fmap.dal.impl.DataStoreProviderToFeatureStoreProvi
>> derFactoryWrapper.createProvider(DataStoreProviderToFeatureS
>> toreProviderFactoryWrapper.java:59)
>> ... 8 more
>>
>> Por lo tanto, mi pregunta es qué estoy haciendo mal a la hora de definir
>> el campo de la geometría, o si estoy definiendo el tipo de geometría mal.
>>
>> Un saludo y gracias.
>> _______________________________________________
>> gvSIG_desarrolladores mailing list
>> gvSIG_desarrolladores en listserv.gva.es
>> Para ver histórico de mensajes, editar sus preferencias de usuario o
>> darse de baja en esta lista, acuda a la siguiente dirección:
>> https://listserv.gva.es/cgi-bin/mailman/listinfo/gvsig_desarrolladores
>>
>>
>> _______________________________________________
>> gvSIG_desarrolladores mailing list
>> gvSIG_desarrolladores en listserv.gva.es
>> Para ver histórico de mensajes, editar sus preferencias de usuario o
>> darse de baja en esta lista, acuda a la siguiente dirección:
>> https://listserv.gva.es/cgi-bin/mailman/listinfo/gvsig_desarrolladores
>>
>>
>
>
> --
> Francisco Puga
> iCarto | Innovación, Cooperación, Cartografía y Territorio S.L.
> http://www.icarto.es/
>
> c/ Rafael Alberti nº 13 – 1º D
> 15008 A Coruña
> Galicia (Spain)
> +34 881927808 <+34%20881%2092%2078%2008>
>
> Este correo electrónico contiene información estrictamente confidencial y
> es de uso exclusivo del destinatario, quedando prohibida a cualquier otra
> persona su revelación, copia, distribución, o el ejercicio de cualquier
> acción relativa a su contenido. Si ha recibido este mensaje por error, por
> favor conteste a su remitente mediante correo electrónico y proceda a
> borrarlo de su sistema.
>
> Sus datos personales serán tratados de forma confidencial y no serán
> cedidos a terceros ajenos a ICARTO. En cualquier caso, podrá ejercer los
> derecho de oposición, acceso, rectificación y cancelación de acuerdo con lo
> establecido en la Ley Orgánica 15/99, de 13 de diciembre, de Protección de
> Datos de Carácter Personal dirigiéndose a Innovación, Cooperación,
> Cartografía e Territorio, SL. (ICARTO) en la dirección postal a C/ Rafael
> Alberti, nº 13, 1ºD, 15.008 – (A Coruña).
>
> _______________________________________________
> gvSIG_desarrolladores mailing list
> gvSIG_desarrolladores en listserv.gva.es
> Para ver histórico de mensajes, editar sus preferencias de usuario o darse
> de baja en esta lista, acuda a la siguiente dirección:
> https://listserv.gva.es/cgi-bin/mailman/listinfo/gvsig_desarrolladores
>
>
> _______________________________________________
> gvSIG_desarrolladores mailing list
> gvSIG_desarrolladores en listserv.gva.es
> Para ver histórico de mensajes, editar sus preferencias de usuario o darse
> de baja en esta lista, acuda a la siguiente dirección:
> https://listserv.gva.es/cgi-bin/mailman/listinfo/gvsig_desarrolladores
>
>


-- 
--------------------------------------
Joaquin Jose del Cerro Murciano
Development and software arquitecture manager at gvSIG Team
jjdelcerro en gvsig.com
jjdelcerro en gvsig.org
gvSIG Association
www.gvsig.com
www.gvsig.org
------------ próxima parte ------------
Se ha borrado un adjunto en formato HTML...
URL: <http://listserv.gva.es/pipermail/gvsig_desarrolladores/attachments/20170302/0ecd7d6c/attachment.html>


Más información sobre la lista de distribución gvSIG_desarrolladores