25. Linjär referenstagning¶
Linjär referenstagning (ibland kallad ”dynamisk segmentering”) är ett sätt att representera egenskaper som kan beskrivas genom att referera till en basuppsättning av linjära egenskaper. Vanliga exempel på funktioner som modelleras med hjälp av linjär referering är:
Highway assets, som refereras till med hjälp av mil längs ett motorvägsnätverk
Väghållningsåtgärder, som refereras till som förekommande längs ett vägnät mellan ett par milmätningar.
Vatteninventeringar, där fiskförekomst registreras som befintlig mellan ett par mätningar av kilometer uppströms.
Hydrologiska karakteriseringar (”sträckor”) av vattendrag, registrerade med en från- och till-kilometer.
Fördelen med linjära referensmodeller är att de beroende spatiala observationerna inte behöver registreras separat från basobservationerna, och uppdateringar av basobservationsskiktet kan utföras i vetskap om att de beroende observationerna automatiskt kommer att följa den nya geometrin.
Observera
Esris terminologiska konvention för linjär referens är att ha en bastabell med linjära spatiala egenskaper och en icke-spatial tabell med ”händelser” som innehåller en främmande nyckelreferens till den spatiala egenskapen och en mätning längs den refererade egenskapen. Vi kommer att använda termen ”händelsetabell” för att hänvisa till de icke-spatiala tabeller vi bygger.
25.1. Skapa linjära referenser¶
Om du har en befintlig punkttabell som du vill referera till ett linjärt nätverk använder du funktionen ST_LineLocatePoint, som tar en linje och en punkt och returnerar den andel längs linjen som punkten kan hittas.
-- 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
SELECT ST_LineLocatePoint('LINESTRING(0 0, 2 2)', 'POINT(0 2)');
-- Answer 0.5
Vi kan konvertera nyc_subway_stations till en ”händelsetabell” i förhållande till gatorna genom att använda ST_LineLocatePoint.
-- All the SQL below is in aid of creating the new event table
CREATE TABLE nyc_subway_station_events AS
-- We first need to get a candidate set of maybe-closest
-- streets, ordered by id and 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
)
-- We use the 'distinct on' PostgreSQL feature to get the first
-- street (the nearest) for each unique street gid. We can then
-- pass that one street into ST_LineLocatePoint along with
-- its candidate subway station to calculate the measure.
SELECT
DISTINCT ON (subways_gid)
subways_gid,
streets_gid,
ST_LineLocatePoint(streets_geom, subways_geom) AS measure,
distance
FROM ordered_nearest;
-- Primary keys are useful for visualization softwares
ALTER TABLE nyc_subway_station_events ADD PRIMARY KEY (subways_gid);
När vi väl har en händelsetabell är det kul att omvandla den till en spatial vy, så att vi kan visualisera händelserna i förhållande till de ursprungliga punkter som de härrör från.
För att gå från ett mått till en punkt använder vi funktionen ST_LineInterpolatePoint. Här är våra tidigare enkla exempel omvända:
-- 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)
Och vi kan koppla nyc_subway_station_events-tabellerna tillbaka till nyc_streets-tabellen och använda attributet measure för att generera de spatiala händelsepunkterna, utan att hänvisa till den ursprungliga nyc_subway_stations-tabellen.
-- 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);
Om du tittar på originalpunkterna (röd stjärna) och händelsepunkterna (blå cirkel) med gatorna kan du se hur händelserna knyts direkt till de närmaste gatulinjerna.

Observera
En överraskande användning av de linjära referensfunktionerna har inget att göra med linjära referensmodeller. Som visas ovan är det möjligt att använda funktionerna för att snäppa punkter till linjära funktioner. För användningsfall som GPS-spår eller andra ingångar som förväntas referera till ett linjärt nätverk är snäppning en praktisk funktion att ha tillgänglig.
25.2. Funktionslista¶
ST_LineInterpolatePoint(geometry A, double measure): Returnerar en punkt interpolerad längs en linje.
ST_LineLocatePoint(geometri A, geometri B): Returnerar en flottör mellan 0 och 1 som representerar platsen för den punkt på LineString som ligger närmast den angivna Point.
ST_LineSubstring(geometri A, dubbel från, dubbel till): Returnerar en linjestring som är en delsträng av den ingående som börjar och slutar vid de angivna fraktionerna av den totala 2d-längden.
ST_LocateAlong(geometri A, dubbelmått): Returnerar ett härlett geometrisamlingsvärde med element som matchar det angivna måttet.
ST_LocateBetween(geometry A, double from, double to): Returnerar ett härlett geometrisamlingsvärde med element som matchar det angivna intervallet av mått inklusive.
ST_AddMeasure(geometry A, double from, double to): Returnerar en härledd geometri med måttelement linjärt interpolerade mellan start- och slutpunkterna. Om geometrin inte har någon måttdimension läggs en till.