protected Polygon<?> createGeometry(SqlServerGeometry nativeGeom, int shapeIndex) { if (nativeGeom.isEmptyShape(shapeIndex)) { return (Polygon<?>) createNullGeometry(nativeGeom.getCoordinateReferenceSystem()); } // polygons consist of one exterior ring figure, and several interior ones. IndexRange figureRange = nativeGeom.getFiguresForShape(shapeIndex); List<LinearRing<?>> rings = new ArrayList<LinearRing<?>>(figureRange.length()); // the rings should contain all inner rings from index 1 to index length - 1 // index = 0 should be reserved for the shell. for (int figureIdx = figureRange.start, i = 1; figureIdx < figureRange.end; figureIdx++) { IndexRange pntIndexRange = nativeGeom.getPointsForFigure(figureIdx); if (nativeGeom.isFigureInteriorRing(figureIdx)) { rings.set(i++, toLinearRing(nativeGeom, pntIndexRange)); } else { rings.set(0, toLinearRing(nativeGeom, pntIndexRange)); } } LinearRing<?>[] ringArr = (LinearRing<?>[]) new LinearRing[rings.size()]; return new Polygon(rings.toArray(ringArr)); }