El 1 de marzo de 2017, 18:23, Iago Alonso Alonso <ialo...@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 <ialo...@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@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@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@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@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 jjdelce...@gvsig.com jjdelce...@gvsig.org gvSIG Association www.gvsig.com www.gvsig.org
_______________________________________________ gvSIG_desarrolladores mailing list gvSIG_desarrolladores@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