줄 문자열에서 가장 가까운 점을 주어진 점으로 가져 오는 방법은 무엇입니까?


28

나는 오랫동안 PostGIS를 사용해 왔지만 LINESTRING지오메트리 를 사용할 필요는 없었습니다 ...! :)

여기에 내가하고 싶은 일이 있습니다 : 선 스트링 테이블 (주어진 도시의 거리, SRID 3395)이 있고 주어진 지점까지 가장 가까운 선 스트링을 찾고 싶습니다 (GPS 위치, SRID 4326).

내가 찾은 해결책은 expand()방법을 사용하여 내 점 내의 모든 선 스트링을 선택하고 방법을 사용하여 각 선 스트링과 내 점 사이의 거리를 결정하는 ST_Distance()것입니다.

다음은 SQL입니다.

SELECT myLineId, myLineName, ST_Distance(ST_Transform(GeomFromText('POINT(LON LAT)',4326),3395),myLineGeom) AS myLineDistance
FROM myLines
WHERE myLineGeom && expand(ST_Transform(GeomFromText('POINT(LON LAT)',4326),3395), 100)
ORDER BY myLineDistance;

결과는 괜찮아 보이지만 구현에 문제가 있다고 생각합니다.

1) 너희들은 expand()모든 관련 줄을 얻을 수 있다고 생각 합니까?

2) 당신 ST_Distance()은 이것이 올바른 방법 이라고 생각 합니까? 내가 얻고 싶은 거리가 포인트와 선 사이의 거리가 아니라 포인트와 내 선 사이의 가장 작은 거리이기 때문에 내가 잘못하고 있다고 생각합니다.

삽화:

대체 텍스트

답변:


11

ad 1) 사용한 함수에 대한 설명서를 보면 "예, 관련된 모든 줄 문자열을 찾을 수 있습니다."라고 말합니다.

확장 (형상, 플로트)

이 함수는 입력 지오메트리의 경계 상자에서 모든 방향으로 확장 된 경계 상자를 두 번째 인수에 지정된 양만큼 반환합니다. distance () 쿼리에 매우 유용하며 쿼리에 인덱스 필터를 추가합니다.

& B 조

"&&"연산자는 "중복"연산자입니다. A의 경계 상자가 B의 경계 상자와 겹치면 연산자는 true를 반환합니다.

ad 2) 다음을 통해 원하는 것을 달성 할 수 있어야합니다.

line_interpolate_point(linestring, line_locate_point(LineString, Point))

line_interpolate_point (라인 스트링, 위치)

선을 따라 점을 보간합니다. 첫 번째 주장은 LINESTRING이어야합니다. 두 번째 인수는 점이 있어야하는 총 2d 길이의 분수를 나타내는 0과 1 사이의 float8입니다.

line_locate_point (LineString, Point)

LineString에서 주어진 Point에 가장 가까운 점의 위치를 ​​나타내는 0과 1 사이의 부동 소수점을 총 2 차원 선 길이의 일부로 반환합니다. 반환 된 위치를 사용하여 점 (line_interpolate_point)을 추출 할 수 있습니다

출처 : http://main.merlin.com.ua/doc/postgis/docs/ch06.html


포인트 2)의 경우, 나는 POINT 지오메트리와 LINESTRING 지오메트리 사이의 ST_Distance가 이들 사이에 가능한 가장 작은 거리 (일명 POINT와 LINGESTRING 사이의 수직선의 길이)를 제공하는지 궁금합니다. 나는 모든 LINESTRING 지오메트리와의 거리를 원합니다 :)
Vivi

그리고 "line_locate_point 함수는 LineString에서 주어진 포인트에 가장 가까운 포인트의 위치를 ​​나타내는 0과 1 사이의 값을 제공합니다"이후로 내가 찾는 거리가 아니라고 생각합니다. : /
Vivi

나는 당신이 당신의 마지막 코멘트에서 나를 잃어버린 것을 두려워합니다. 이제 더 이상 당신이 원하는 것이 확실하지 않습니다;)
underdark

1
죄송합니다 :) 나는 이것을 원합니다 : LINESTRING 지오메트리 (경로를 나타냄)와 POINT 지오메트리를주고, 경로에 가장 가까운 POINT 지오메트리를 원합니다 (LINESTRING 지오메트리 정의의 포인트가 아닐 수도 있음). 확실해? 어쩌면 나는 그림으로 게시물을 업데이트해야 할 것이다 : D
Vivi

내 게시물을 업데이트 할 수 없으므로 여기에 얻고 싶은 그림의 링크가 있습니다. i.imgur.com/UwPxo.jpg
Vivi

7

어이

먼저 ST_Distance가 반환하는 것에 대한 질문입니다. ST_Distance는 선과 점 사이의 최단 거리 (또는 입력 된 지오메트리 유형)를 반환합니다. 즉, 점 (1 3)과 선 스트링 (0 0,0 10) 사이의 ST_Distance는 1을 반환합니다. 점과 (0 0) 또는 점과 (0 10)을 제외하고 점 (1 3)에서 (0 3)까지.

ST_Distance가 이해 한 바에 따라 원하는 답변을 얻을 수 있습니다.

위의 예에서 점 (0 3)을 찾으려면 PostGIS 1.5가있는 경우 ST_Closestpoint를 사용할 수 있습니다. 예를 들어 ST_Closestpoint ( 'LINESTRING (0 0,0 10)':: geometry, ' POINT (1 3) ':: geometry) 그런 다음 점에 가장 가까운 선의 점 (0 3)을 반환해야합니다.

HTH 니켈 라스


5

나는 그것을 발견했다 :) (잘 생각한다 : P)

를 사용 ST_Line_Locate_Point()하고 ST_Line_Interpolate_point()내가 선 스트링 정의의 일부는 아니지만 라인 : 모든 내가해야 할 말했다에 포인트를 얻을 관리하는이 시점에 내 지점으로부터의 거리를 얻기 위해 내가 끝났어요.

SELECT AsText(ST_Line_Interpolate_Point(myLineGeom,ST_Line_Locate_Point(myLineGeom,ST_Transform(GeomFromText('POINT(LON LAT)',4326),3395))))
FROM myLines
WHERE myGeom && expand(ST_Transform(GeomFromText('POINT(LON LAT)',4326),3395), 100)

ST_Line_Locate_Point()방법은 주어진 점에 대한 선에서 가장 가까운 점의 위치를 ​​찾고이 ST_Line_Interpolate_Point위치를 점으로 바꿉니다.


1
점과 선 사이의 St_distance는 동일한 대답을 제공합니다. 왜 이렇게해야한다고 생각합니까?
Nicklas Avén

1
ST_Distance는 모든 기하학 유형과 함께 사용할 수 있다고 생각합니다. postgis.refractions.net/docs/ST_Distance.html :ST_Distance(geometry g1, geometry g2)
Magno C

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.