2010-08-23 5 views
6

postGIS에서 GeoDjango를 처음 사용합니다. 설치 후 모든 것이 잘 실행되는 일부 테스트에서 테이블 행이 커질 때 쿼리 성능이 걱정됩니다.geoDjango로 postGIS의 성능이 필요합니다

Google 지오 코딩 (WGS84 또는 SRID 4326)에서 가져온 지오메트리 포인트 경도 및 위도에 저장하고 있습니다. 내 문제는 거리 작업이 내 응용 프로그램에서 매우 일반적이라는 것입니다. 나는 종종 랜드 마크에서 가까운 곳으로 가야한다. 지오메트리 수학은 매우 복잡하므로 공간 인덱스가 있어도 가까운 지역에서 1000 개 이상의 지형지 물을 보유하는 데 너무 오래 걸릴 수 있습니다.

거리 연산을 빠르게 수행하기 위해이 지오메트리 형식을 투사 할 방법이 있습니까? 이 포인트 중 일부를 포함하는 Google지도를 렌더링 할 수있는 장고 라이브러리를 아는 사람이 있습니까?

GeoDjango에서 공간 쿼리 속도를 높이는 방법에 대한 조언이 있으십니까?

+1

실제로 명확히하기 위해 PostGIS의 성능 문제가 실제로 발생합니까? 어떤 일이 생길지 걱정되면 조기 최적화에 저항하십시오! 많은 사람들이 수백만 건의 레코드가있는 테이블을 사용하여 좋은 결과를 얻습니다. 거리 검색어에 대한 추가 정보 : http://www.bostongis.com/?content_name = postgis_tut02 # 21 – tcarobruce

+0

글쎄, 아직 성능 문제가 없었지만 조기 최적화라고 부를지는 모르겠다. GeoDjango가 필요할 때마다 어려움에 처할 것이라는 것을 알아야합니다. postGIS를 알고 있고 && 및 오버랩 상자를 사용하여 거리 쿼리를 개선하는 방법을 알고 있습니다. 예를 들어 GeoDjango가 이것을 사용합니까? 반면에 나는 정밀도가 까다롭지 않으므로 가격이 책정되기 때문에 기하학을 사용하지 않아야합니다. – maraujop

답변

0

일반적으로 GeoDjango는 적절한 경우 기하학 열에 공간 인덱스를 만들고 사용합니다.

주로 점 사이의 거리를 다루는 응용 프로그램의 경우 Geography type (PostGIS 1.5에서 소개되고 GeoDjango에서 지원됨)이 적합 할 수 있습니다. GeoDjango는 "WGS84 거리 쿼리에서 성능이 훨씬 우수합니다"라고 말합니다. [link].

+1

사실, http://docs.djangoproject.com/ko/1.2/ref/contrib/gis/model-api/#spatial-index 에서 읽을 수 있습니다. GeometryField.spatial_index -> 기본값은 True입니다. 지정된 지오메트리 필드에 대한 공간 인덱스를 만듭니다. Django는 안정적인 버전 1.2.1 이후 지리 유형을 지원하므로 꽤 새롭습니다. 문서에서 당신은 또한 읽을 수 있습니다 : 지리학 계산에 더 많은 수학이 포함되어 있기 때문에 : http://docs.djangoproject.com/en/dev/ref/contrib/gis/model-api/#selecting-an-srid 그래서 내가 묻는 것은 지리학이 정말 잘 맞는 것인가? 제대로 확장 될 것인가? – maraujop

3

거리 계산과 같은 작업에 필요한 수학 호출 수가 적기 때문에 작업 영역을지도 투영에 맞출 수 있다면 항상 빠릅니다. 그러나 진정한 글로벌 데이터를 가지고 있다면 지리학을 사용하십시오. 미국 대륙 데이터 만있는 경우 EPSG와 같은 것을 사용하십시오. 2163 http://spatialreference.org/ref/epsg/2163/

작업 영역의 제약이 더 클수록지도 투영에서보다 정확한 결과를 얻을 수 있습니다. 미국의 지역에 대한 제한적이고 정확한 예측에 대한 주 평면 투영을 참조하십시오. 또는보다 큰 하위 국가 지역에 대한 UTM 예측.

+0

투영 속도는 빠르지 만 스페인 지형 데이터를 관리하고 GeoDjango에서 변형, 저장 및 처리하는 방법을 모르겠습니다. 동시에 Google에서 제공 한 점수가 SRID 4326 또는 EPSG 900913인지 확인하지 못합니다. – maraujop

+1

Google API는 EPSG : 4326에서 좌표를 반환하고 사용합니다. 스페인의 계획된 시스템의 경우 EPSG : 25831을 시도하십시오. –

2

이 주제에 대해 연구 중입니다. 내가 아는 한 지리 라이브러리에서 가져온 좌표는 SRID 4326 형식이므로 문제없이 지오메트리 필드 유형에 저장할 수 있습니다. 그 정확한 순서에서 PointField에 위도/경도를 전달하는 데 매우 조심 그런데

class Landmark(models.Model): 
    point = models.PointField(spatial_index = True, 
          srid = 4326, 
          geography = True) 

    objects = models.GeoManager() 

:이 GeoDjango 모델을 사용하여 형상의 예가 될 것입니다. geopy는 위도/경도 좌표를 반환하므로 좌표를 반대로해야합니다.

한 좌표계의 점을 다른 좌표계로 변환하려면 GeoDjango에서 GEOS를 사용할 수 있습니다. 예제에서 나는 유명한 구글 투사 900,913에 4326에 포인트를 변환됩니다

from django.contrib.gis.geos import Point 
punto = Point(40,-3) 
punto.set_srid(900913) 
punto.transform(4326) 
punto.wkt 
Out[5]: 'POINT (0.0003593261136478 -0.0000269494585230)' 

우리가 더 나은 성능 수학있을 것이다 프로젝션 시스템에서 좌표를 저장할 수있는이 방법을. 관리 사이트 인터페이스에서 Google지도의 포인트를 표시합니다. this great article을 사용할 수 있습니다.

지형 유형을 계속 사용하기로 결정 했으므로 성능을 개선해야 할 경우를 대비하여 향후에 변환 할 예정입니다.

관련 문제