On mardi 26 septembre 2017 17:16:28 CEST Andrew Joseph wrote: > I'm using the GDAL Java Bindings (most recent dev version 2.3.0) and looking > to determine the native datatype of a given layer field -or at least the > default mapping of the driver. For example I have manually written code > like the following for Postgres/Postgis: > > private static final BiMap<String,Integer> PG_OGR_GOMETRY_TYPE_MAP = > new ImmutableBiMap.Builder<String, Integer>() > .put("Point",wkbPoint) > .put("LineString",wkbLineString) > .put("Polygon",wkbPolygon) > .put("Surface",wkbSurface) > .put("Curve",wkbCurve) > .put("MultiPoint",wkbMultiPoint) > .put("MultiLineString",wkbMultiLineString) > .put("MultiPolygon",wkbMultiPolygon) > .put("GeometryCollection",wkbGeometryCollection) > .put("CircularString",wkbCircularString) > .put("CompoundCurve",wkbCompoundCurve) > .put("CurvePolygon",wkbCurvePolygon) > .put("MultiCurve",wkbMultiCurve) > .put("MultiSurface",wkbMultiSurface) > .put("PolyhedralSurface",wkbPolyhedralSurface) > .build(); > > private static final BiMap<String,Integer> POSTGIS_OGR_DATATYPE_MAP = > new ImmutableBiMap.Builder<String, Integer>() > .put("integer",OFTInteger) > .put("real",OFTReal) > .put("varchar",OFTString) > .put("bytea",OFTBinary) > .put("date",OFTDate) > .put("time",OFTTime) > .put("timestamp",OFTDateTime) > .put("bigint",OFTInteger64) > .put("integer[]",OFTIntegerList) > .put("real[]",OFTRealList) > .put("varchar[]",OFTStringList) > .put("bigint[]",OFTInteger64List) > .put("text",OFTWideString)
--> OFTWideString is unused. Will be OFTString > .put("text[]",OFTWideStringList) --> same here. OFTStringList > .build(); > > However, it would obviously be orders of magnitude more > convenient/future-proofed to simply retrieve these mappings from the > driver/layer itself since each driver/layer must logically already have such > a mapping. That's really an implementation detail. Not sure it is a good idea to expose it, and that only makes sense for SQL-like drivers. And it is generally not as simple as a bidirectionnal map. Several postgres types can map to the same OGR field type. You'll find the postgres->OGR logic in https://trac.osgeo.org/gdal/browser/trunk/gdal/ogr/ogrsf_frmts/pgdump/ogrpgdumplayer.cpp#L1287 As you can see it also takes into account the field width and precision to decide if a numeric must be mapped to a OFTReal, OFTInteger or OFTInteger64. > In addition, is it possible to get the native datatypes that > would be generated when copying, say a shapefile to postgres without > actually copying the data itself? You could just instanciate a target postgres table and add fields from the source layer field definition, without copying any record. But that would create the table. Alternatively you could use the PGDump driver for that, that is really close to what the Postgresql driver does, but that would only write in a file, instead of modifying a PG db. $ ogr2ogr -f pgdump /vsistdout/ poly.shp -where "0=1" SET standard_conforming_strings = OFF; DROP TABLE IF EXISTS "public"."poly" CASCADE; DELETE FROM geometry_columns WHERE f_table_name = 'poly' AND f_table_schema = 'public'; BEGIN; CREATE TABLE "public"."poly" ( "ogc_fid" SERIAL, CONSTRAINT "poly_pk" PRIMARY KEY ("ogc_fid") ); SELECT AddGeometryColumn('public','poly','wkb_geometry',27700,'POLYGON',2); CREATE INDEX "poly_wkb_geometry_geom_idx" ON "public"."poly" USING GIST ("wkb_geometry"); ALTER TABLE "public"."poly" ADD COLUMN "area" NUMERIC(12,3); ALTER TABLE "public"."poly" ADD COLUMN "eas_id" NUMERIC(11,0); ALTER TABLE "public"."poly" ADD COLUMN "prfedea" VARCHAR(16); COMMIT; You could probably use gdal.VectorTranslate() for that http://gdal.org/java/org/gdal/gdal/gdal.html#VectorTranslate-org.gdal.gdal.Dataset-org.gdal.gdal.Dataset-org.gdal.gdal.VectorTranslateOptions- although I don't think I've tested that the Java bindings for it work correctly something like shapefile_ds = gdal.OpenEx("my.shp"); gdal.VectorTranslate("tmp/out.txt", shapefile_ds, new gdal.VectorTranslateOptions(new Vector(Arrays.asList(new String[]{"-of", "PGDump", "-where", "0=1"})))); Even -- Spatialys - Geospatial professional services http://www.spatialys.com
_______________________________________________ gdal-dev mailing list gdal-dev@lists.osgeo.org https://lists.osgeo.org/mailman/listinfo/gdal-dev