GPS-відповідність GPS-точок до дорожньої мережі!


11

Я зовсім новачок у Postgres та PostGIS.

Я намагаюсь зробити просте зіставлення карт (або умовивід, якщо ви хочете) деяких точок GPS. Я використовую postgres (postgis) .

У моїй базі даних є таблиця, що містить мої GPS-точки: gpspoints (Lat, Long, час, швидкість, азимут, геометрія, ...)

Я також імпортував форм-файл дорожньої мережі в свою базу даних: маршрути (gid, idrte, версія, nomrte, norte, clsrte, geom, ...) - Я не маю азимуту посилань, і я не впевнений, як я можу обчислити його за допомогою функції постгіс ST_azimuth. Все, що у мене є, - це формуляр дорожньої мережі, що містить перераховані вище стовпці.

Я хочу пов’язати кожну точку GPS з найближчою ланкою (у буфері 20 метрів навколо точки) лише у тому випадку, якщо напрямок посилання відповідає азимуту точки GPS (+ або -15 градусів) і отримати прогнозоване положення. В іншому випадку я хочу, щоб вона шукала НАЙКРАЩУ посилання, в межах 20-метрового буфера, який має прийнятний азимут! (Як і картина!)

Я хочу, щоб нові координати проектованих точок GPS були додані в таблицю "gpspoints" як "projectedLat" і "projectedLong".

(На малюнку нижче фактичні точки демонструються за допомогою напрямку, тоді як прогнозовані точки не мають жодної позначки напрямку) введіть тут опис зображення


Це цікава проблема. Я припускаю, що якщо в наступній точці буфера 20 м також є неприйнятний азимут, то ви хочете продовжити пошук?
Джон Пауелл

Так, Джон, але тільки для відрізків дороги, які витримують 20-метровий буфер! Власне, я хочу визначити ділянки дороги, які знаходяться в 20 м буфера, а потім знайти найближчий відрізок, який має прийнятний азимут!
Надер

"У мене немає азимуту посилань, і я не впевнений, як я можу обчислити його за допомогою функції постгіс ST_azimuth. Все, що у мене є, - це формуляр дорожньої мережі, що містить перелічені вище стовпці." Ви можете (і повинні) перевезти свої дороги в Postgres / PostGIS за допомогою shp2pgsql . Потім ви можете використовувати ST_Azimuth, але майте на увазі, що він підкаже вам азимут щодо напрямку оцифрування .
alphabetasoup

Відповіді:


1

У мене немає повністю відпрацьованої відповіді, але, можливо, достатньо, щоб ви почали працювати. Ці функції можуть допомогти:

ST_Line_Locate_Point () дає відстань у вигляді частини загальної довжини рядка точки вздовж прямої. ST_Line_Interpolate_Point () повертає геометрію точки для точки на заданій відстані (знову як частину від загальної довжини) вздовж прямої.

Що я пропоную, щоб отримати точкову геометрію розташування "new_pts" у вашій лінії, яка є найближчою до ваших gpspoints (у підзапиті нижче, сформульованому як пункт "WITH"). Потім скористайтеся цією точкою, щоб знайти найближчу точку насправді на лінії, але на трохи меншій відстані, тому вона буде ближче до початку. Далі використовуйте цю знайдену точку разом з 'new_pt', щоб отримати азимут між ними. Це більш-менш представляло б дотичну до лінії в цій точці.

Потім ви можете порівняти цей кут з азимутом ваших gpspoints, щоб визначити, додавати 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: 180 + math.atan2 ((! Shape.firstpoint.X! -! Shape.lastpoint.X!), (! Shape.firstpoint.Y! -! Shape.lastpoint.Y!)) * (180 / math.pi)

  2. конвертуйте свою дорожню мережу в дорожні вершини (точки) та імпортуйте до PostGIS.

  3. застосувати алгоритм відповідності:

    ВСТАВИТИ у відповідність (gid, vehicle_id, segment_id, дата, час, the_geom)

    ВИБІР ВІДКРИТТЯ ВКЛЮЧЕНО (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 ВІД

    segment_vertices_geom внутрішній приєднується транспортний засіб_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 АБО (CAST (a.azimuth AS float8)) - CAST (b.direction ЯК float8))> -180) ГРУПА ПО b.gid, b.vehicle_id, a.segment_id, b.date, b.time, a.the_geom, b.the_geom ЗАМОВИТИ b.gid, ST_Distance (a.the_geom, b .the_geom);

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.