4

ポリゴンの面積を計算するために使用したい緯度/経度座標のリストがあります。多くの場合、正確に取得できますが、ポリゴンが大きくなるほど、エラーが発生する可能性が高くなります。

最初に、 http://www.ibm.com/developerworks/java/library/j-coordconvert/を使用して座標をUTMに変換しています。

そこから、http://www.mathopenref.com/coordpolygonarea2.htmlを使用してUTM座標の面積を計算しています。

private Double polygonArea(int[] x, int[] y) {      
    Double area = 0.0;
    int j = x.length-1;
    for(int i = 0; i < x.length; i++) {
        area = area + (x[j]+x[i]) * (y[j]-y[i]);
        j = i;
    }
    area = area/2;
    if (area < 0)
        area = area * -1;
    return area;
}

これらの領域を、Microsoft SQL ServerとArcGISに配置したのと同じ座標と比較しますが、常に正確に一致させることはできないようです。これよりも正確な方法を知っている人はいますか?

前もって感謝します。

編集1

コメントありがとうございます。エリアを取得するための私のコードは次のとおりです(CoordinateConversionコードは上記のIBMリンクにリストされています)。

private Map<Integer, GeoPoint> vertices;

private Double getArea() {
    List<Integer> xpoints = new ArrayList<Integer>();
    List<Integer> ypoints = new ArrayList<Integer>();
    CoordinateConversion cc = new CoordinateConversion();
    for(Entry<Integer, GeoPoint> itm : vertices.entrySet()) {
        GeoPoint pnt = itm.getValue();
        String temp = cc.latLon2MGRUTM(pnt.getLatitudeE6()/1E6, pnt.getLongitudeE6()/1E6);
        // Example return from CC: 02CNR0634657742
        String easting = temp.substring(5, 10);
        String northing = temp.substring(10, 15);
        xpoints.add(Integer.parseInt(easting));
        ypoints.add(Integer.parseInt(northing));
    }

    int[] x = toIntArray(xpoints);
    int[] y = toIntArray(ypoints); 
    return polygonArea(x,y);
}

ポイントのリストの例を次に示します。

44.80016800 -106.40808100
44.80016800 -106.72123800
44.75016800 -106.72123800
44.75016800 -106.80123800
44.56699100 -106.80123800

ArcGISおよびMSSQLサーバーでは、90847.0エーカーを取得します。上記のコードを使用すると、90817.4エーカーになります。

ポイントの別の例のリスト:

45.78412600 -108.51506700
45.78402600 -108.67972100
45.75512200 -108.67949400
45.75512200 -108.69962300
45.69795400 -108.69929400

ArcGISおよびMSSQLサーバーでは、15732.9エーカーを取得します。上記のコードを使用すると、15731.9エーカーになります。

4

2 に答える 2

0

使用している面積式は、平面でのみ有効です。ポリゴンが大きくなると、地球の曲率が影響を及ぼし始め、この式で計算した面積よりも面積が大きくなります。球の表面で機能する式を見つける必要があります。

「球面上のポリゴンの領域」をGoogleで検索すると、多数のヒットが見つかります。その中で最も興味深いのは、Wolfram MathWorldSphericalPolygonです。

于 2012-06-06T17:32:31.497 に答える
0

UTMは、私が探していた極端な精度を得ることができませんでした。投影システムをAlbersやStatePlaneなどのより正確なものに切り替えると、はるかに正確な計算が可能になりました。

于 2013-03-14T16:31:20.347 に答える