2016-04-06 30 views
3

Bir arabellek etrafında bir sınırlayıcı kutu (dikdörtgen) oluşturacak bir Java işlevine ihtiyacım var. Tampon, merkez nokta (WGS84 koordinat) ve yarıçap (metre cinsinden) ile tanımlanır. OTS bir tampon için bir sınırlayıcı kutu almaGeotools: wgs84 içinde bir arabellek için sınırlayıcı kutu

oldukça basit görünmektedir:

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

Ancak bu saf düzlemsel geometri. Metrelerde verilen mesafeyle koordinat referans sistemi kullanarak bunu yapmanın bir yolu var mı? GeoTools ancak diğer Java çözümleri de çalışacaktır ile Optimal

...

cevap

1

Ben GeodeticCalculator elle kutunun köşelerini bulmaya kullanarak sona erdi. Açıkçası sonuçları çok kesin değildir, ancak ben şimdiye kadar bulunan en iyi çözüm:

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

başka bir açıdan yaklaştı olmasına rağmen, bunun için başka bir çözüm var. Sonuçlar önerilen çözümden çok daha kesin olacaktır.

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

Ve burada sonuç, tamponda kırmızı, siyah zarfla eşlenen bir harita.

Buffer and envelope