0

私はPostgreSQL8.4+PostGISを持っています。

1つの列に線ストリングジオメトリのテーブルがあります。このラインストリングのポイントが1つあり、次のポイントを取得したいと思います。このために、関数ST_NPointsST_PointNを使用したいと思います。これを使用するには、すべてのポイントを並べ替えて自分のポイントを見つける必要があります。この後、次のポイントが必要なものであることがわかります。

これは私のテーブルです:

-- Table: filedata

-- DROP TABLE filedata;

CREATE TABLE filedata
(
  num serial NOT NULL,
 id integer,
 mydata character(25),
 the_geom geometry,
 CONSTRAINT filedata_pkey PRIMARY KEY (num)
)
WITH (
OIDS=FALSE
);
ALTER TABLE filedata OWNER TO postgres;

そして例のlinestring:

"LINESTRING(60.7014631515719 56.8441322356241,60.7023117507097 56.8445673405349,60.702948200063 56.8447993944193,60.703902874093 56.8448574076656,60.706236521722 56.8447993944193,60.7094187684889 56.8449444273664,60.7121236782406 56.8450894597515,60.715571112238 56.8452925041466,60.718382096882 56.8454085290207,60.7204505572805 56.8453505166286,60.7222538304482 56.8450314468649,60.7246405155233 56.8444513130533,60.7260194891224 56.8440742212539,60.7260194891224 56.8440742212539,60.7260194891224 56.8440742212539,60.7260194891224 56.844045214035)"
4

1 に答える 1

2

行文字列の次の行を意味すると仮定すると、次のようなことができます。

WITH 
  -- The input data; this would be from the `filedata` table normally
  geom(line) AS (VALUES ('LINESTRING(60.7014631515719 56.8441322356241,60.7023117507097 56.8445673405349,60.702948200063 56.8447993944193,60.703902874093 56.8448574076656,60.706236521722 56.8447993944193,60.7094187684889 56.8449444273664,60.7121236782406 56.8450894597515,60.715571112238 56.8452925041466,60.718382096882 56.8454085290207,60.7204505572805 56.8453505166286,60.7222538304482 56.8450314468649,60.7246405155233 56.8444513130533,60.7260194891224 56.8440742212539,60.7260194891224 56.8440742212539,60.7260194891224 56.8440742212539,60.7260194891224 56.844045214035)'::geometry)),
  -- Create a set of (index,point) rows
  --
  point_series(line,n) AS (
      SELECT line, generate_series(1, ST_NPoints(line)) FROM geom
  ),
  -- Annotate that row set to include the prior point in each row,
  -- ie (n, point_n, point_n_minus_one)
  --
  lagged_points(pointidx, point, lagpoint) AS (
    SELECT n, ST_PointN(line,n) AS pointn,
           lag(ST_PointN(line,n)) OVER () AS point_n1
    FROM point_series
  )
-- Now SELECT the point we want, the point after
-- the one specified in the WHERE clause
SELECT astext(point)
FROM lagged_points
WHERE lagpoint = 'POINT(60.7014631515719 56.8441322356241)'::geometry;

PostGISgeometryがポイントの配列に変換する方法を提供した場合、これは非常に簡単になります。また、intarrayのidx関数と同等の機能があれば、より簡単になります。

于 2012-10-15T12:37:10.827 に答える