8

一連の GPS 座標ペアが与えられた場合、多角形 (n-gon) の面積を計算する必要があります。これは比較的小さい (50,000 平方フィート以下)。ジオコードは、ワールド ファイルのデータにアフィン変換を適用して作成されます。

ジオコードをデカルト座標に変換することで、2 段階のアプローチを使用しようとしました。

double xPos = (lon-lonAnchor)*( Math.toRadians( 6378137 ) )*Math.cos( latAnchor );
double yPos = (lat-latAnchor)*( Math.toRadians( 6378137 ) );

次に、外積計算を使用して面積を決定します。

問題は、結果の精度が少しずれていることです (約 1%)。これを改善するために調べられることはありますか?

ありがとう。

4

7 に答える 7

3

ユーザーが頂点をクリックして多角形の面積を計算できるように、Google マップを変更しています。Math.cos(latAnchor) が最初にラジアンであることを確認するまで、正しい領域が得られませんでした

そう:

double xPos = (lon-lonAnchor)*( Math.toRadians( 6378137 ) )*Math.cos( latAnchor );

なりました:

double xPos = (lon-lonAnchor)*( 6378137*PI/180 ) )*Math.cos( latAnchor*PI/180 );

ここで、lon、lonAnchor、latAnchor は度単位です。今では魅力のように機能します。

于 2011-04-28T14:42:43.660 に答える
2

近似値のため、1% のエラーは少し高いようです。実際の測定値または理想的な計算と比較していますか? GPS にもエラーがあり、それが原因である可能性があることに注意してください。

これを行うためのより正確な方法が必要な場合は、この質問に良い答えがあります。より高速な方法を使用する場合は、参照球の代わりに WGS84 ジオイドを使用してデカルト座標 (ECEF) に変換できます。その変換のwiki リンクは次のとおりです。

于 2010-05-18T21:59:49.807 に答える
0

ありがとう、リスキー・パサック!

共有の精神で、Delphi での私の適応は次のとおりです。

interface

uses 
  System.Math; 

TMapGeoPoint = record
  Latitude: Double;
  Longitude: Double;
end;


function AreaInAcres(AGeoPoints: TList<TMapGeoPoint>): Double;

implementation

function AreaInAcres(AGeoPoints: TList<TMapGeoPoint>): Double;
var
  Area: Double;
  i: Integer;
  P1, P2: TMapGeoPoint;
begin
 Area := 0;

 // We need at least 2 points
 if (AGeoPoints.Count > 2) then
 begin
   for I := 0 to AGeoPoints.Count - 1 do
   begin
     P1 := AGeoPoints[i];
     if i < AGeoPoints.Count - 1  then
       P2 := AGeoPoints[i + 1]
     else
       P2 := AGeoPoints[0];
     Area := Area + DegToRad(P2.Longitude - P1.Longitude) * (2 + 
        Sin(DegToRad(P1.Latitude)) + Sin(DegToRad(P2.Latitude)));
    end;

    Area := Area * 6378137 * 6378137 / 2;

  end;

  Area := Abs(Area); //Area (in sq meters)

  // 1 Square Meter = 0.000247105 Acres
  result := Area * 0.000247105;
end;
于 2019-06-03T15:20:35.677 に答える