Search in sources :

Example 1 with OGCConcreteGeometryCollection

use of com.esri.core.geometry.ogc.OGCConcreteGeometryCollection in project pigeon by aseldawy.

the class Connect method exec.

@Override
public DataByteArray exec(Tuple b) throws IOException {
    try {
        // Read information from input
        Iterator<Tuple> firstPointIdIter = ((DataBag) b.get(0)).iterator();
        Iterator<Tuple> lastPointIdIter = ((DataBag) b.get(1)).iterator();
        Iterator<Tuple> shapesIter = ((DataBag) b.get(2)).iterator();
        // Shapes that are created after connected line segments
        Vector<OGCGeometry> createdShapes = new Vector<OGCGeometry>();
        Vector<OGCLineString> linestrings = new Vector<OGCLineString>();
        Vector<Long> firstPointId = new Vector<Long>();
        Vector<Long> lastPointId = new Vector<Long>();
        while (firstPointIdIter.hasNext() && lastPointIdIter.hasNext() && shapesIter.hasNext()) {
            OGCGeometry geom = geometryParser.parseGeom(shapesIter.next().get(0));
            long first_point_id = (Long) firstPointIdIter.next().get(0);
            long last_point_id = (Long) lastPointIdIter.next().get(0);
            if (geom.isEmpty()) {
            // Skip empty geometries
            } else if (geom instanceof OGCPolygon) {
                // Copy to output directly. Polygons cannot be connected to other shapes.
                createdShapes.add(geom);
            } else if (geom instanceof OGCLineString) {
                linestrings.add((OGCLineString) geom);
                firstPointId.add(first_point_id);
                lastPointId.add(last_point_id);
            } else {
                throw new GeoException("Cannot connect shapes of type " + geom.getClass());
            }
        }
        if (firstPointIdIter.hasNext() || lastPointIdIter.hasNext() || shapesIter.hasNext()) {
            throw new ExecException("All parameters should be of the same size (" + firstPointId.size() + "," + lastPointId.size() + "," + linestrings.size() + ")");
        }
        // Stores an ordered list of line segments in current connected block
        Vector<OGCLineString> connected_lines = new Vector<OGCLineString>();
        // Total number of points in all visited linestrings
        int sumPoints = 0;
        // Which linestrings to reverse upon connection
        Vector<Boolean> reverse = new Vector<Boolean>();
        long first_point_id = -1;
        long last_point_id = -1;
        // Reorder linestrings to form a contiguous list of connected linestrings
        while (!linestrings.isEmpty()) {
            // Loop invariant:
            // At the beginning of each iteration, the lines in connected_lines are connected.
            // In each iteration, we move one linestring from linestrings to connected_lines
            // while keeping them connected
            int size_before = connected_lines.size();
            for (int i = 0; i < linestrings.size(); ) {
                if (connected_lines.isEmpty()) {
                    // First linestring
                    first_point_id = firstPointId.remove(i);
                    last_point_id = lastPointId.remove(i);
                    reverse.add(false);
                    sumPoints += linestrings.get(i).numPoints();
                    connected_lines.add(linestrings.remove(i));
                } else if (lastPointId.get(i) == first_point_id) {
                    // This linestring goes to the beginning of the list as-is
                    lastPointId.remove(i);
                    first_point_id = firstPointId.remove(i);
                    sumPoints += linestrings.get(i).numPoints();
                    connected_lines.add(0, linestrings.remove(i));
                    reverse.add(0, false);
                } else if (firstPointId.get(i) == first_point_id) {
                    // Should go to the beginning after being reversed
                    firstPointId.remove(i);
                    first_point_id = lastPointId.remove(i);
                    sumPoints += linestrings.get(i).numPoints();
                    connected_lines.add(0, linestrings.remove(i));
                    reverse.add(0, true);
                } else if (firstPointId.get(i) == last_point_id) {
                    // This linestring goes to the end of the list as-is
                    firstPointId.remove(i);
                    last_point_id = lastPointId.remove(i);
                    sumPoints += linestrings.get(i).numPoints();
                    connected_lines.add(linestrings.remove(i));
                    reverse.add(false);
                } else if (lastPointId.get(i) == last_point_id) {
                    // Should go to the end after being reversed
                    lastPointId.remove(i);
                    last_point_id = firstPointId.remove(i);
                    sumPoints += linestrings.get(i).numPoints();
                    connected_lines.add(linestrings.remove(i));
                    reverse.add(true);
                } else {
                    i++;
                }
            }
            if (connected_lines.size() == size_before || linestrings.isEmpty()) {
                // Cannot connect any more lines to the current block. Emit as a shape
                boolean isPolygon = first_point_id == last_point_id;
                Point[] points = new Point[sumPoints - connected_lines.size() + (isPolygon ? 0 : 1)];
                int n = 0;
                for (int i = 0; i < connected_lines.size(); i++) {
                    OGCLineString linestring = connected_lines.get(i);
                    boolean isReverse = reverse.get(i);
                    int last_i = (isPolygon || i < connected_lines.size() - 1) ? linestring.numPoints() - 1 : linestring.numPoints();
                    for (int i_point = 0; i_point < last_i; i_point++) {
                        points[n++] = (Point) linestring.pointN(isReverse ? linestring.numPoints() - 1 - i_point : i_point).getEsriGeometry();
                    }
                }
                MultiPath multi_path = isPolygon ? new Polygon() : new Polyline();
                for (int i = 1; i < points.length; i++) {
                    Segment segment = new Line();
                    segment.setStart(points[i - 1]);
                    segment.setEnd(points[i]);
                    multi_path.addSegment(segment, false);
                }
                createdShapes.add(isPolygon ? new OGCPolygon((Polygon) multi_path, 0, SpatialReference.create(4326)) : new OGCLineString((Polyline) multi_path, 0, SpatialReference.create(4326)));
                // Re-initialize all data structures to connect remaining lines
                if (!linestrings.isEmpty()) {
                    connected_lines.clear();
                    reverse.clear();
                    sumPoints = 0;
                }
            }
        }
        if (createdShapes.size() == 1) {
            return new DataByteArray(createdShapes.get(0).asBinary().array());
        } else if (createdShapes.size() > 1) {
            OGCGeometryCollection collection = new OGCConcreteGeometryCollection(createdShapes, createdShapes.get(0).getEsriSpatialReference());
            return new DataByteArray(collection.asBinary().array());
        } else {
            throw new GeoException("No shapes to connect");
        }
    } catch (Exception e) {
        throw new GeoException(e);
    }
}
Also used : OGCGeometry(com.esri.core.geometry.ogc.OGCGeometry) OGCLineString(com.esri.core.geometry.ogc.OGCLineString) Segment(com.esri.core.geometry.Segment) OGCPolygon(com.esri.core.geometry.ogc.OGCPolygon) OGCGeometryCollection(com.esri.core.geometry.ogc.OGCGeometryCollection) OGCConcreteGeometryCollection(com.esri.core.geometry.ogc.OGCConcreteGeometryCollection) OGCPolygon(com.esri.core.geometry.ogc.OGCPolygon) Polygon(com.esri.core.geometry.Polygon) Vector(java.util.Vector) DataByteArray(org.apache.pig.data.DataByteArray) MultiPath(com.esri.core.geometry.MultiPath) DataBag(org.apache.pig.data.DataBag) ExecException(org.apache.pig.backend.executionengine.ExecException) Point(com.esri.core.geometry.Point) Point(com.esri.core.geometry.Point) IOException(java.io.IOException) ExecException(org.apache.pig.backend.executionengine.ExecException) Line(com.esri.core.geometry.Line) Polyline(com.esri.core.geometry.Polyline) Tuple(org.apache.pig.data.Tuple)

