Poin pencocokan peta GPS ke jaringan jalan!

11

Saya cukup baru di Postgres dan PostGIS.

Saya mencoba melakukan pencocokan peta sederhana (atau jalur-inferensi jika Anda mau) dari beberapa titik GPS. Saya menggunakan postgres (postgis) .

Saya memiliki tabel di basis data yang berisi titik GPS saya: gpspoints (Lat, Long, time, speed, azimuth, geometry, ...)

Saya telah mengimpor shapefile jaringan jalan ke dalam basis data saya juga: rute (gid, idrte, versi, nomrte, norte, clsrte, geom, ...) - SAYA TIDAK PUNYA azimuth dari tautan, dan saya tidak yakin bagaimana saya bisa menghitungnya menggunakan fungsi postgis ST_azimuth. Yang saya miliki adalah shapefile dari jaringan jalan yang berisi kolom yang disebutkan di atas.

Saya ingin mengaitkan setiap titik GPS ke tautan terdekat (dalam buffer 20 meter di sekitar titik) hanya jika arah tautan setuju dengan azimuth titik GPS (+ atau -15 derajat) dan mengambil posisi yang diproyeksikan. Kalau tidak, saya ingin mencari tautan terdekat BERIKUTNYA, dalam buffer 20 meter, yang memiliki azimuth yang dapat diterima! (Sama seperti gambar!)

Saya ingin koordinat baru dari titik-titik GPS yang diproyeksikan ditambahkan dalam tabel "gpspoints" sebagai "projectedLat" dan "projectedLong".

(Pada gambar di bawah ini, titik-titik aktual diperlihatkan menggunakan arah sementara titik yang diproyeksikan tidak memiliki tanda arah) masukkan deskripsi gambar di sini

Nader
sumber
Ini masalah yang menarik. Saya berasumsi bahwa jika titik berikutnya dalam buffer 20m juga memiliki azimuth yang tidak dapat diterima, maka Anda ingin melanjutkan pencarian?
John Powell
Ya John, tapi hanya untuk ruas jalan yang berada di buffer 20 meter ! Sebenarnya, saya ingin mengidentifikasi ruas jalan yang ada di buffer 20 m, kemudian menemukan ruas terdekat yang memiliki azimuth yang dapat diterima!
Nader
"Saya TIDAK MEMILIKI azimuth dari tautan, dan saya tidak yakin bagaimana saya bisa menghitungnya menggunakan fungsi postgis ST_azimuth. Yang saya miliki hanyalah shapefile dari jaringan jalan yang berisi kolom-kolom yang disebutkan di atas." Anda dapat (dan harus) membawa jalan Anda ke Postgres / PostGIS dengan shp2pgsql . Kemudian Anda dapat menggunakannya ST_Azimuth, tetapi ingatlah bahwa itu akan memberi tahu Anda azimuth sehubungan dengan arah digitalisasi .
alphabetasoup

Jawaban:

1

Saya tidak memiliki jawaban yang sepenuhnya berhasil, tetapi mungkin cukup untuk membantu Anda memulai. Fungsi-fungsi ini mungkin membantu:

ST_Line_Locate_Point () memberikan jarak sebagai bagian dari total panjang garis titik di sepanjang garis. ST_Line_Interpolate_Point () mengembalikan geometri titik untuk suatu titik pada jarak tertentu (lagi sebagai bagian dari total panjang) di sepanjang garis.

Apa yang saya sarankan untuk mendapatkan geometri titik dari lokasi 'new_pts' pada baris Anda yang paling dekat dengan gpspoints Anda (dalam subquery di bawah, dirumuskan sebagai klausa DENGAN). Kemudian gunakan titik itu untuk menemukan titik terdekat sebenarnya di telepon, tetapi pada jarak yang sangat sedikit lebih kecil, sehingga akan lebih dekat ke awal. Selanjutnya gunakan titik yang ditemukan ini, bersama dengan 'new_pt' untuk mendapatkan azimuth di antara mereka. Ini akan lebih atau kurang mewakili garis singgung ke garis pada titik itu.

Kemudian Anda dapat membandingkan sudut ini dengan azimuth gpspoints Anda untuk menentukan apakah akan menambahkan gpspoint atau tidak.

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;

Sekali lagi, tidak diuji, tapi saya harap ini akan membantu.

Micha
sumber
0

coba sesuatu seperti ini:

  1. menghitung orientasi polyline Anda dalam derajat, contoh: misalnya dalam ArcGIS Field Calculator: 180 + math.atan2 ((! Shape.firstpoint.X! -! Shape.lastpoint.X!), (! Shape.firstpoint.Y! -! Shape.lastpoint.Y!)) * (180 / math.pi)

  2. konversikan jaringan jalan Anda ke simpul jalan (titik) dan impor ke PostGIS.

  3. terapkan algoritma pencocokan:

    Masukkan ke dalam pencocokan (gid, vehicle_id, segment_id, tanggal, waktu, the_geom)

    SELECT DISTINCT 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) sebagai the_geom FROM

    segment_vertices_geom a gabung bagian dalam vehicle_geom b PADA ST_Dwithin (ST_Transformasi (a.the_geom, 32632),

    ST_Transformasi (b.the_geom, 32632), 20) DIMANA ((CAST (a.azimuth AS float8) - CAST (b. Arahan AS float8)) <180 ATAU (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);

Dimo
sumber