Я совершенно новичок в 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".
(На рисунке ниже фактические точки показаны с использованием направления, в то время как у проецируемых точек нет отметки направления)
источник
ST_Azimuth
, но имейте в виду, что он скажет вам азимут относительно направления оцифровки .Ответы:
У меня нет полностью проработанного ответа, но, возможно, достаточно, чтобы вы начали. Эти функции могут помочь:
ST_Line_Locate_Point () дает расстояние как часть общей длины линии точки вдоль линии. ST_Line_Interpolate_Point () возвращает геометрию точки для точки на заданном расстоянии (опять же как часть общей длины) вдоль линии.
Что я предлагаю, чтобы получить точечную геометрию местоположения 'new_pts' на вашей линии, которое ближе всего к вашим точкам gps (в подзапросе ниже, сформулированном как предложение WITH). Затем используйте эту точку, чтобы найти ближайшую точку на линии, но на немного меньшем расстоянии, чтобы она была ближе к началу. Затем используйте эту найденную точку вместе с 'new_pt', чтобы получить азимут между ними. Это более или менее представляет касательную к линии в этой точке.
Затем вы можете сравнить этот угол с азимутом ваших точек GPS, чтобы определить, добавлять ли точку GPS или нет.
Опять не проверено, но я надеюсь, что это поможет.
источник
попробуйте что-то вроде этого:
рассчитать ориентацию ваших полилиний в градусах, например: например, в ArcGIS Field Calculator: 180 + math.atan2 ((! Shape.firstpoint.X! -! Shape.lastpoint.X!), (! Shape.firstpoint.Y! -! Shape.lastpoint.Y!)) * (180 / math.pi)
преобразовать свою дорожную сеть в дорожные вершины (точки) и импортировать в PostGIS.
применить алгоритм сопоставления:
ВСТАВИТЬ в соответствие (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);
источник