Example 2 with OGCConcreteGeometryCollection

use of com.esri.core.geometry.ogc.OGCConcreteGeometryCollection in project pigeon by aseldawy.

the class Union method union.

protected static OGCGeometry union(Tuple input) throws ExecException {
    DataBag values = (DataBag) input.get(0);
    if (values.size() == 0)
        return null;
    ArrayList<OGCGeometry> all_geoms = new ArrayList<OGCGeometry>();
    for (Tuple one_geom : values) {
        OGCGeometry parsedGeom = geometryParser.parseGeom(one_geom.get(0));
        all_geoms.add(parsedGeom);
    }
    // Do a union of all_geometries in the recommended way (using buffer(0))
    OGCGeometryCollection geom_collection = new OGCConcreteGeometryCollection(all_geoms, all_geoms.get(0).getEsriSpatialReference());
    return geom_collection.union(all_geoms.get(0));
}
Also used : OGCGeometry(com.esri.core.geometry.ogc.OGCGeometry) DataBag(org.apache.pig.data.DataBag) OGCGeometryCollection(com.esri.core.geometry.ogc.OGCGeometryCollection) ArrayList(java.util.ArrayList) OGCConcreteGeometryCollection(com.esri.core.geometry.ogc.OGCConcreteGeometryCollection) Tuple(org.apache.pig.data.Tuple)

Example 3 with OGCConcreteGeometryCollection

use of com.esri.core.geometry.ogc.OGCConcreteGeometryCollection in project pigeon by aseldawy.

the class Extent method extent.

protected static OGCGeometry extent(Tuple input) throws ExecException {
    DataBag values = (DataBag) input.get(0);
    if (values.size() == 0)
        return null;
    ArrayList<OGCGeometry> all_geoms = new ArrayList<OGCGeometry>();
    for (Tuple one_geom : values) {
        OGCGeometry parsedGeom = geometryParser.parseGeom(one_geom.get(0));
        all_geoms.add(parsedGeom);
    }
    // Do a union of all_geometries in the recommended way (using buffer(0))
    OGCGeometryCollection geom_collection = new OGCConcreteGeometryCollection(all_geoms, all_geoms.get(0).getEsriSpatialReference());
    return geom_collection.envelope();
}
Also used : OGCGeometry(com.esri.core.geometry.ogc.OGCGeometry) DataBag(org.apache.pig.data.DataBag) OGCGeometryCollection(com.esri.core.geometry.ogc.OGCGeometryCollection) ArrayList(java.util.ArrayList) OGCConcreteGeometryCollection(com.esri.core.geometry.ogc.OGCConcreteGeometryCollection) Tuple(org.apache.pig.data.Tuple)

