GeoDjango에서 다각형을 다중 다각형으로 일반화 하시겠습니까?


9

models.PolygonFieldpostgres를 데이터베이스로 사용하여 geodjango 로 모델을 설정했습니다 . postgres로 shp를 가져 오려고합니다. 문제는 shp (QGIS로 컴파일 됨)가 다각형과 다중 다각형을 혼합하므로 제약 조건 검사로 인해 항상 내보내기를 수행하지 못하는 것 enforce_geotype입니다.

다중 다각형 및 다각형 유형 데이터를 모두 저장하기 위해 제약 조건을 지우는 방법이 있습니까?

답변:


10

제약 조건을 삭제하는 SQL :

ALTER TABLE myapp_mymodel DROP CONSTRAINT enforce_geotype_mygeom;

또는 다각형 및 다중 다각형을 모두 허용하도록 변경하려면 다음을 수행하십시오.

ALTER TABLE myapp_mymodel DROP CONSTRAINT enforce_geotype_mygeom;
ALTER TABLE myapp_mymodel ADD CONSTRAINT enforce_geotype_mygeom CHECK (geometrytype(mygeom) = 'POLYGON'::text OR geometrytype(mygeom) = 'MULTIPOLYGON'::text OR mygeom IS NULL);

이러한 SQL 문은 South migration 또는 초기 데이터 SQL 스크립트 에서 실행할 수 있습니다 .

또 다른 옵션은 GeometryField장고 모델 정의에서 그것을 만드는 것입니다 -이것은 모든 기하학 유형을 저장할 수있게 해줍니다.

또는 save()모델 의 메소드를 재정 의하여 모든 것을 다중 다각형으로 만듭니다.

from django.contrib.gis.db import models
from django.contrib.gis import geos

class MyModel(models.Model):
  mygeom = models.MultiPolygonField()
  ... other fields....

  def save(self, *args, **kwargs):
    # if mygeom ends up as a Polgon, make it into a MultiPolygon
    if self.mygeom and isinstance(self.mygeom, geos.Polygon):
      self.mygeom = geos.MultiPolygon(self.mygeom)

    super(MyModel).save(*args, **kwargs)

마지막 방법은 좋은 선택이 될 수 있습니다
ChanDon

5

긴 해결 방법

fromstr ()을 사용할 수 있습니다

from django.contrib.gis.geos import fromstr

p = Polygon()
# this seems to work correctly
mp = MultiPolygon(fromstr(str(p)),)

model1.geom_field = mp

model1.save()

4

나는 이것이 오래되었다는 것을 알고 있지만 방금이 문제에 부딪 쳤고 위의 제안 된 솔루션을 사용하는 데 문제가있었습니다.

  • 사용 GeometryField하면 내장 OSMGeoAdmin클래스 를 사용하기가 어렵습니다 . 코드 templates/gis/admin/openlayers.js(그리고 contrib/gis/admin/widgets.py아마도 내가 놓친 다른 장소) 의 코드 는 기하학이 점, 선, 다각형 또는 모음이라고 가정하고 일반적인 기하학을 설명하지 않습니다. 반드시 중요하거나 극복 할 수있는 것은 아니지만 내장 관리자를 사용하려는 경우 실망 할 수 있습니다.

  • save()모델의 형식 검사가 더 빨리 이루어지기 때문에 재정의 가 작동하지 않습니다 __set__().

나의 현재 솔루션은 명시 적으로 내 모든 강요되는 Polygon으로의를 MultiPolygon가져올 때의 내 데이터를 저장. __set__()이것이 성가신 경우 무시할 수 있습니다 .

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.