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

Iago Alonso Alonso ialonso en enxenio.es
Mie Mar 1 18:23:32 CET 2017


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.DataStoreProviderToFeatureStoreProviderFactoryWrapper.createProvider(DataStoreProviderToFeatureStoreProviderFactoryWrapper.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.DataStoreProviderToFeatureStoreProviderFactoryWrapper.createProvider(DataStoreProviderToFeatureStoreProviderFactoryWrapper.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? 

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).setGeometryType(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(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.DataStoreProviderToFeatureStoreProviderFactoryWrapper.createProvider(DataStoreProviderToFeatureStoreProviderFactoryWrapper.java:61)
> at org.gvsig.fmap.dal.impl.DefaultDataManager.createProvider(DefaultDataManager.java:797)
> ... 7 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.DataStoreProviderToFeatureStoreProviderFactoryWrapper.createProvider(DataStoreProviderToFeatureStoreProviderFactoryWrapper.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 [1] 
> _______________________________________________
> 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 [1]

  -- 

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 

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 

Links:
------
[1]
https://listserv.gva.es/cgi-bin/mailman/listinfo/gvsig_desarrolladores
------------ próxima parte ------------
Se ha borrado un adjunto en formato HTML...
URL: <http://listserv.gva.es/pipermail/gvsig_desarrolladores/attachments/20170301/a88e00e9/attachment.html>


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