Example 4 with OGCConcreteGeometryCollection

use of com.esri.core.geometry.ogc.OGCConcreteGeometryCollection in project presto by prestodb.

the class EsriGeometrySerde method readGeometryCollection.

private static OGCConcreteGeometryCollection readGeometryCollection(BasicSliceInput input, Slice inputSlice) {
    // GeometryCollection: geometryType|len-of-shape1|bytes-of-shape1|len-of-shape2|bytes-of-shape2...
    List<OGCGeometry> geometries = new ArrayList<>();
    while (input.available() > 0) {
        int length = input.readInt() - 1;
        GeometrySerializationType type = GeometrySerializationType.getForCode(input.readByte());
        geometries.add(readGeometry(input, inputSlice, type, length));
    }
    return new OGCConcreteGeometryCollection(geometries, null);
}
Also used : OGCGeometry(com.esri.core.geometry.ogc.OGCGeometry) ArrayList(java.util.ArrayList) OGCConcreteGeometryCollection(com.esri.core.geometry.ogc.OGCConcreteGeometryCollection) OGCPoint(com.esri.core.geometry.ogc.OGCPoint) MultiPoint(com.esri.core.geometry.MultiPoint) OGCMultiPoint(com.esri.core.geometry.ogc.OGCMultiPoint) Point(com.esri.core.geometry.Point)

Example 5 with OGCConcreteGeometryCollection

use of com.esri.core.geometry.ogc.OGCConcreteGeometryCollection in project presto by prestodb.

the class EsriGeometrySerde method writeGeometry.

private static void writeGeometry(DynamicSliceOutput output, OGCGeometry geometry) {
    GeometryType type = GeometryType.getForEsriGeometryType(geometry.geometryType());
    switch(type) {
        case POINT:
            writePoint(output, geometry);
            break;
        case MULTI_POINT:
            writeSimpleGeometry(output, GeometrySerializationType.MULTI_POINT, geometry);
            break;
        case LINE_STRING:
            writeSimpleGeometry(output, GeometrySerializationType.LINE_STRING, geometry);
            break;
        case MULTI_LINE_STRING:
            writeSimpleGeometry(output, GeometrySerializationType.MULTI_LINE_STRING, geometry);
            break;
        case POLYGON:
            writeSimpleGeometry(output, GeometrySerializationType.POLYGON, geometry);
            break;
        case MULTI_POLYGON:
            writeSimpleGeometry(output, GeometrySerializationType.MULTI_POLYGON, geometry);
            break;
        case GEOMETRY_COLLECTION:
            verify(geometry instanceof OGCConcreteGeometryCollection);
            writeGeometryCollection(output, (OGCConcreteGeometryCollection) geometry);
            break;
        default:
            throw new IllegalArgumentException("Unsupported geometry type: " + type);
    }
}
Also used : GeometryType(com.facebook.presto.geospatial.GeometryType) OGCConcreteGeometryCollection(com.esri.core.geometry.ogc.OGCConcreteGeometryCollection)

Aggregations

OGCConcreteGeometryCollection (com.esri.core.geometry.ogc.OGCConcreteGeometryCollection)7 OGCGeometry (com.esri.core.geometry.ogc.OGCGeometry)6 ArrayList (java.util.ArrayList)5 OGCGeometryCollection (com.esri.core.geometry.ogc.OGCGeometryCollection)4 DataBag (org.apache.pig.data.DataBag)4 Tuple (org.apache.pig.data.Tuple)4 Point (com.esri.core.geometry.Point)3 GeometryCursor (com.esri.core.geometry.GeometryCursor)1 Line (com.esri.core.geometry.Line)1 ListeningGeometryCursor (com.esri.core.geometry.ListeningGeometryCursor)1 MultiPath (com.esri.core.geometry.MultiPath)1 MultiPoint (com.esri.core.geometry.MultiPoint)1 Polygon (com.esri.core.geometry.Polygon)1 Polyline (com.esri.core.geometry.Polyline)1 Segment (com.esri.core.geometry.Segment)1 OGCLineString (com.esri.core.geometry.ogc.OGCLineString)1 OGCMultiPoint (com.esri.core.geometry.ogc.OGCMultiPoint)1 OGCPoint (com.esri.core.geometry.ogc.OGCPoint)1 OGCPolygon (com.esri.core.geometry.ogc.OGCPolygon)1 GeometryType (com.facebook.presto.geospatial.GeometryType)1