지도 매칭 GPS가 도로 네트워크를 가리 킵니다!


11

Postgres와 PostGIS를 처음 접했습니다.

일부 GPS 지점에 대한 간단한지도 일치 (또는 원하는 경우 경로 유추)를하려고합니다. postgres (postgis) 사용 하고 있습니다.

GPS 포인트가 포함 된 데이터베이스에 gpspoints (Lat, Long, Time, Speed, azimuth, geometry 등) 테이블이 있습니다.

경로 (gid, idrte, version, nomrte, norte, clsrte, geom, ...) 와 같은 도로 네트워크의 shapefile을 데이터베이스로 가져 왔습니다 .- 링크의 방위각이 없습니다. postgis 함수 ST_azimuth를 사용하여 어떻게 계산할 수 있는지 잘 모르겠습니다. 내가 가지고있는 것은 위에 열거 된 열이 포함 된 도로 네트워크의 형태 파일입니다.

링크 방향이 GPS 포인트의 방위각 (+ 또는 -15도)과 일치하는 경우에만 각 GPS 포인트를 가장 가까운 링크 (포인트 주위의 20 미터 버퍼)에 연결하고 투영 된 위치를 검색하려고합니다. 그렇지 않으면 수용 가능한 방위각을 가진 20 미터 버퍼 내에서 NEXT 가장 가까운 링크를 검색하고 싶습니다! (사진 그대로!)

투영 된 GPS 포인트의 새 좌표를 "gpspoints"테이블에 "projectedLat"및 "projectedLong"으로 추가하고 싶습니다.

(아래 그림에서 실제 지점은 방향을 사용하여 설명되지만 투사 지점에는 방향 표시가 없습니다) 여기에 이미지 설명을 입력하십시오


흥미로운 문제입니다. 20m 버퍼 내의 다음 지점에도 수용 할 수없는 방위각이있는 경우 검색을 계속 하시겠습니까?
John Powell

네 John,하지만 20 미터 버퍼 가있는 도로 구간 만 ! 실제로, 나는 20m 버퍼에있는 도로 구간을 식별하고 수용 가능한 방위각을 가진 가장 가까운 구간을 찾습니다!
Nader

"링크의 방위각이없고 postgis 함수 ST_azimuth를 사용하여 어떻게 계산할 수 있는지 잘 모르겠습니다. 위에 열거 된 열이 포함 된 도로망의 형태 파일 만 있으면됩니다." shp2pgsql을 사용 하여 Postgres / PostGIS로 도로를 가져올 수 있습니다 . 그런 다음 사용할 수 ST_Azimuth있지만 디지털화 방향 과 관련하여 방위각을 알려줍니다 .
alphabetasoup

답변:


1

나는 완전한 답을 얻지 못했지만 시작하기에 충분할 것입니다. 이 기능들이 도움이 될 수 있습니다.

ST_Line_Locate_Point ()는 선을 따라 점의 총 선 길이의 일부로 거리를 제공합니다. ST_Line_Interpolate_Point ()는 선을 따라 주어진 거리 (전체 길이의 일부)에서 한 점에 대한 점 형상을 반환합니다.

gpspoint에 가장 가까운 위치에서 'new_pts'위치의 포인트 지오메트리를 얻는 것이 좋습니다 (아래 부속 쿼리에서 WITH 절로 공식화 됨). 그런 다음 해당 점을 사용하여 실제로 선에서 가장 가까운 점을 찾으십시오. 그러나 아주 조금 더 먼 거리에서 시작하면 더 가까워집니다. 다음 으로이 발견 지점을 'new_pt'와 함께 사용하여 그들 사이의 방위각을 얻습니다. 이것은 그 시점에서 선에 접하는 것을 다소 나타냅니다.

그런 다음이 각도를 gpspoint의 방위각과 비교하여 gpspoint를 추가할지 여부를 결정할 수 있습니다.

with new_pts AS (
    SELECT ST_ClosestPoint(geom, gpspoints) AS geompt
    FROM routes JOIN gpspoints ON ST_Distance(routes.geom, gpspoints.geom)<20
    )


SELECT ST_Azimuth(new_pts.geompt, 
    ST_Line_Interpolate_Point(routes.geom, 
        ST_Line_Locate_Point(routes.geom, new_pts.geompt)*0.999))

FROM routes JOIN new_pts ON ST_Distance(routes.geom,new_pts.geompt)<20;

다시 테스트하지는 않았지만 도움이 되길 바랍니다.


0

다음과 같이 해보십시오.

  1. 폴리 라인의 방향을도 단위로 계산합니다. 예 : ArcGIS Field Calculator : 180 + math.atan2 ((! Shape.firstpoint.X!-! Shape.lastpoint.X!), (! Shape.firstpoint.Y! -! Shape.lastpoint.Y!)) * (180 / math.pi)

  2. 도로 네트워크를 도로 정점 (점)으로 변환하고 PostGIS로 가져옵니다.

  3. 일치 알고리즘 적용 :

    일치하는 INSERT (gid, vehicle_id, segment_id, 날짜, 시간, the_geom)

    선택 ON (b.gid) b.gid, b.vehicle_id, a.segment_id, b.date, b.time, ST_Closestpoint (ST_Collect (a.the_geom), b.the_geom)을 the_geom FROM으로

    segment_vertices_geom a 내부 조인 차량 _geom b ON ST_Dwithin (ST_Transform (a.the_geom, 32632),

    ST_Transform (b.the_geom, 32632), 20) WHERE ((CAST (a.azimuth AS float8)-CAST (b.direction AS float8)) <180 OR (CAST (a.azimuth AS float8)-CAST (b.direction AS float8))> -180) GROUP BY b.gid, b.vehicle_id, a.segment_id, b.date, b.time, a.the_geom, b.the_geom ORDER BY b.gid, ST_Distance (a.the_geom, b .the_geom);

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