답변:
PostGIS 1.5에는 새로운 GEOGRAPHY 유형이 도입되었습니다 . 이 GEOGRAPHY
유형을 사용하면 스페 로이드의 투영되지 않은 좌표를 PostGIS 테이블에 저장하고 일부 분석 기능을 수행 할 수 있습니다.
ST_Area
GEOGRAPHY 유형 다각형에 대해 쿼리를 수행하여 면적을 제곱미터로 계산할 수 있습니다.
다음 쿼리 WGS-84
는 GEOGRAPHY
유형을 사용하여 저장되어 있다고 가정 할 때 스페 로이드를 사용하여 모든 다각형의 영역을 출력합니다 (현재는 스페 로이드 만 지원됨) .
SELECT ST_Area(the_geom) FROM table_of_polygons;
스페 로이드의 면적을 계산하는 데 사용되는 알고리즘은 source-code 에서 파생 될 수 있습니다 .
: 여기에 (원래 세계 풍력 포럼에서) 단순 다각형의 영역을 얻을 수 있습니다 몇 가지 코드에 대한 링크입니다 http://forum.worldwindcentral.com/showthread.php?t=20724은 . 이것은 대략 관계에 따라 구체의 문제를 해결합니다.
S = 다각형의 면적; 세타는 라디안 단위의 내부 각도의 합입니다. 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) 좌표의 두 요소 배열입니다. OpenLayers.Util.rad 메소드는도를 라디안으로 변환합니다 (deg * PI / 180).
지리 좌표를 직교 수학을 사용하여 면적을 계산할 수있는 좌표계가있는 투영으로 변환해야합니다.
위도 및 경도를 기반으로 영역을 선택하는 것이 매우 간단하고 영역 전체에서도 왜곡이 최소화되므로 UTM 이 허용되는 표준 투영법 이라고 생각 합니다. 따라서 텍사스 크기의 다각형을 사용하는 경우 UTM Zone 14 N을 사용할 수 있으며 여전히 정확합니다.
다각형이 북극 또는 남극에 있는 경우 UTM 투영이 극에 대해 정확도가 떨어 지므로 대신 UPS 를 사용해야 하며 경계선이 작을수록 신속하게 순회합니다.
점이 직교 친화적 인 좌표계에 있으면 점을 다각형으로 취급하고 면적을 계산할 수 있습니다.
2011-07 년에 PolygonArea 클래스가 GeographicLib에 추가되었습니다. 가장자리가 측지선 인 다각형의 실제 타원 영역을 계산합니다. PostGIS와 달리이 방법에는 수치 적분이 수반되지 않습니다. 문서화 (및 수식이 파생 된 논문에 대한 링크)는 다음을 참조하십시오.
http://geographiclib.sf.net/html/classGeographicLib_1_1PolygonAreaT.html
(PolygonArea의 일반화를 템플릿 클래스에 반영하도록 링크가 수정되었습니다.)