package org.geotools.data.ogr.jni; import java.io.IOException; import java.util.Arrays; import java.util.Vector; import org.gdal.gdal.gdal; import org.gdal.ogr.DataSource; import org.gdal.ogr.Driver; import org.gdal.ogr.Feature; import org.gdal.ogr.FeatureDefn; import org.gdal.ogr.FieldDefn; import org.gdal.ogr.Geometry; import org.gdal.ogr.Layer; import org.gdal.ogr.ogr; import org.gdal.osr.SpatialReference; import org.geotools.data.ogr.OGR; import org.geotools.geometry.jts.ReferencedEnvelope; import org.opengis.referencing.crs.CoordinateReferenceSystem; import static org.gdal.ogr.ogrConstants.*; public class JniOGR implements OGR { static { // perform OGR format registration once if (ogr.GetDriverCount() == 0) { ogr.RegisterAll(); } } Vector<String> vector(String[] opts) { return opts != null && opts.length > 0 ? new Vector<String>(Arrays.asList(opts)) : null; } @Override public int GetDriverCount() { return ogr.GetDriverCount(); } @Override public Object GetDriver(int i) { return ogr.GetDriver(i); } @Override public Object GetDriverByName(String name) { return ogr.GetDriverByName(name); } @Override public Object OpenShared(String dataSourceName, int mode) { return ogr.OpenShared(dataSourceName, mode); } @Override public Object Open(String dataSourceName, int mode) { return ogr.Open(dataSourceName, mode); } @Override public void CheckError(int code) throws IOException { if (code == OGRERR_NONE) { return; } String error = GetLastErrorMsg(); switch (code) { case OGRERR_CORRUPT_DATA: throw new IOException("OGR reported a currupt data error: " + error); case OGRERR_FAILURE: throw new IOException("OGR reported a generic failure: " + error); //case OGRERR_INVALID_HANDLE: // throw new IOException("OGR reported an invalid handle error: " + error); case OGRERR_NOT_ENOUGH_DATA: throw new IOException("OGR reported not enough data was provided in the last call: " + error); case OGRERR_NOT_ENOUGH_MEMORY: throw new IOException("OGR reported not enough memory is available: " + error); case OGRERR_UNSUPPORTED_GEOMETRY_TYPE: throw new IOException("OGR reported a unsupported geometry type error: " + error); case OGRERR_UNSUPPORTED_OPERATION: throw new IOException("OGR reported a unsupported operation error: " + error); case OGRERR_UNSUPPORTED_SRS: throw new IOException("OGR reported a unsupported SRS error: " + error); default: throw new IOException("OGR reported an unrecognized error code: " + code); } } @Override public String GetLastErrorMsg() { return gdal.GetLastErrorMsg(); } @Override public String DriverGetName(Object driver) { return ((Driver)driver).GetName(); } @Override public Object DriverOpen(Object driver, String dataSourceName, int mode) { return ((Driver)driver).Open(dataSourceName, mode); } @Override public Object DriverCreateDataSource(Object driver, String dataSourceName, String[] opts) { return ((Driver)driver).CreateDataSource(dataSourceName, vector(opts)); } @Override public void DriverRelease(Object driver) { ((Driver)driver).delete(); } @Override public Object DataSourceGetDriver(Object dataSource) { return ((DataSource)dataSource).GetDriver(); } @Override public int DataSourceGetLayerCount(Object dataSource) { return ((DataSource)dataSource).GetLayerCount(); } @Override public Object DataSourceGetLayer(Object dataSource, int i) { return ((DataSource)dataSource).GetLayer(i); } @Override public Object DataSourceGetLayerByName(Object dataSource, String name) { return ((DataSource)dataSource).GetLayerByName(name); } @Override public void DataSourceRelease(Object dataSource) { //if (dataSource != null) ((DataSource)dataSource).delete(); } @Override public Object DataSourceCreateLayer(Object dataSource, String name, Object srs, long geomType, String[] opts) { return ((DataSource)dataSource) .CreateLayer(name, (SpatialReference)srs, (int)geomType, vector(opts)); } @Override public Object DataSourceExecuteSQL(Object dataSource, String sql, Object spatialFilter) { return ((DataSource)dataSource).ExecuteSQL(sql, (Geometry)spatialFilter); } @Override public Object LayerGetLayerDefn(Object layer) { return ((Layer)layer).GetLayerDefn(); } @Override public int LayerGetFieldCount(Object layerDefn) { return ((FeatureDefn)layerDefn).GetFieldCount(); } @Override public Object LayerGetFieldDefn(Object layerDefn, int i) { return ((FeatureDefn)layerDefn).GetFieldDefn(i); } @Override public String LayerGetName(Object layer) { return ((Layer)layer).GetName(); } @Override public long LayerGetGeometryType(Object layerDefn) { return ((FeatureDefn)layerDefn).GetGeomType(); } @Override public Object LayerGetSpatialRef(Object layer) { return ((Layer)layer).GetSpatialRef(); } @Override public Object LayerGetExtent(Object layer) { return ((Layer)layer).GetExtent(); } @Override public long LayerGetFeatureCount(Object layer) { return ((Layer)layer).GetFeatureCount(); } @Override public void LayerRelease(Object layer) { //if (layer != null) ((Layer)layer).delete(); } @Override public void LayerReleaseLayerDefn(Object layerDefn) { ((FeatureDefn)layerDefn).delete(); } @Override public boolean LayerCanDeleteFeature(Object layer) { return ((Layer)layer).TestCapability(OLCDeleteFeature); } @Override public boolean LayerCanWriteRandom(Object layer) { return ((Layer)layer).TestCapability(OLCRandomWrite); } @Override public boolean LayerCanWriteSequential(Object layer) { return ((Layer)layer).TestCapability(OLCSequentialWrite); } @Override public boolean LayerCanCreateField(Object layer) { return ((Layer)layer).TestCapability(OLCCreateField); } @Override public boolean LayerCanIgnoreFields(Object layer) { return ((Layer)layer).TestCapability(OLCIgnoreFields); } @Override public void LayerCreateField(Object layer, Object fieldDefn, int approx) { ((Layer)layer).CreateField((FieldDefn)fieldDefn, approx); } @Override public void LayerSyncToDisk(Object layer) { ((Layer)layer).SyncToDisk(); } @Override public Object LayerNewFeature(Object layerDefn) { return new Feature((FeatureDefn)layerDefn); } @Override public ReferencedEnvelope toEnvelope(Object extent, CoordinateReferenceSystem crs) { double[] d = (double[])extent; return new ReferencedEnvelope(d[0], d[1], d[2], d[3], crs); } @Override public void LayerSetSpatialFilter(Object layer, Object geometry) { ((Layer)layer).SetSpatialFilter((Geometry) geometry); } @Override public void LayerSetAttributeFilter(Object layer, String attFilter) { ((Layer)layer).SetAttributeFilter(attFilter); } @Override public int LayerSetIgnoredFields(Object layer, String[] fields) { return ((Layer)layer).SetIgnoredFields(vector(fields)); } @Override public void LayerResetReading(Object layer) { ((Layer)layer).ResetReading(); } @Override public Object LayerGetNextFeature(Object layer) { return ((Layer)layer).GetNextFeature(); } @Override public boolean LayerDeleteFeature(Object layer, long fid) { return ((Layer)layer).DeleteFeature((int) fid) == 0; } @Override public int LayerSetFeature(Object layer, Object feature) { return ((Layer)layer).SetFeature((Feature) feature); } @Override public int LayerCreateFeature(Object layer, Object feature) { return ((Layer)layer).CreateFeature((Feature) feature); } @Override public String LayerGetFIDColumnName(Object layer) { return ((Layer)layer).GetFIDColumn(); } @Override public String FieldGetName(Object field) { return ((FieldDefn)field).GetName(); } @Override public long FieldGetType(Object field) { return ((FieldDefn)field).GetFieldType(); } @Override public int FieldGetWidth(Object field) { return ((FieldDefn)field).GetWidth(); } @Override public void FieldSetWidth(Object field, int width) { ((FieldDefn)field).SetWidth(width); } @Override public void FieldSetJustifyRight(Object field) { ((FieldDefn)field).SetJustify(OJRight); } @Override public void FieldSetPrecision(Object field, int precision) { ((FieldDefn)field).SetPrecision(precision); } @Override public boolean FieldIsIntegerType(long type) { return type == OFTInteger; } @Override public boolean FieldIsRealType(long type) { return type == OFTReal; } @Override public boolean FieldIsBinaryType(long type) { return type == OFTBinary; } @Override public boolean FieldIsDateType(long type) { return type == OFTDate; } @Override public boolean FieldIsTimeType(long type) { return type == OFTTime; } @Override public boolean FieldIsDateTimeType(long type) { return type == OFTDateTime; } @Override public boolean FieldIsIntegerListType(long type) { return type == OFTIntegerList; } @Override public boolean FieldIsRealListType(long type) { return type == OFTRealList; } @Override public Object CreateStringField(String name) { return new FieldDefn(name, OFTString); } @Override public Object CreateIntegerField(String name) { return new FieldDefn(name, OFTInteger); } @Override public Object CreateRealField(String name) { return new FieldDefn(name, OFTReal); } @Override public Object CreateBinaryField(String name) { return new FieldDefn(name, OFTBinary); } @Override public Object CreateDateField(String name) { return new FieldDefn(name, OFTDate); } @Override public Object CreateTimeField(String name) { return new FieldDefn(name, OFTTime); } @Override public Object CreateDateTimeField(String name) { return new FieldDefn(name, OFTDateTime); } @Override public long FeatureGetFID(Object feature) { return ((Feature)feature).GetFID(); } @Override public boolean FeatureIsFieldSet(Object feature, int i) { return ((Feature)feature).IsFieldSet(i); } @Override public void FeatureSetGeometryDirectly(Object feature, Object geometry) { ((Feature)feature).SetGeometryDirectly((Geometry) geometry); } @Override public Object FeatureGetGeometry(Object feature) { return ((Feature)feature).GetGeometryRef(); } @Override public void FeatureUnsetField(Object feature, int i) { ((Feature)feature).UnsetField(i); } @Override public void FeatureSetFieldInteger(Object feature, int field, int value) { ((Feature)feature).SetField(field, value); } @Override public void FeatureSetFieldDouble(Object feature, int field, double value) { ((Feature)feature).SetField(field, value); } @Override public void FeatureSetFieldBinary(Object feature, int field, int length, byte[] value) { //TODO: doesn't seem to be available in the api? //((Feature)feature).SetFieldBinary() } @Override public void FeatureSetFieldDateTime(Object feature, int field, int year, int month, int day, int hour, int minute, int second, int tz) { ((Feature)feature).SetField(field, year, month, day, hour, minute, second, tz); } @Override public void FeatureSetFieldString(Object feature, int field, String str) { ((Feature)feature).SetField(field, str); } @Override public String FeatureGetFieldAsString(Object feature, int i) { return ((Feature)feature).GetFieldAsString(i); } @Override public int FeatureGetFieldAsInteger(Object feature, int i) { return ((Feature)feature).GetFieldAsInteger(i); } @Override public double FeatureGetFieldAsDouble(Object feature, int i) { return ((Feature)feature).GetFieldAsDouble(i); } @Override public void FeatureGetFieldAsDateTime(Object feature, int i, int[] year, int[] month, int[] day, int[] hour, int[] minute, int[] second, int[] tzFlag) { ((Feature)feature).GetFieldAsDateTime(i, year, month, day, hour, minute, second, tzFlag); } @Override public void FeatureDestroy(Object feature) { ((Feature)feature).delete(); } @Override public long GetPointType() { return wkbPoint; } @Override public long GetPoint25DType() { return wkbPoint25D; } @Override public long GetLinearRingType() { return wkbLinearRing; } @Override public long GetLineStringType() { return wkbLineString; } @Override public long GetLineString25DType() { return wkbLineString25D; } @Override public long GetPolygonType() { return wkbPolygon; } @Override public long GetPolygon25DType() { return wkbPolygon25D; } @Override public long GetMultiPointType() { return wkbMultiPoint; } @Override public long GetMultiLineStringType() { return wkbMultiPoint25D; } @Override public long GetMultiLineString25DType() { return wkbMultiLineString25D; } @Override public long GetMultiPolygonType() { return wkbMultiPolygon; } @Override public long GetMultiPolygon25DType() { return wkbMultiPolygon25D; } @Override public long GetGeometryCollectionType() { return wkbGeometryCollection; } @Override public long GetGeometryCollection25DType() { return wkbGeometryCollection25D; } @Override public long GetGeometryNoneType() { return wkbNone; } @Override public long GetGeometryUnknownType() { return wkbUnknown; } @Override public int GeometryGetWkbSize(Object geom) { return ((Geometry)geom).WkbSize(); } @Override public int GeometryExportToWkb(Object geom, byte[] wkb) { return ((Geometry)geom).ExportToWkb(wkb, wkbXDR); } @Override public Object GeometryCreateFromWkb(byte[] wkb, int[] ret) { return Geometry.CreateFromWkb(wkb); } @Override public String GeometryExportToWkt(Object geom, int[] ret) { return ((Geometry)geom).ExportToWkt(); } @Override public Object GeometryCreateFromWkt(String wkt, int[] ret) { return Geometry.CreateFromWkt(wkt); } @Override public void GeometryDestroy(Object geometry) { ((Geometry)geometry).delete(); } @Override public String SpatialRefGetAuthorityCode(Object spatialRef, String authority) { return ((SpatialReference)spatialRef).GetAuthorityCode(authority); } @Override public String SpatialRefExportToWkt(Object spatialRef) { return ((SpatialReference)spatialRef).ExportToWkt(); } @Override public void SpatialRefRelease(Object spatialRef) { ((SpatialReference)spatialRef).delete(); } @Override public Object NewSpatialRef(String wkt) { return new SpatialReference(wkt); } public static void main(String[] args) throws Exception { ogr.RegisterAll(); DataSource ds = ogr.Open("/Users/jdeolive/Projects/geotools/git/modules/library/sample-data/src/main/resources/org/geotools/test-data/shapes/statepop.shp"); double[] d = ds.GetLayer(0).GetExtent(); System.out.println(d); } }