All Downloads are FREE. Search and download functionalities are using the official Maven repository.

io.jeo.mongo.GeoJSON Maven / Gradle / Ivy

/* Copyright 2013 The jeo project. All rights reserved.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package io.jeo.mongo;

import io.jeo.geom.Geom;

import com.mongodb.BasicDBList;
import com.mongodb.BasicDBObject;
import com.mongodb.DBObject;
import com.vividsolutions.jts.geom.Coordinate;
import com.vividsolutions.jts.geom.CoordinateSequence;
import com.vividsolutions.jts.geom.Geometry;
import com.vividsolutions.jts.geom.GeometryCollection;
import com.vividsolutions.jts.geom.GeometryFactory;
import com.vividsolutions.jts.geom.LineString;
import com.vividsolutions.jts.geom.LinearRing;
import com.vividsolutions.jts.geom.MultiLineString;
import com.vividsolutions.jts.geom.MultiPoint;
import com.vividsolutions.jts.geom.MultiPolygon;
import com.vividsolutions.jts.geom.Point;
import com.vividsolutions.jts.geom.Polygon;

public class GeoJSON {

    static DBObject toObject(Geometry g) {
        if (g == null) {
            return null;
        }
    
        Geom.Type type = Geom.Type.from(g);
        switch(type) {
        case POINT:
            return toObject((Point)g);
        case LINESTRING:
            return toObject((LineString)g);
        case POLYGON:
            return toObject((Polygon)g);
        case MULTIPOINT:
            return toObject((MultiPoint)g);
        case MULTILINESTRING:
            return toObject((MultiLineString)g);
        case MULTIPOLYGON:
            return toObject((MultiPolygon)g);
        case GEOMETRYCOLLECTION:
            return toObject((GeometryCollection)g);
        default:
            throw new IllegalArgumentException("Unsupported geometry: " + g);
        }
    }
    
    static Geometry toGeometry(DBObject obj) {
        if (obj == null) {
            return null;
        }
    
        String type = (String) obj.get("type");
        if (type == null) {
            throw new IllegalArgumentException("Object " + obj + " has no type property");
        }
    
        switch(Geom.Type.from(type)) {
        case POINT:
            return toPoint(obj);
        case LINESTRING:
            return toLineString(obj);
        case POLYGON:
            return toPolygon(obj);
        case MULTIPOINT:
            return toMultiPoint(obj);
        case MULTILINESTRING:
            return toMultiLineString(obj);
        case MULTIPOLYGON:
            return toMultiPolygon(obj);
        case GEOMETRYCOLLECTION:
            return toCollection(obj);
        default:
            throw new IllegalArgumentException("Unsupported geometry type: " + type);
        }
    }
    
    static DBObject toObject(Point p) {
        BasicDBList coords = new BasicDBList();
        coords.add(p.getX());
        coords.add(p.getY());
    
        BasicDBObject obj = new BasicDBObject("type", "Point");
        obj.put("coordinates", coords);
        return obj;
    }
    
    static Point toPoint(DBObject obj) {
        BasicDBList list = (BasicDBList) obj.get("coordinates");
        return new GeometryFactory().createPoint(toCoordinate(list));
    }
    
    static DBObject toObject(LineString l) {
        BasicDBObject obj = new BasicDBObject("type", "LineString");
        obj.put("coordinates", toList(l.getCoordinateSequence()));
        return obj;
    }
    
    static LineString toLineString(DBObject obj) {
        BasicDBList list = (BasicDBList) obj.get("coordinates");
        return new GeometryFactory().createLineString(toCoordinates(list));
    }
    
    static DBObject toObject(Polygon p) {
        BasicDBList coords = new BasicDBList();
        coords.add(toList(p.getExteriorRing().getCoordinateSequence()));
        for (int i = 0; i < p.getNumInteriorRing(); i++) {
            coords.add(toList(p.getInteriorRingN(i).getCoordinateSequence()));
        }
        BasicDBObject obj = new BasicDBObject("type", "Polygon");
        obj.put("coordinates", coords);
        return obj;
    }
    
    static Polygon toPolygon(DBObject obj) {
        BasicDBList list = (BasicDBList) obj.get("coordinates");
        return toPolygon(list);
    }
    
    static DBObject toObject(MultiPoint mp) {
        BasicDBObject obj = new BasicDBObject("type", "MultiPoint");
    
        BasicDBList coords = new BasicDBList();
        for (Coordinate c : mp.getCoordinates()) {
            BasicDBList coord = new BasicDBList();
            coord.add(c.x);
            coord.add(c.y);
            coords.add(coord);
        }
        return obj;
    }
    
    static MultiPoint toMultiPoint(DBObject obj) {
        BasicDBList list = (BasicDBList) obj.get("coordinates");
        return new GeometryFactory().createMultiPoint(toCoordinates(list));
    }
    
    static DBObject toObject(MultiLineString ml) {
        BasicDBObject obj = new BasicDBObject("type", "MultiLineString");
        BasicDBList coords = new BasicDBList();
        for (LineString l : Geom.iterate(ml)) {
            coords.add(toList(l.getCoordinateSequence()));
        }
        obj.put("coordinates", coords);
        return obj;
    }
    
    static MultiLineString toMultiLineString(DBObject obj) {
        GeometryFactory gf = new GeometryFactory();
    
        BasicDBList list = (BasicDBList) obj.get("coordinates");
        LineString[] lines = new LineString[list.size()];
    
        for (int i = 0; i < list.size(); i++) {
            lines[i] = gf.createLineString(toCoordinates((BasicDBList)list.get(i)));
        }
    
        return gf.createMultiLineString(lines);
    }
    
    static DBObject toObject(MultiPolygon mp) {
        BasicDBObject obj = new BasicDBObject("type", "MultiPolygon");
        BasicDBList coords = new BasicDBList();
        for (Polygon p : Geom.iterate(mp)) {
            BasicDBList poly = new BasicDBList();
            poly.add(toList(p.getExteriorRing().getCoordinateSequence()));
            for (int i = 0; i < p.getNumInteriorRing(); i++) {
                poly.add(toList(p.getInteriorRingN(i).getCoordinateSequence()));
            }
            coords.add(poly);
        }
        obj.put("coordinates", coords);
        return obj;
    }
    
    static MultiPolygon toMultiPolygon(DBObject obj) {
        GeometryFactory gf = new GeometryFactory();
    
        BasicDBList list = (BasicDBList) obj.get("coordinates");
        Polygon[] polys = new Polygon[list.size()];
        
        for (int i = 0; i < list.size(); i++) {
            polys[i] = toPolygon((BasicDBList)list.get(i));
        }
    
        return gf.createMultiPolygon(polys);
    }
    
    static DBObject toObject(GeometryCollection gc) {
        BasicDBObject obj = new BasicDBObject("type", "GeometryCollection");
        BasicDBList geoms = new BasicDBList();
    
        for (Geometry g : Geom.iterate(gc)) {
            geoms.add(toObject(g));
        }
        return obj;
    }
    
    static GeometryCollection toCollection(DBObject obj) {
        BasicDBList list = (BasicDBList) obj.get("geometries");
    
        Geometry[] geoms = new Geometry[list.size()];
    
        for (int i = 0; i < list.size(); i++) {
            geoms[i] = toGeometry((DBObject) list.get(i));
        }
    
        return new GeometryFactory().createGeometryCollection(geoms);
    }
    
    static BasicDBList toList(CoordinateSequence coordseq) {
        BasicDBList list = new BasicDBList();
    
        for (int i = 0; i < coordseq.size(); i++) {
            BasicDBList sub = new BasicDBList();
            sub.add(coordseq.getOrdinate(i, 0));
            sub.add(coordseq.getOrdinate(i, 1));
            if (coordseq.getDimension() > 2) {
                double z = coordseq.getOrdinate(i, 2);
                if (!Double.isNaN(z)) {
                   sub.add(z);
                }
            }
            list.add(sub);
        }
    
        return list;
    }
    
    static Coordinate toCoordinate(BasicDBList list) {
        return new Coordinate(((Number)list.get(0)).doubleValue(), ((Number)list.get(1)).doubleValue());
    }
    
    static Coordinate[] toCoordinates(BasicDBList list) {
        Coordinate[] coords = new Coordinate[list.size()];
        for (int i = 0; i < list.size(); i++) {
            coords[i] = toCoordinate( (BasicDBList) list.get(i));
        }
        return coords;
    }
    
    static Polygon toPolygon(BasicDBList list) {
        GeometryFactory gf = new GeometryFactory();
    
        LinearRing shell = gf.createLinearRing(toCoordinates((BasicDBList) list.get(0)));
    
        LinearRing[] holes = list.size() > 1 ? new LinearRing[list.size()-1] : null;
        for (int i = 1; i < list.size(); i++) {
            holes[i-1] = gf.createLinearRing(toCoordinates((BasicDBList) list.get(i)));
        }
    
        return new GeometryFactory().createPolygon(shell, holes);
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy