これには2つの解決策があります:
度メートルに半径を変換および/または、メートル緯度/経度点を変換し、局所的に平面投影の円を算出し、LATに戻し再投影平面問題として
の問題を扱いますlon。 1については
あなたは赤道近くの小さな半径の罰金になりますどのような何か行うことができます:それはより一般的であるように私が第二のためにいくつかのコードを紹介します
GeodeticCalculator calc = new GeodeticCalculator(DefaultGeographicCRS.WGS84);
calc.setStartingGeographicPoint(point.getX(), point.getY());
calc.setDirection(0.0, 10000);
Point2D p2 = calc.getDestinationGeographicPoint();
calc.setDirection(90.0, 10000);
Point2D p3 = calc.getDestinationGeographicPoint();
double dy = p2.getY() - point.getY();
double dx = p3.getX() - point.getX();
double distance = (dy + dx)/2.0;
Polygon p1 = (Polygon) point.buffer(distance);
を(すなわち、それは動作しますより良い半径の範囲で)。
あなたは地元の投影を見つける必要があるまず、GeoToolsはX、Yを中心としたUTM投影である「擬似」投影をAUTO42001,x,y
提供:
public SimpleFeature bufferFeature(SimpleFeature feature, Measure<Double, Length> distance) {
// extract the geometry
GeometryAttribute gProp = feature.getDefaultGeometryProperty();
CoordinateReferenceSystem origCRS = gProp.getDescriptor().getCoordinateReferenceSystem();
Geometry geom = (Geometry) feature.getDefaultGeometry();
Geometry pGeom = geom;
MathTransform toTransform, fromTransform = null;
// reproject the geometry to a local projection
if (!(origCRS instanceof ProjectedCRS)) {
double x = geom.getCoordinate().x;
double y = geom.getCoordinate().y;
String code = "AUTO:42001," + x + "," + y;
// System.out.println(code);
CoordinateReferenceSystem auto;
try {
auto = CRS.decode(code);
toTransform = CRS.findMathTransform(DefaultGeographicCRS.WGS84, auto);
fromTransform = CRS.findMathTransform(auto, DefaultGeographicCRS.WGS84);
pGeom = JTS.transform(geom, toTransform);
} catch (MismatchedDimensionException | TransformException | FactoryException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
だから今pGeom
はメートルで私たちのポイントです。
retGeom = JTS.transform(out, fromTransform);
機能を変更することがいじり少しはそこです:我々は我々が以前に見上げた逆変換を使用してWGS84(緯度/経度)に戻って投影し、今
Geometry out = bufferFeature(pGeom, distance.doubleValue(SI.METER));
簡単ですバッファリングポイントの代わりにポリゴンを返すという事実を反映するためにタイプします。完全なコードはこのgistにあります。
私はそれを実行すると、私は次のような出力が得られます。
POINT (10.840378413128576 3.4152050343701745)
POLYGON ((10.84937634426605 3.4151876838951822, 10.849200076653755 3.413423962919184, 10.84868480171117 3.4117286878605766, 10.847850322146979 3.4101670058279794, 10.846728706726902 3.4087989300555464, 10.845363057862208 3.407677033830687, 10.843805855306746 3.406844430298736, 10.84211693959797 3.406333115754347, 10.840361212705258 3.4061627400701946, 10.838606144204721 3.4063398515107184, 10.836919178768184 3.4068576449605277, 10.835365144548726 3.4076962232621035, 10.834003762019957 3.408823361646906, 10.832887348980522 3.410195745914279, 10.832058809914859 3.411760636805914, 10.831549986992338 3.4134578966399034, 10.831380436105858 3.4152223003379722, 10.831556675029052 3.416986042039048, 10.832071932633442 3.4186813409639054, 10.832906408849936 3.4202430463705085, 10.834028035422469 3.4216111414662183, 10.835393708241908 3.422733050021835, 10.836950943907517 3.4235656570147763, 10.838639896841123 3.424076965623486, 10.840395659406198 3.4242473268789406, 10.842150756595839 3.4240701947133396, 10.843837739370569 3.4235523773972796, 10.845391776937724 3.4227137757216988, 10.846753148314034 3.4215866180136185, 10.847869537398722 3.4202142214154887, 10.848698043354238 3.4186493270628633, 10.849206829051935 3.4169520731645546, 10.84937634426605 3.4151876838951822))
は、私はそれが多角形(またはにGeoJSON定義のhttpを持つ呼ぶのですか、全体の機能およびあなたの主旨からAUXILIARバッファをコピーした:// geojson.org/geojson-spec。html#ポリゴン)の代わりに? – jonayreyes
私は思っていますが、射影に変更してからもう一度戻ると、異なる経度でのメートル/緯度の違いを考慮に入れたいと思っていますか? – Nick
また、#1の方がパフォーマンスが良いですか?これを1M回行う必要があった場合はどうなりますか? – Nick