地图匹配的GPS指向道路网络!


11

我对Postgres和PostGIS很陌生。

我正在尝试对一些GPS点进行简单的地图匹配(如果需要,也可以进行路径推断)。我正在使用postgres(postgis)

我的数据库中有一个表,其中包含我的GPS点: gpspoints(纬度,经度,时间,速度,方位角,几何形状,...)

我也将道路网络的shapefile导入到我的数据库中: 路线(gid,idrte,version,nomrte,norte,clsrte,geom等)-我没有链接的方位角,而我不知道如何使用postgis函数ST_azimuth计算它。我所拥有的只是道路网的shapefile,其中包含上面列举的列。

仅当链接的方向与GPS点的方位角(+或-15度)一致并检索投影位置时,我才想将每个GPS点关联到最近的链接(在该点周围20米的缓冲区中)。否则,我希望它在20米缓冲区内搜索具有可接受方位角的NEXT最近的链接!(就像图片一样!)

我希望将投影GPS点的新坐标以“ projectedLat”和“ projectedLong”的形式添加到表“ gpspoints”中。

(在下图中,实际点是使用方向显示的,而投影点没有任何方向标记) 在此处输入图片说明


这是一个有趣的问题。我假设如果20m缓冲区中的下一个点也具有不可接受的方位角,那么您要继续搜索吗?
约翰·鲍威尔

是的,约翰,但仅适用于20米缓冲区的路段!实际上,我想确定位于20 m缓冲区中的路段,然后找到具有可接受方位角的最近路段!
Nader 2015年

“我没有链接的方位角,我不确定如何使用postgis函数ST_azimuth来计算。我所拥有的只是道路网的shapefile,其中包含上面列举的列。” 您可以(并且应该)使用shp2pgsql将您的道路引入Postgres / PostGIS 。然后您可以使用ST_Azimuth,但要记住,它将告诉您关于数字化方向的方位角。
alphabetasoup

Answers:


1

我没有一个完整的答案,但也许足以让您入门。这些功能可能会帮助:

ST_Line_Locate_Point()将该距离作为点沿一条线的总线长的一部分。ST_Line_Interpolate_Point()返回沿线以给定距离(再次为总长度的一部分)的点的点几何。

我建议这样做是为了获得直线上最接近gpspoints的位置“ new_pts”的点几何(在下面的子查询中,用WITH子句表示)。然后,使用该点查找实际在直线上的最近点,但是距离要稍小一些,因此它将更接近起点。接下来,使用此找到的点以及“ new_pt”来获取它们之间的方位角。这或多或少代表了该点与该线的切线。

然后,您可以将该角度与gpspoint的方位角进行比较,以确定是否添加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 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,segment_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

    segment_vertices_geom一个内部连接的vehicle_geom b在ST_Dwithin(ST_Transform(a.the_geom,32632),

    ST_Transform(b.the_geom,32632),20)在哪里((CAST(a.azimuth AS float8)-CAST(b.direction AS float8))<180 OR(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);

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.