2017-01-14 16 views
0

Java 및 Postgres를 사용하여 버스 도착 예측 시스템을 만들고 있습니다. 각 버스에 고정 된 경로가 있으므로 Postgres에 LineString으로 전체 운전 경로를 저장하고 있습니다.gps 좌표를 사용하여 다음 버텍스로 거리 찾기

enter image description here

이 3 버스 파업, 그리고 각 버스 정류장 위도의 경도는 라우팅 테이블에 유도 선으로 저장됩니다. 정지 이름과 세부 정보가있는 테이블이 하나 더 있습니다.

stoppage_details 표

Stoppage 1 - lat1,lon1 
Stoppage 2 - lat2,lon2 
Stoppage 3 - lat3,lon3 

내가 포스트 그레스를 찾고는 문제보다 해결하기 위해 작동합니다.

  1. 어떻게 ( 지점을 위도 경도 및 종료 지점의 위도의 경도를 시작) 유도 선을 사용하여 경로의 총 거리 (660m)을 얻을 수 있습니다.
  2. 30 초마다 데이터를 보내는 각 버스에 GPS 시스템이 설치되어 있습니다. ST_ClosestPoint 기능을 사용하여 LineString에서 가장 가까운 버텍스 을 찾습니다. LineString을 사용하여 버텍스와 다음 사이의 거리를 찾을 수있는 방법은 이고 이전 중지 방법은 무엇입니까?
  3. 또는 누군가가 위의 문제를 해결하기 위해 다른 방법을 제안 할 수 있습니까?

답변

0
  1. P8을 통해 P1은 SRID에 선 스트링 형상 경우 : 4326가 (긴/위도) 다음 그것을 미터 st_length (라인 :: 지리)와 길이를 얻을 수 있습니다.

  2. 은 조금 더 복잡하지만 다양한 접근법이 있습니다. 예를 들어 선형 참조 함수를 사용하여 GPS 포인트를 선 문자열에 투영하고 백분율을 0을 시작으로 1.0을 끝으로 가져올 수 있습니다. 당신이 각 파업 점을 가지고 그것의 백분율을 얻는 경우에 (어쩌면 당신의 테이블에서 그것을 저장하십시오) 그 후에 GPS 백분율보다는 더 적은 정지 점을 찾아 내고 GPS 백분율보다는 더 중대한 것은 당신에게 인접한 정지 점을 줄 것이다. 선형 참조 기능은 선 스트링의 시작 및 정지 비율에 따라 하위 문자열을 추출하는 기능을 제공하며 GPS 포인트 전후의 거리에 대해 각각의 길이를 얻을 수 있습니다.

+0

ST_length (line :: geography) FROM routes를 선택했습니다. 그러나 정확한 길이를 제공하지는 않습니다. 선 스트링에서 GPS 좌표의 이전 및 다음 정지를 확인할 수있는 방법이 있습니까? – raw

+0

linstring이 srid : 4326 (WGS84) 인 경우 적절한 돌출부에 투영하여 길이를 계산해야합니다. 지리학에 그것을 캐스팅하는 것은 미터 단위의 글로벌 mercator 투영과 같은 것으로 투영함으로써 이것을합니다. st_length_spheriod() http://postgis.net/docs/manual-1.4/ST_Length_Spheroid.html을 시도해 볼 수 있습니다. spheriod를 투영하고 싶은 spheriod를보다 잘 제어 할 수 있습니다. 포인트 2에 관해서 –

+0

. 나는 이것을하는 1 개의 길이 기술했다. 당신이 요구 한 바로 그 "통조림"기능은 없습니다. Postgis는보다 복잡한 솔루션을 구축 할 수있게 해주는 툴 세트입니다. 많은 사용자가 pgplsql 스토어드 프로 시저를 작성하여 더 복잡하거나 특정 작업을 수행합니다. "PostGIS in Action"을 권장합니다. http://www.postgis.us/ –