2012-11-12 6 views
2

Postgis를 사용하여 GeoDjango를 구현했습니다. 내가 data.area 그것이 float를 반환 부르지 만,이 측정 단위입니다에 대해 내가 어떤 단서를 가지고 있지 않은 경우GeoDjango 폴리곤 영역

... 
    geometria = models.PolygonField(srid=4326, null=True) 
    ... 

, 내가 원하는 때문에 문제가있다 : 여기

내 모델입니다 사전 설정된 영역이 제곱미터보다 큰지 테스트합니다.

도와 주시겠습니까? 지도에서 넓은 영역을 처리하는 경우

답변

3

, 당신은

geometria = models.PolygonField(srid=4326, null=True, geography=True) 
geodjango의 문서에서 언급 한 바와 같이

https://docs.djangoproject.com/en/dev/ref/contrib/gis/model-api/#geography

PostGIS와 1.5에서 지리 유형이, 지리 유형이 도입 된 설정해야합니다 - 은 지리 좌표 (예 : WGS84 경도/위도)로 표시된 공간 기능에 대한 기본 지원을 제공합니다. [7] 지리 유형에 사용되는 평면 인 과 달리 지형 유형은 구형 데이터를 사용합니다. 지리 열에서 수행되는 거리 및 측정 작업 은 자동으로 큰 원호 호 계산을 사용하고 선형 단위를 반환합니다. 즉, ST_Distance 이 두 곳에서 호출 될 때 미터 단위의 값이 리턴됩니다 (WGS84의 Geometry C 럼에서 호출 될 경우도는 과 대등합니다). 당신이 geography=True이없는 경우

, 우리는 일반 형상으로 물건을 저장하는, 우리는 우리가 면적을 계산 할 수 없기 때문에 당신이 선호하는 측정 단위로 (부동 소수점 결과는 당신이지고) square degrees에서 변환을 수행해야합니다 지리적 좌표에서. 우리는 대신에 변환을 할 수있는 투영 좌표 공간에 도우미 메서드를 추가 할 수 있습니다

def get_acres(self): 
    """ 
    Returns the area in acres. 
    """ 
    # Convert our geographic polygons (in WGS84) 
    # into a local projection for New York (here EPSG:32118) 
    self.polygon.transform(32118) 
    meters_sq = self.polygon.area.sq_m 

    acres = meters_sq * 0.000247105381 # meters^2 to acres 

    return acres 
데이터의 정도에 따라 달라집니다, 어떻게 정확하게 우리가 결과를 필요로 투사 우리가 사용하는

: 여기에 내가했습니다 뉴욕의 일부분에 대한 특정 투영과 함께 설명되어 있지만, 데이터가 특별히 정확하지 않은 경우 전역 투영을 쉽게 대체하거나 간단한 수식을 사용할 수 있습니다.

+1

self.polygon.area는 float를 반환하므로 sq_m 속성이 없습니다. – rawbeans