PostGIS를 사용하여 주어진 반경 내에서 효율적으로 건물 찾기
이 가이드에서는 데이터베이스 테이블 "Building"에 "name", "lat" 및 "lng" 열이 포함되어 있다는 가정 하에 PostGIS를 사용하여 지정된 반경 내의 모든 건물을 검색하는 방법을 보여줍니다. 좌표(-84.38653999999998, 33.72024)로부터 5마일 이내에 있는 모든 건물을 찾아야 한다고 가정해 보겠습니다.
공간 데이터 저장 최적화
위도와 경도를 별도의 열에 저장하는 것은 비효율적이라는 점을 이해하는 것이 중요합니다. 최적의 PostGIS 성능을 위해 좌표를 기하학 또는 지리 데이터 유형으로 저장하십시오. 이렇게 하면 쿼리 중에 불필요한 변환이 방지됩니다.
거리 계산을 위해 ST_DWithin 및 ST_Distance 활용
PostGIS는 거리 계산을 위한 두 가지 주요 기능인 ST_DWithin
및 ST_Distance
을 제공합니다.
1. 효율적인 반경 검색을 위해 ST_DWithin 사용:
ST_DWithin
도형이 지정된 거리 내에 있는지 효율적으로 확인합니다. 다음 쿼리는 ST_DWithin
을 사용하여 반경 5마일(약 8046.72미터) 내의 건물을 찾습니다.
<code class="language-sql">SELECT name, long, lat FROM building WHERE ST_DWithin( ST_GeographyFromText('SRID=4326;POINT(-84.38653999999998 33.72024)'), ST_MakePoint(long, lat)::geography, 8046.72 -- Distance in meters );</code>
구형 표면에서 정확한 거리 계산을 위해 ST_GeographyFromText
를 사용하고 ST_MakePoint
를 지리에 캐스팅하는 것에 유의하세요. 지리적 좌표에는 일반적으로 geography
보다 geometry
을 사용하는 것이 좋습니다.
2. 자세한 거리 정보를 위해 ST_Distance 사용:
ST_Distance
은 두 도형 사이의 거리를 계산합니다. ST_DWithin
과 달리 공간 인덱스의 이점을 얻지 못하며 더 나은 성능을 위해 WHERE 절이 아닌 SELECT 절에서 사용해야 합니다. 이 접근 방식은 각 건물까지의 정확한 거리가 필요할 때 유용합니다.
<code class="language-sql">SELECT name, long, lat, ST_Distance( ST_GeographyFromText('SRID=4326;POINT(-84.38653999999998 33.72024)'), ST_MakePoint(long, lat)::geography ) AS distance_meters FROM building ORDER BY distance_meters;</code>
이 쿼리는 거리를 미터 단위로 반환합니다. 0.000621371을 곱하여 마일리지로 환산할 수 있습니다.
ST_MakePoint에 대한 중요 참고 사항:
ST_MakePoint
은 경도를 먼저 취하고 그 다음 위도를 취한다는 점을 기억하세요. 잘못된 순서로 인해 부정확한 결과가 발생합니다. 항상 좌표 순서를 다시 확인하세요. 지리 데이터 유형의 사용은 지구 표면의 정확한 거리 계산에 매우 중요합니다.
위 내용은 PostGIS를 사용하여 지정된 반경 내의 건물을 효율적으로 검색하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!