2017-02-08 9 views
1

포인트와 직사각형이 실제 경도와 위도를 기반으로하는 직사각형 내에있는 모든 점을 반환하는 쿼리를 실행하고 싶습니다. Geoalchemy2 & ST_Within - 점과 다각형 사이의 유형이 일치하지 않습니까?

실패 쿼리입니다 :

results = session.query(Store.id).filter(func.ST_Within(Store.location, func.ST_GeomFromEWKT('SRID=4326;POLYGON((150 -33, 152 -33, 152 -31, 150 -31, 150 -33))'))) 

그것은 불평없이 실행되지만) (results.first 호출 할 때, 나는 다음과 같은 오류 및 경고 참조 :

sqlalchemy.exc.ProgrammingError: (psycopg2.ProgrammingError) function st_within(geography, geometry) does not exist LINE 3: WHERE ST_Within(store.location, ST_GeomFromEWKT('SRID=4326;P... ^ HINT: No function matches the given name and argument types. You might need to add explicit type casts. [SQL: 'SELECT store.id AS store_id \nFROM store \nWHERE ST_Within(store.location, ST_GeomFromEWKT(%(ST_GeomFromEWKT_1)s )) \n LIMIT %(param_1)s'] [parameters: {'ST_GeomFromEWKT_1': 'SRID=4326;POLYGON((150 -33, 152 -33, 152 -31, 150 -31, 150 -33))', 'param_1': 1}]

내가 할 수 그러나 쿼리는 쿼리에 더미 포인트를 만들어서 (모든 저장소가 일치하도록 만듭니다) :

results = session.query(Store.id).filter(func.ST_Within(func.ST_GeomFromEWKT('SRID=4326;POINT(151 -32)'), func.ST_GeomFromEWKT('SRID=4326;POLYGON((150 -33, 152 -33, 152 -31, 150 -31, 150 -33))'))) 

이것은 문제가 내 Store.location 필드임을 나타내지 만, [type_coerce (Store.location, Geoography)를 포함하여] 아무 것도 시도하지 않았습니다.

이이 위치 열의 내 SQLAlchemy의 정의입니다 :

location = Column(Geography(geometry_type='POINT', srid=4326)) 

이 나는 ​​위치에 경도 & 위도를 설정하는 실행 코드 (그리고 나는 또한 func.ST_GeomFromEWKT를 사용 해봤이다() 강요하는 유형) :

stores = session.query(Store) 
for store in stores: 
    store.location = 'SRID=4326;POINT({} {})'.format(store.longitude, store.latitude) 
session.commit() 

파이썬은 Store.location의 유형은 'geoalchemy2.elements.WKBElement가'나는 문서에서 기대할 수있는 것 인 것을 알려줍니다.

누구든지 검색어를 수정하는 방법에 대한 제안 사항이 있습니까?

참고

내가 실행 해요 :

  • 의 PostgreSQL 9.6.1
  • psycopg2 2.6.2
  • SQLAlchemy의 1.1.4 및
  • Geoalchemy2 0.4.0

답변

0

감사합니다 다른 곳 (Mike Bayer와 Greg Baker)에서 도움을 받으려면 답변을 게시 할 수 있습니다.

  1. 내 포인트 유형의 지리이었다 내 다각형 형태의 기하학, 그리고 ST_Within에 포함
  2. 다른 많은 PostGIS와 기능, 지역 (즉, 그들은 단지 지원 형상을 지원하지 않습니다

    문제는 것이 었습니다).

대답은 쿼리에서 Geography를 Geometry로 캐스팅하는 것입니다. 다음 쿼리는 작동합니다

results = session.query(Store.id).filter(func.ST_Within(cast(Store.location, Geometry), func.ST_GeomFromEWKT('SRID=4326;POLYGON((150 -33, 152 -33, 152 -31, 150 -31, 150 -33))'))) 

지리와 기하학의 차이에 대한 추가 정보를 참조 http://workshops.boundlessgeo.com/postgis-intro/geography.html#why-not-use-geography