2009-12-14 4 views
6

포인트로부터 주어진 거리 내에있는 MySQL 데이터베이스의 모든 폴리곤을 가져 오는 방법을 알고있는 사람이 있습니까? 실제 거리는 나중에 발견 된 각 다각형에 대해 계산되기 때문에 그리 중요하지 않지만 "가까운"폴리곤에 대해 계산을 수행하는 것은 거대한 최적화입니다.위도에 가까운 폴리곤을 가져 오십시오.

저는 MBR을보고 기능을 포함하고 있지만, 문제는 일부 폴리곤은 매우 커서 그 점들 주위에 그려진 경계 상자 안에 포함되어 있지 않지만 일부 꼭지점은 여전히 ​​가깝다는 것입니다.

제안 사항?

답변

3

(공간 인덱스 제외) 느린 버전 : 각 폴리곤의 정점은 자신의 기록에 저장되도록

SELECT * 
FROM mytable 
WHERE MBRIntersects(mypolygon, LineString(Point(@X - @distance, @Y - @distance), Point(@X + @distance, @Y + @distance)) 

이 공간 인덱스의 사용을하려면, 당신은 당신의 테이블을 비정규해야합니다.

SELECT DISTINCT polygon_id 
FROM vertices 
WHERE MBRContains(vertex, LineString(Point(@X - @distance, @Y - @distance), Point(@X + @distance, @Y + @distance)) 

일들은 당신이 UTM은 위도보다는 데이터베이스에 좌표를 저장하는 경우 훨씬 더 쉬울 것이다 :

그런 다음 정점의 좌표를 포함하고 그냥이 쿼리를 실행 분야에 SPATIAL INDEX를 만들 경도.

+0

감사합니다. 비슷한 문제가있는 사람들을 위해 : 나는 관심 지점 주위에 그려진 원의 MBR을 사용하고 결국 MBR이 원 MBR을 교차 한 모든 폴리곤을 가져온다. – Gren

+0

'거리'의 의미는 무엇입니까? 마일, km 또는 미터입니까? –

+1

@ShaishavJogani :'@ distance'은 검색하는 거리를 유지하는 변수입니다. 좌표를 같은 단위로 저장하는 경우 마일 또는 km 또는 미터 또는 기타 거리 단위가 될 수 있습니다. – Quassnoi

1

나는 이것에 대한 대답이 하나도 없다고 생각합니다. 일반적으로 데이터를 구성하여 문제의 고유 한 공간적 특성을 활용하는 방법에 대한 질문입니다.

내 머리 속의 첫 발상은 그리드를 사용하고, 각 포인트를 정사각형에 할당하고, 포인트가있는 사각형과 그 주변의 사각형을 선택하는 것입니다. 우리가 무한한 그리드를 말하는 경우 사각형의 해시 값을 사용하면 필요한 것보다 많은 포인트를 줄 수 있지만 (충돌이있는 경우) 무리로 금액을 줄입니다. 물론 이것은 폴리곤에 즉시 적용 할 수있는 것이 아니라 단지 브레인 스톰입니다. 너무 많은 충돌을 야기 할 수있는 접근법은 모든 해시 된 값을 OR로 묶고 해시 AND와 해당 값이 0이 아닌 항목을 모두 선택하는 것입니다 (MySQL에서 가능하면 확실하지 않음). 큰 비트의 양.

이 접근법의 문제점은 우리가 구형 좌표 (lat, long 일반적으로 말하는)를 가정하면 그리드 '사각형'이 극에 접근함에 따라 좁아 지므로 특이점입니다. 이것에 대한 쉬운 접근법은 ... 극점에 가까운 점을 지정하지 마십시오. :)

0

모든 폴리곤에 대한 경계 상자를 만들고 (선택적으로 이러한 결과를 데이터베이스에 저장하면 복잡한 폴리곤의 경우 훨씬 빠름). 그런 다음 원하는 크기의 점을 반올림하여 각 다각형의 경계 상자를 비교할 수 있습니다. 교차하는 경계 상자가있는 모든 다각형을 선택하십시오.

관련 문제