2016-04-06 4 views
3

J'ai besoin d'une fonction Java qui va générer une boîte englobante (rectangle) autour d'un buffer. Le tampon est défini par le point central (coordonnée WGS84) et le rayon (en mètres).Geotools: bounding box pour un tampon dans wgs84

Obtenir un cadre de sélection pour un tampon JTS semble être assez simple:

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

Ceci est cependant géométrie plane pure. Y a-t-il un moyen de faire cela en utilisant un système de référence de coordonnées avec la distance donnée en mètres?

avec Geotools mais optimale d'autres solutions Java également travailler ...

Répondre

1

J'ai fini à l'aide d'un GeodeticCalculator pour trouver manuellement les coins de la boîte. Franchement les résultats ne sont pas très précis, mais c'est la meilleure solution que j'ai trouvé jusqu'à présent:

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

Bien que vous ayez approché d'une autre manière, j'ai une autre solution pour cela. Les résultats seront beaucoup plus précis qu'avec votre solution proposée.

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); 
} 

Et voici la carte avec le résultat, tampon en rouge, enveloppe en noir.

Buffer and envelope