2016-04-06 13 views
3

Ich brauche eine Java-Funktion, die eine Bounding Box (Rechteck) um einen Puffer erzeugen wird. Der Puffer wird durch den Mittelpunkt (WGS84-Koordinate) und den Radius (in Metern) definiert.Geotools: Bounding Box für einen Puffer in WGS84

einen Begrenzungsrahmen für einen Puffer in JTS Erste scheint ganz einfach zu sein:

Point center = .... 
Geometry boundingBox = center.buffer(...).getEnvelope(); 

Dies ist jedoch rein planare Geometrie. Gibt es eine Möglichkeit, dies mithilfe eines Koordinatenreferenzsystems zu tun, wobei der Abstand in Metern angegeben wird?

Optimal mit Geotools aber auch anderen Java-Lösungen wird auch funktionieren ...

Antwort

1

Ich landete mit einer GeodeticCalculator manuell die Ecken der Box zu finden. Ehrlich gesagt sind die Ergebnisse nicht sehr präzise, ​​aber das ist die beste Lösung, die ich bis jetzt gefunden:

GeometryFactory geometryFactory = JTSFactoryFinder.getGeometryFactory(); 
CoordinateReferenceSystem wgs84 = DefaultGeographicCRS.WGS84; 
GeodeticCalculator geodeticCalculator = new GeodeticCalculator(wgs84); 
geodeticCalculator.setStartingGeographicPoint(center.getX(), center.getY()); 
Coordinate[] coordinates = new Coordinate[5]; 
for (int i = 0; i < 4; i++) { 
    geodeticCalculator.setDirection(-180 + i * 90 + 45, bufferRadiusMeters * Math.sqrt(2)); 
    Point2D point2D = geodeticCalculator.getDestinationGeographicPoint(); 
    coordinates[i] = new Coordinate(point2D.getX(), point2D.getY()); 
} 
coordinates[4] = coordinates[0]; 
Polygon box = geometryFactory.createPolygon(coordinates); 
1

Obwohl Sie es auf eine andere Weise genähert haben, ich habe eine andere Lösung dafür. Die Ergebnisse werden viel genauer sein als bei Ihrer vorgeschlagenen Lösung.

GeometryFactory GEOMETRY_FACTORY = JTSFactoryFinder.getGeometryFactory(); 

// Remember, order is (longitude, latitude) 
Coordinate center = Coordinate(2.29443, 48.85816); 
Point point = GEOMETRY_FACTORY.createPoint(center); 

// Buffer 50KM around the point, then get the envelope 
Envelope envelopeInternal = buffer(point, 50000).getEnvelopeInternal(); 

// Then you can play with the envelope, e.g., 
double minX = envelopeInternal.getMinX(); 
double maxX = envelopeInternal.getMaxX(); 

// The buffer using distanceInMeters 
private Geometry buffer(Geometry geometry, double distanceInMeters) throws FactoryException, TransformException { 
    String code = "AUTO:42001," + geometry.getCentroid().getCoordinate().x + "," + geometry.getCentroid().getCoordinate().y; 
    CoordinateReferenceSystem auto = CRS.decode(code); 

    MathTransform toTransform = CRS.findMathTransform(DefaultGeographicCRS.WGS84, auto); 
    MathTransform fromTransform = CRS.findMathTransform(auto, DefaultGeographicCRS.WGS84); 

    Geometry pGeom = JTS.transform(geometry, toTransform); 
    Geometry pBufferedGeom = pGeom.buffer(distanceInMeters); 
    return JTS.transform(pBufferedGeom, fromTransform); 
} 

Und hier ist die Karte mit dem Ergebnis, Puffer in Rot, Umschlag in schwarz.

Buffer and envelope

Verwandte Themen