web-dev-qa-db-ja.com

地理的なポイントと特定のポリゴンの間の距離をメートル単位で計算するにはどうすればよいですか?

まず、私はGISを初めて使用するので、間違いは許してください。緯度と経度のポイントと緯度/経度のポリゴン(正多角形かどうか)の間の距離を見つける必要があります。正確には、以下に示すように、特定のポイントからポリゴンの境界内のポイントまでの最小距離を見つける必要があります。この例では、点pからポリゴンまでの距離はdです。注:ポイントは必要ありません。最小距離だけが必要です。

Problem Illustration

少し読んだ後、GeoToolsAPIを使用した次の最小限の作業例を思いつきました。しかし、私は出力を台無しにしていると思います。 mteresでポイントとポリゴンの間の最小距離を取得する方法を誰かに教えてもらえますか?

MWE.Java:

import com.vividsolutions.jts.geom.Coordinate;
import com.vividsolutions.jts.geom.Geometry;
import com.vividsolutions.jts.geom.GeometryFactory;
import com.vividsolutions.jts.geom.Point;

public class MWE {

    public static void main(String[] args) throws Exception {
        GeometryFactory gf = JTSFactoryFinder.getGeometryFactory();

        Coordinate[] c = new Coordinate[5];
        c[0] = new Coordinate(-49.242986, -16.662430);
        c[1] = new Coordinate(-49.241999, -16.664465);
        c[2] = new Coordinate(-49.239146, -16.663828);
        c[3] = new Coordinate(-49.239832, -16.661443);
        c[4] = new Coordinate(-49.242986, -16.662430);

        Geometry geo = gf.createPolygon(c);

        Point p = gf.createPoint(new Coordinate(-49.246870, -16.665493));

        double distance = geo.distance(p);

        System.out.println("Distance: " + distance);

    }
}
12

したがって、実行していることは正しいですが、距離はメートルではなく測地単位(弧の度)で返されます。 2つのオプションがあります。

  1. ポイントとポリゴンのジオメトリを平面参照システムに変換します http://docs.geotools.org/latest/tutorials/geometry/geometrycrs.html
  2. GeodeticCalculatorを使用する http://docs.geotools.org/stable/userguide/library/referencing/calculator.html

GeodeticCalculatorを使用するには、ポリゴン境界上のポイントに最も近いポイントを決定する必要があります。例えばDistanceOp.closestPoints(geo, p)[0]

// adapted from http://docs.geotools.org/stable/userguide/library/referencing/calculator.html
CoordinateReferenceSystem crs = CRS.decode("EPSG:4326");
GeodeticCalculator gc = new GeodeticCalculator(crs);
gc.setStartingPosition( JTS.toDirectPosition(  DistanceOp.closestPoints(geo, p)[0], crs ) );
gc.setDestinationPosition( JTS.toDirectPosition( p, crs ) );

double distance = gc.getOrthodromicDistance();
8
aengus