경계 상자 내의 모든 점을 선택하십시오


11

이전 에이 질문을 보았지만 시도중인 답변이 작동하지 않습니다.

경계 상자 내에있는 모든 OSM 방법을 쿼리하려고합니다. OSM 데이터는 기본 구형 메르카토르로 가져 왔습니다. LAT / LON을 사용하여 쿼리하므로 변환

SELECT *
FROM planet_osm_ways
WHERE ST_Transform(
  ST_MakeEnvelope(37.808264, 37.804339, -122.275244, -122.271189, 
  4326),3857
);

이것을 실행하면 다음 오류가 발생합니다.

오류 : WHERE의 인수는 유형 기하학이 아닌 부울 유형이어야합니다. LINE 3 : WHERE ST_Transform (ST_MakeEnvelope (37.808264, 37.804339, -12 ...


1
읽고 작성하여 쿼리 작성에 사용한 이전 질문에 대한 링크를 제공하십시오.
user30184

ST_MakeEnvelope ()의 좌표 순서는 xmin, ymin, xmax, ymax와 같은 형식으로 보이지 않습니다
artwork21

@ artwork21 ST_MakeEnvelope에서 위도 / 경도를 사용하고 있습니다. 그게 잘못이야? 이것을 다른 형식으로 변환해야합니까? 나는 ST_Transform은 무엇을하고 있었는지 그의 생각
theartofbeing

1
죄송합니다 . 스키마 문서 wiki.openstreetmap.org/wiki/Osm2pgsql/schema#planet_osm_ways를 포함하여 훌륭한 매뉴얼을 읽어야했습니다 . Planet_osm_ways는 형상을 포함하지 않으며 최종 사용자에게는 쓸모가 없습니다. 시스템 용입니다. 해당 테이블에서 바운딩 박스 쿼리를 수행 할 기회가 없습니다. planet_osm_roads와 같은 테이블을 사용하면 가능합니다. 여전히 planet_osm_roads.geom은 존재하지 않습니다. 스키마에서 볼 수 있듯이 이름은 planet_osm_roads.way입니다.
user30184

1
아니요. 나는 테이블에 기하학이 없기 때문에 planet_osm_ways에서 경계 상자 쿼리를 수행 할 수 없다고 말했습니다. 참조 : id, nodes, tags, pending-어떤 것도 기하학을 포함하지 않습니다. _line, _point, _polygon 및 _roads 테이블은 정상입니다. 그리고 모든 지오메트리 테이블에서 지오메트리 열의 이름이 "지오메트리"또는 다른 것이 아니라 "웨이"라고 강조했습니다.
user30184

답변:


14

오류 메시지가 부분적으로 만 암시하지만 명령문에 세 가지 문제점이 있습니다. "어디에서 부울 유형이어야 함"은 WHERE에 제공 한 정보가 부울 결과를 평가하지 않음을 의미합니다.

  1. ST_MakeEnvelope 는 다음 순서로 매개 변수를 요청합니다 xmin, ymin, xmax, ymax, srid.

    에 잘못 전달했습니다 ymax, ymin, xmax, xmin, srid.

  2. 부울로 평가해야하는 위치 :

    지오메트리와 엔벨로프에 공통 요소가 있는지 판별하려면 WHERE를 다음과 같이 구성해야합니다. WHERE geom && envelope_geom그렇지 않으면 ST_Contains 를 사용할 수 있습니다.

    지오메트리가 엔벨로프 내에 포함되어 있는지 판별하려면 다음을 수행하십시오.`WHERE ST_Contains (envelope_geom, geom)

    에 대한 비교 방법을 제공하지 않았습니다 WHERE.

  3. 'planet_osm_ways'테이블에는 형상 열이 포함되어 있지 않지만 'planet_osm_roads'에는 'way'라는 형상 열이 포함되어 있습니다.

    관련 planet_osm_nodes.lat 및 planet_osm_nodes.lon의 테이블 'planet_osm_ways'에 형상 열을 생성 할 수 있습니다.

'planet_osm_roads'를 사용하면 지오메트리 열이있는 테이블에 대해 경계 상자를 사용하는 방법을 보여줍니다.

SELECT *
FROM planet_osm_roads
WHERE planet_osm_roads.way && ST_Transform(
  ST_MakeEnvelope(-122.271189, 37.804339, -122.275244, 37.808264, 
  4326),3857
);

또는 다음과 같이 변경하십시오.

SELECT *
FROM planet_osm_roads
WHERE ST_Contains(
    ST_Transform(
        ST_MakeEnvelope(-122.271189, 37.804339, -122.275244, 37.808264, 
        4326)
        ,3857)
    ,planet_osm_roads.way);
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.