Карта соответствия GPS указывает на дорожную сеть!

11

Я совершенно новичок в Postgres и PostGIS.

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

В моей базе данных есть таблица, содержащая мои точки GPS: точки gps ( широта, долгота , время, скорость, азимут, геометрия, ...)

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

Я хочу связать каждую точку GPS с ближайшей ссылкой (в 20-метровом буфере вокруг этой точки) только в том случае, если направление ссылки совпадает с азимутом точки GPS (+ или -15 градусов) и получить проецируемое положение. В противном случае я хочу, чтобы он искал СЛЕДУЮЩУЮ ближайшую ссылку в пределах 20-метрового буфера, который имеет приемлемый азимут! (Так же, как на картинке!)

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

(На рисунке ниже фактические точки показаны с использованием направления, в то время как у проецируемых точек нет отметки направления) введите описание изображения здесь

Надер
источник
Это интересная проблема. Я предполагаю, что если следующая точка в 20-метровом буфере также имеет неприемлемый азимут, то вы хотите продолжить поиск?
Джон Пауэлл
Да, Джон, но только для участков дороги, которые проходят через 20-метровый буфер! На самом деле, я хочу определить участки дороги, которые находятся в 20-метровом буфере, а затем найти ближайший участок, который имеет приемлемый азимут!
Надер
«У меня нет азимута ссылок, и я не уверен, как его вычислить, используя функцию postgis ST_azimuth. Все, что у меня есть, это шейп-файл дорожной сети, содержащий перечисленные выше столбцы». Вы можете (и должны) перенести свои дороги в Postgres / PostGIS с помощью shp2pgsql . Тогда вы можете использовать ST_Azimuth, но имейте в виду, что он скажет вам азимут относительно направления оцифровки .
alphabetasoup

Ответы:

1

У меня нет полностью проработанного ответа, но, возможно, достаточно, чтобы вы начали. Эти функции могут помочь:

ST_Line_Locate_Point () дает расстояние как часть общей длины линии точки вдоль линии. ST_Line_Interpolate_Point () возвращает геометрию точки для точки на заданном расстоянии (опять же как часть общей длины) вдоль линии.

Что я предлагаю, чтобы получить точечную геометрию местоположения 'new_pts' на вашей линии, которое ближе всего к вашим точкам gps (в подзапросе ниже, сформулированном как предложение WITH). Затем используйте эту точку, чтобы найти ближайшую точку на линии, но на немного меньшем расстоянии, чтобы она была ближе к началу. Затем используйте эту найденную точку вместе с 'new_pt', чтобы получить азимут между ними. Это более или менее представляет касательную к линии в этой точке.

Затем вы можете сравнить этот угол с азимутом ваших точек GPS, чтобы определить, добавлять ли точку GPS или нет.

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. применить алгоритм сопоставления:

    ВСТАВИТЬ в соответствие (gid, vehicle_id, сегмент_id, дата, время, the_geom)

    ВЫБЕРИТЕ 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) в качестве the_geom FROM

    сегмент_vertices_geom внутреннее соединение vehicle_geom b ON ST_Dwinin (ST_Transform (a.the_geom, 32632),

    ST_Transform (b.the_geom, 32632), 20) ГДЕ ((CAST (a.azimuth AS float8) - CAST (b.direction AS float8)) <180 ИЛИ (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);

Димо
источник