回答:
PostGIS 1.5は新しいGEOGRAPHYタイプを導入しました。このGEOGRAPHY
タイプにより、回転楕円体上の投影されていない座標をPostGISテーブルに保存し、それらに対していくつかの解析機能を実行できます。
ST_Area
面積を平方メートルで計算するために、GEOGRAPHYタイプのポリゴンに対してクエリを実行できます。
次のクエリWGS-84
は、GEOGRAPHY
タイプを使用して格納されていると仮定して、スフェロイドを使用してすべてのポリゴンの面積を出力します(現在はスフェロイドのみがサポートされています)。
SELECT ST_Area(the_geom) FROM table_of_polygons;
回転楕円体上の面積を計算するために使用されるアルゴリズムは、source-codeから導出できます。
以下に、単純なポリゴンの領域を生成するコードへのリンクを示します(元々はWorld Wind Forumから):http : //forum.worldwindcentral.com/showthread.php?t=20724。これは、大まかに関係に基づいて、球体上の問題を解決します。
S =ポリゴンの面積。thetaは、ラジアン単位の内角の合計です。nは頂点の数です。rは球の半径です。
参照(式の画像のソース):http : //www.geom.uiuc.edu/docs/reference/CRC-formulas/node59.html
扁平回転楕円体上のポリゴン領域のリンクやコードを見るのは嬉しいです。
ここだ簡素化計算の元、我々はOpenLayersをして作ることが。この方法は、「球体上のポリゴンのアルゴリズム」(Robert。G. ChamberlainおよびWilliam H. Duquette、NASA JPL Publication 07-03)に基づいています。上記にリンクされているコードは、線形リングの領域を決定するためのものです(地理座標を使用)。ポリゴンとマルチポリゴンの領域は、リングから合計されます。
var area = 0.0;
var len = ring.components && ring.components.length;
if (len > 2) {
var p1, p2;
for (var i=0; i<len-1; i++) {
p1 = ring.components[i];
p2 = ring.components[i+1];
area += OpenLayers.Util.rad(p2.x - p1.x) *
(2 + Math.sin(OpenLayers.Util.rad(p1.y)) +
Math.sin(OpenLayers.Util.rad(p2.y)));
}
area = area * 6378137.0 * 6378137.0 / 2.0;
}
リングコンポーネントは、上記のコードのx、y(lon、lat)座標の2つの要素配列です。OpenLayers.Util.radメソッドは、度をラジアンに変換するだけです(deg * PI / 180)。
地理座標を、デカルト数学を使用して面積を計算できる座標系を持つ投影に変換する必要があります。
UTMは、緯度と経度に基づいてゾーンを選択するのが非常に簡単であり、ゾーン間でも歪みが最小限であるため、受け入れられている標準投影法であると考えています。したがって、テキサスのサイズのポリゴンがある場合、UTM Zone 14 Nを使用できますが、それでもかなり正確です。
ポリゴンが北極または南極上にある場合は、代わりにUPSを使用する必要があります。UTM投影は極上での精度が低く、境界が小さくなるにつれて(経度の線に沿っているため)素早くトラバースします。
ポイントがデカルト座標系に適した座標系になったら、それらをグリッド上のポリゴンのように扱い、面積を計算できます。
PolygonAreaクラスは、2011-07にGeographicLibに追加されました。これにより、エッジが測地線であるポリゴンの真の楕円領域が計算されます。PostGISとは異なり、この方法は数値積分を必要としません。文書化(および式が導き出される論文へのリンク)については、
http://geographiclib.sf.net/html/classGeographicLib_1_1PolygonAreaT.html
(PolygonAreaのテンプレートクラスへの一般化を反映するためにリンクが修正されました。)