GPS phù hợp với bản đồ điểm đến mạng lưới đường!


11

Tôi còn khá mới với Postgres và PostGIS.

Tôi đang cố gắng thực hiện một kết hợp bản đồ đơn giản (hoặc suy luận đường dẫn nếu bạn muốn) về một số điểm GPS. Tôi đang sử dụng postgres (postgis) .

Tôi có một bảng trong cơ sở dữ liệu chứa các điểm GPS của mình: gpspoint (Lat, Long, thời gian, tốc độ, góc phương vị, hình học, ...)

Tôi cũng đã nhập một shapefile của mạng lưới đường vào cơ sở dữ liệu của mình: các tuyến đường (gid, idrte, phiên bản, nomrte, norte, clsrte, geom, ...) - Tôi KHÔNG CÓ phương vị của các liên kết, và tôi không chắc làm thế nào tôi có thể tính toán nó bằng hàm postgis ST_azimuth. Tất cả những gì tôi có là một shapefile của mạng lưới đường có chứa các cột được liệt kê ở trên.

Tôi muốn liên kết mỗi điểm GPS với liên kết gần nhất (trong khoảng cách 20 mét quanh điểm) chỉ khi hướng của liên kết đồng ý với góc phương vị của điểm GPS (+ hoặc -15 độ) và truy xuất vị trí được chiếu. Mặt khác, tôi muốn nó tìm kiếm liên kết gần nhất NEXT, trong vùng đệm 20 mét, có góc phương vị chấp nhận được! (Giống như hình ảnh!)

Tôi muốn tọa độ mới của các điểm GPS được chiếu sẽ được thêm vào bảng "gpspoint" dưới dạng "projectedLat" và "projectedLong".

(Trong hình bên dưới, các điểm thực tế được thể hiện bằng cách sử dụng một hướng trong khi các điểm được chiếu không có bất kỳ dấu hướng nào) nhập mô tả hình ảnh ở đây


Đó là một vấn đề thú vị. Tôi giả sử rằng nếu điểm tiếp theo trong bộ đệm 20m cũng có góc phương vị không được chấp nhận, thì bạn có muốn tiếp tục tìm kiếm không?
John Powell

Có John, nhưng chỉ dành cho các đoạn đường đang bị đệm 20 mét ! Trên thực tế, tôi muốn xác định các đoạn đường nằm trong vùng đệm 20 m, sau đó tìm đoạn gần nhất có góc phương vị chấp nhận được!
Nader

"Tôi KHÔNG CÓ phương vị của các liên kết và tôi không chắc làm thế nào tôi có thể tính toán nó bằng hàm postgis ST_azimuth. Tất cả những gì tôi có là một hình dạng của mạng lưới đường có chứa các cột được liệt kê ở trên." Bạn có thể (và nên) đưa các con đường của mình vào Postgres / PostGIS với shp2pgsql . Sau đó, bạn có thể sử dụng ST_Azimuth, nhưng hãy nhớ rằng nó sẽ cho bạn biết góc phương vị liên quan đến hướng số hóa .
alphabetasoup

Câu trả lời:


1

Tôi không có câu trả lời đầy đủ, nhưng có lẽ đủ để bạn bắt đầu. Các chức năng này có thể giúp:

ST_Line_Locate_Point () đưa ra khoảng cách là một phần của tổng chiều dài của một điểm dọc theo một dòng. ST_Line_Interpolate_Point () trả về hình dạng điểm cho một điểm ở một khoảng cách nhất định (một lần nữa là một phần của tổng chiều dài) dọc theo một dòng.

Những gì tôi đề xuất là lấy hình dạng điểm của vị trí 'new_pts' trên dòng gần nhất với điểm gps của bạn (trong truy vấn con bên dưới, được coi là mệnh đề CÓ). Sau đó sử dụng điểm đó để tìm điểm gần nhất thực sự trên đường thẳng, nhưng ở khoảng cách nhỏ hơn một chút, vì vậy nó sẽ gần hơn với điểm bắt đầu. Tiếp theo sử dụng điểm tìm thấy này, cùng với 'new_pt' để lấy góc phương vị giữa chúng. Điều này ít nhiều sẽ đại diện cho tiếp tuyến của đường thẳng tại điểm đó.

Sau đó, bạn có thể so sánh góc này với góc phương vị của các điểm gps của bạn để xác định xem có nên thêm điểm gps hay không.

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;

Một lần nữa, không được thử nghiệm, nhưng tôi hy vọng nó sẽ giúp ích được gì đó.


0

hãy thử một cái gì đó như thế này:

  1. tính toán hướng của các đường dẫn của bạn theo độ, ví dụ: ví dụ: trong Máy tính trường ArcGIS: 180 + math.atan2 ((! Shape.firstpoint.X! -! Shape.lastpoint.X!), (! Shape.firstpoint.Y! -! Shape.lastpoint.Y!)) * (180 / math.pi)

  2. chuyển đổi mạng lưới đường của bạn thành các đỉnh đường (điểm) và nhập vào PostGIS.

  3. áp dụng thuật toán phù hợp:

    XÁC vào khớp (gid, car_id, Seg_id, ngày, giờ, the_geom)

    CHỌN DISTINCT ON (b.gid) b.gid, b.vehicle_id, a.seribution_id, b.date, b.time, ST_Closestpoint (ST_Collect (a.the_geom), b.the_geom) là the_geom

    Seg_vertices_geom một phương tiện tham gia bên trong xe_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 NHƯ float8))> -180) NHÓM THEO b.gid, b.vehicle_id, a.seribution_id, b.date, b.time, a.the_geom, b.the_geom ĐẶT HÀNG B.gid, ST_Distance (a.the_geom, b .the_geom);

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.