문제

한 지점에서 주어진 거리 내에 있는 MySQL DB의 모든 다각형을 가져오는 방법을 아는 사람이 있습니까?실제 거리는 나중에 발견된 각 다각형에 대해 계산되므로 그다지 중요하지 않지만 "가까운" 다각형에 대해 계산을 수행하는 것은 엄청난 최적화가 될 것입니다.

MBR을 살펴보고 함수가 포함되어 있지만 문제는 일부 다각형이 매우 크기 때문에 점 주위에 그려진 경계 상자 내에 포함되어 있지 않지만 일부 정점은 여전히 ​​가깝다는 것입니다.

어떤 제안이 있으십니까?

도움이 되었습니까?

해결책

느린 버전(공간 인덱스 없음):

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

공간 인덱스를 활용하려면 각 다각형 정점이 자체 레코드에 저장되도록 테이블을 비정규화해야 합니다.

그런 다음 SPATIAL INDEX 꼭짓점의 좌표가 포함된 필드에서 다음 쿼리를 실행하세요.

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

보관하면 일이 훨씬 더 쉬워질 거예요 UTM 위도와 경도가 아닌 데이터베이스의 좌표입니다.

다른 팁

이에 대한 답은 하나도 없다고 생각합니다.일반적으로 문제에 내재된 공간적 지역성을 활용하도록 데이터를 구성하는 방법에 대한 질문입니다.

내 머리 속에 떠오르는 첫 번째 아이디어는 그리드를 사용하고 각 점을 정사각형에 할당한 다음 점이 있는 정사각형과 그 주변의 정사각형을 선택하는 것입니다.무한 그리드에 대해 이야기하는 경우 정사각형의 해시 값을 사용하면 필요한 것보다 더 많은 포인트(충돌이 있는 경우)를 얻을 수 있지만 여전히 양이 많이 줄어듭니다.물론 이것은 다각형에 즉시 적용할 수는 없으며 단지 브레인스토밍일 뿐입니다.너무 많은 충돌이 발생할 수 있는 가능한 접근 방식은 모든 해시된 값을 함께 OR하고 해당 값과 AND된 해시가 0이 아닌 모든 항목을 선택하는 것입니다(MySQL에서 가능한지 확실하지 않음). 그래도 비트의 양.

이 접근 방식의 문제점은 구형 좌표(일반적으로 위도, 경도)가 특이점이라고 가정할 때 극점에 접근할수록 그리드 '사각형'이 좁아진다는 것입니다.이에 대한 쉬운 접근 방식은 다음과 같습니다.극 근처에 점을 두지 마십시오.:)

모든 다각형에 대한 경계 상자를 만들고 선택적으로 이러한 결과를 데이터베이스에 저장하면 복잡한 다각형의 경우 훨씬 더 빨라집니다.그런 다음 각 다각형의 경계 상자를 원하는 크기의 점을 둥글게 한 상자와 비교할 수 있습니다.교차하는 경계 상자가 있는 모든 다각형을 선택합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top