线性参考是一种表示要素的方法,这些要素可以通过引用一个基本的线性要素来描述。使用线性参照建模的常见示例包括:
公路资产,这些资产使用公路网络沿线的英里来表示。
道路养护作业,指在一对英里测量之间沿着公路网发生的作业。
水产库存,其中鱼的存在位置被记录为距离上游的一段位置之间。
河流的水文特征,以河流的某一个点到另一个点作为参考。
线性参考模型的优点是,从属空间观测信息不需要与基准空间观测信息分开记录,对基础观测信息进行更新时,从属观测信息将自动更新从而追踪新几何图形。
注意:ESRI的线性参照约定是有一个线性空间要素的基表和一个非空间的事件表,其中非空间的事件表包括对空间要素的外键引用和沿参照要素的测量值。我们将使用术语"事件表(event table)"来表示我们构建的非空间表。
如果有一个要引用到线性网络的现有点表,要计算各点的线性参考比例,请使用ST_LineLocatePoint函数,该函数接受线串和点,并返回该点沿线串的线性参考比例。
-- Simple example of locating a point half-way along a line
SELECT ST_LineLocatePoint('LINESTRING(0 0, 2 2)', 'POINT(1 1)');
-- Answer 0.5
-- What if the point is not on the line? It projects to closest point
-- 即做(0, 2)点到线串(0 0, 2 2)的垂线,使用对应的垂足点来求线性参考比例
SELECT ST_LineLocatePoint('LINESTRING(0 0, 2 2)', 'POINT(0 2)');
-- Answer 0.5
我们可以使用ST_LineLocatePoint函数根据nyc_subway_stations创建相对于街道的"事件表"。
– 下面所有的SQL都是用来创建新的事件表的
CREATE TABLE nyc_subway_station_events AS
-- 我们首先需要找到一组可能最接近的候选者
-- streets, 按id和distance排列...
WITH ordered_nearest AS (
SELECT
ST_GeometryN(streets.geom,1) AS streets_geom,
streets.gid AS streets_gid,
subways.geom AS subways_geom,
subways.gid AS subways_gid,
ST_Distance(streets.geom, subways.geom) AS distance
FROM nyc_streets streets
JOIN nyc_subway_stations subways
ON ST_DWithin(streets.geom, subways.geom, 200)
ORDER BY subways_gid, distance ASC
)
-- 我们使用'distinct on'使每个地铁站信息只出现一次。
-- 然后,我们可以将这条街道信息置入ST_LinLocatePoint函数,使其沿着它的候选地铁站来计算
SELECT
DISTINCT ON (subways_gid)
subways_gid,
streets_gid,
ST_LineLocatePoint(streets_geom, subways_geom) AS measure,
distance
FROM ordered_nearest;
-- 主码对于可视化软件很有用
ALTER TABLE nyc_subway_station_events ADD PRIMARY KEY (subways_gid);
一旦我们有了一个事件表,将其转换回一个空间视图是很有趣的,这样我们就可以将事件相对于派生出它们的原始点进行可视化。
要从线性参考比例值得到位于线段上的对应点,我们可以使用ST_LineInterpolatePoint函数,下面是关于我们前面的简单例子的逆过程:
-- Simple example of locating a point half-way along a line
SELECT ST_AsText(ST_LineInterpolatePoint('LINESTRING(0 0, 2 2)', 0.5));
-- Answer POINT(1 1)
我们可以将nyc_subway_station_events表连接回nyc_streets表,并使用measure属性生成空间事件点(这个示例中是地铁站点),而无需引用原始nyc_subway_stations表。
-- New view that turns events back into spatial objects
CREATE OR REPLACE VIEW nyc_subway_stations_lrs AS
SELECT
events.subways_gid,
ST_LineInterpolatePoint(ST_GeometryN(streets.geom, 1), events.measure) AS geom,
events.streets_gid
FROM nyc_subway_station_events events
JOIN nyc_streets streets
ON (streets.gid = events.streets_gid);
查看街道上的原始地铁站点(红星)和事件点(蓝色圆圈),你可以看到事件是如何被直接捕捉到最近的街道线的(事件点全部位于街道线上)。
注意:线性参考函数的一个令人惊讶的用法与线性参考模型无关。如上所示,可以使用这些函数将点捕捉到线性要素(即可以使用线性参考来实现捕捉功能)。对于像GPS轨迹或其他预期参考线性网络的输入这样的用例,捕捉是一个方便的功能。
ST_LineInterpolatePoint(geometry A, double measure): Returns a point interpolated along a line.
ST_LineLocatePoint(geometry A, geometry B): Returns a float between 0 and 1 representing the location of the closest point on LineString to the given Point.
ST_Line_Substring(geometry A, double from, double to): Return a linestring being a substring of the input one starting and ending at the given fractions of total 2d length.
ST_Locate_Along_Measure(geometry A, double measure): Return a derived geometry collection value with elements that match the specified measure.
ST_Locate_Between_Measures(geometry A, double from, double to): Return a derived geometry collection value with elements that match the specified range of measures inclusively.
ST_AddMeasure(geometry A, double from, double to): Return a derived geometry with measure elements linearly interpolated between the start and end points. If the geometry has no measure dimension, one is added.