public void mitab_c_set_points(TABFeature feature, int part, int vertex_count, double[] x, double[] y) { TABFeature poFeature = feature; if (TABFeatureClass.TABFCPoint == poFeature.GetFeatureClass() || TABFeatureClass.TABFCFontPoint == poFeature.GetFeatureClass() || TABFeatureClass.TABFCCustomPoint == poFeature.GetFeatureClass() || TABFeatureClass.TABFCText == poFeature.GetFeatureClass() ) { if (1 != vertex_count) { CPLErrorClass._CPLAssert("vertex_count == 1", CPLErrorClass.sf.GetFileName(), CPLErrorClass.sf.GetFileLineNumber()); } poFeature.SetGeometryDirectly(new OGRPoint(x[0], y[0])); } else if (TABFeatureClass.TABFCPolyline == poFeature.GetFeatureClass()) { OGRLineString poLine = new OGRLineString(); poLine.setPoints(vertex_count, x, 0, y, 0, null, 0); if (null != poFeature.GetGeometryRef() && 0 < part) { OGRGeometry poGeom = poFeature.GetGeometryRef(); if (poGeom.getGeometryType() == OGRwkbGeometryType.wkbLineString && part == 1) { OGRMultiLineString poMulti = new OGRMultiLineString(); /* Note: we use addGeometry() to add poGeom to poMulti since * original geometry object will be freed by call to * SetGeometryDirectly() below. */ poMulti.addGeometry(poGeom); poMulti.addGeometryDirectly(poLine); poFeature.SetGeometryDirectly(poMulti); } else if (poGeom.getGeometryType() == OGRwkbGeometryType.wkbMultiLineString) { //CPLAssert(part > 1); if (1 >= part) { CPLErrorClass._CPLAssert("part > 1", CPLErrorClass.sf.GetFileName(), CPLErrorClass.sf.GetFileLineNumber()); } OGRMultiLineString poMulti = (OGRMultiLineString)poGeom; poMulti.addGeometryDirectly(poLine); } } else { if (0 != part) { CPLErrorClass._CPLAssert("part == 0", CPLErrorClass.sf.GetFileName(), CPLErrorClass.sf.GetFileLineNumber()); } poFeature.SetGeometryDirectly(poLine); } } else if (poFeature.GetFeatureClass() == TABFeatureClass.TABFCRegion) { OGRLinearRing poRing = new OGRLinearRing(); OGRPolygon poPolygon = null, poPoly = null; OGRMultiPolygon poMultiPolygon = null; int iLastPolygon = 0, numRingsTotal = 0; poRing.setPoints(vertex_count, x, 0, y, 0, null, 0); if (poFeature.GetGeometryRef() != null && part > 0) { poMultiPolygon = (OGRMultiPolygon)poFeature.GetGeometryRef(); iLastPolygon = poMultiPolygon.getNumGeometries() - 1; poPolygon = (OGRPolygon) poMultiPolygon.getGeometryRef(iLastPolygon); // Get total number of rings for (int iPoly = 0; iPoly < poMultiPolygon.getNumGeometries(); iPoly++) { // We are guaranteed that all parts are OGRPolygons poPoly = (OGRPolygon)poMultiPolygon.getGeometryRef(iPoly); if (poPoly == null) continue; numRingsTotal += poPoly.getNumInteriorRings() + 1; }/*for*/ //CPLAssert( part == numRingsTotal ); if (part != numRingsTotal) { CPLErrorClass._CPLAssert("part == numRingsTotal", CPLErrorClass.sf.GetFileName(), CPLErrorClass.sf.GetFileLineNumber()); } poPolygon.addRingDirectly(poRing); } else { //CPLAssert( part <= 0 ); if (0 < part) { CPLErrorClass._CPLAssert("part <= 0", CPLErrorClass.sf.GetFileName(), CPLErrorClass.sf.GetFileLineNumber()); } if (poFeature.GetGeometryRef() != null) poMultiPolygon = (OGRMultiPolygon)poFeature.GetGeometryRef(); else poMultiPolygon = new OGRMultiPolygon(); poPolygon = new OGRPolygon(); poPolygon.addRingDirectly(poRing); poMultiPolygon.addGeometryDirectly(poPolygon); if (poFeature.GetGeometryRef() == null) poFeature.SetGeometryDirectly(poMultiPolygon); } } else if (poFeature.GetFeatureClass() == TABFeatureClass.TABFCRectangle) { if (poFeature.GetGeometryRef() == null && part == 0) { // Rectangle: The MBR of the first part defines the rectangle // corners OGRPolygon poPoly = new OGRPolygon(); OGRLinearRing poRing = new OGRLinearRing(); poRing.setPoints(vertex_count, x, 0, y, 0, null, 0); poPoly.addRingDirectly(poRing); poFeature.SetGeometryDirectly(poPoly); } } else if (poFeature.GetFeatureClass() == TABFeatureClass.TABFCMultiPoint) { OGRPoint poPoint = null; OGRMultiPoint poMultiPoint = null; int i = 0; if (poFeature.GetGeometryRef() != null) poMultiPoint = (OGRMultiPoint)poFeature.GetGeometryRef(); else poMultiPoint = new OGRMultiPoint(); for (i = 0; i < vertex_count; i++) { poPoint = new OGRPoint(x[i], y[i]); poMultiPoint.addGeometryDirectly(poPoint); } poFeature.SetGeometryDirectly(poMultiPoint); } }