2017-04-21 31 views
0

我在PostgreSQL中有一个名为“routes”的PostgreSQL表,其结构和数据如下。我想要一个查询,我将提供坐标(经度和纬度),它将返回一条最接近路线起点到终点的路线。 例如,(40.690503,-73.840581)沿大西洋路由下降,这意味着查询将返回第一行一个SQL查询,它将列出所有的路线,一个坐标下降或离坐标最近的路线

注意:路由是路径或路径,位于起点和终点之间。

下面是表结构和样本数据

Table Structure

#Table Structure 
CREATE TABLE public.route 
(
    name text NOT NULL, 
    startpoint point NOT NULL, 
    endpoint point NOT NULL, 
    id integer NOT NULL DEFAULT nextval('route_id_seq'::regclass), 
    CONSTRAINT route_pkey PRIMARY KEY (id) 
) 
WITH (
    OIDS=FALSE 
); 

#Table Data 
INSERT INTO public.route (name, startpoint, endpoint, id) VALUES ('Atlantic',  (-73.848838,40.688299), (-73.824869,40.694831), 1); 
INSERT INTO public.route (name, startpoint, endpoint, id) VALUES ('Guy Brewer', (-73.7991,40.708257), (-73.78543,40.688334), 2); 
+0

向我们展示db架构,示例数据和预期输出。 \t请阅读[**如何提问**](http://stackoverflow.com/help/how-to-ask) \t \t这里是一个伟大的地方[** START **] (http://spaghettidba.com/2015/04/24/how-to-post-at-sql-question-on-a-public-forum/)来了解如何提高您的问题质量并获得更好的答案。 ,向我们展示您的路线结构。我猜你有几何几何对象路线? –

+0

@JuanCarlosOropeza感谢您的回复。完成 –

+0

什么是路线?只是两点之间的直线? –

回答

0

在PostGIS的一个LINESTRING几何形状是这样的:

CREATE TABLE map.vzla_rto 
(
    link_id bigint, 
    geom geometry(LineString) 
) 

SELECT ST_ASTEXT(geom) 
FROM map.vzla_rto; 

"LINESTRING(-72.285868 10.291798, 
      -72.285604 10.291983, 
      -72.285272 10.292124, 
      -72.28512 10.292168, 
      -72.284727 10.292228)" 

这里我使用了<-> PostGIS的经营者找到最接近该点的道路对象。然后使用ST_Distance函数来知道到最近的道路的距离,并选择最近的道路。

CREATE OR REPLACE FUNCTION map.get_near_link(
    x numeric, 
    y numeric) 
    RETURNS map.get_near_link AS 
$BODY$ 
DECLARE 
    strPoint text; 
    sRow map.get_near_link; -- custom type to return all link fields 
    BEGIN 
    strPoint = 'POINT('|| X || ' ' || Y || ')'; 

    with index_query as (
     SELECT Link_ID, 
       TRUNC(ST_Distance(ST_GeomFromText(strPoint,4326), geom )*100000)::integer as distance,     
       geom 
     FROM map.vzla_seg S 
     ORDER BY 
      geom <-> ST_GeomFromText(strPoint, 4326) 
     LIMIT 101 
    ) 
    SELECT i.Link_ID, i.Distance, i.geom into sRow 
    FROM 
     index_query i 
    ORDER BY 
     distance limit 1; 

    RAISE DEBUG 'GetLink distance % ', sRow.distance; 
    if sRow.distance > 50 then 
     sRow.link_id = -1; 
    end if; 

    RETURN sRow; 
    END; 
$BODY$ 
    LANGUAGE plpgsql IMMUTABLE 
    COST 100; 
相关问题