PostGIS ile kutup sarmalı sahil şeridi boyunca nokta örnekleme


11

Kıyı şeridinde her 1000 km'de bir örnek puan almamı gerektiren bir görev üzerinde çalışıyorum ve Antarktika ile ilgili bir sorunla karşılaştım. Anlatabildiğim kadarıyla, bu operasyon için coğrafyanın gerçekten kullanılması gerektiğini düşündüğümde, fonksiyonlarda geometri kullanımı ile ilgili bir sorun gibi görünüyor .

Dan işlevini kullanarak bu çok benzer bir soru , ben bakışlar böyle bir sonuç üretememesi duyuyorum: kötü sonuç.

Gördüğünüz olarak ST_AddMeasure()ve ST_LocateAlong()Güney Kutbu üzerinde oturmak pek çok noktada hangi sonuçları, küresel geometriyi tedavi etmek görünmüyor. Tarih çizgisi boyunca (sol taraf) klibe bir nokta bile eklendi. Bu iki işlevin belgelerine göre, sadece geometri kullanılabilir.

Çokgeni ve noktaları oluşturmak için kullanılan kod burada bulunabilir , ancak bu noktaları oluşturmak için kullanılan SQL'dir:

CREATE TABLE atest AS WITH line AS 
  (SELECT
      id,
      ST_ExteriorRing((ST_Dump(geom)).geom) AS geom
    FROM line_sample_test),
linemeasure AS
    (SELECT
        ST_AddMeasure(line.geom, 0, (ST_Length(line.geom))::int) AS linem,
    generate_series(0, (ST_Length(line.geom))::int, 10) AS i
FROM line),

geometries AS (
    SELECT
        i,
        ST_LocateAlong(linem, i) AS geom 
    FROM linemeasure)

SELECT
    * from geometries;

Bu sahil şeridindeki her 1000 Km'de nasıl puan oluşturabilirim?


ST_Segmentize'i denediniz mi? Ayrıca sadece geometriler üzerinde çalışabilir, ancak en azından noktaları oluşturmak için daha hızlı bir yol gibi görünüyor. Her neyse, neden sadece kutuptaki noktaları kaldırmıyorsunuz? Kullanılan projeksiyonun bir hatadan ziyade bir yan etkisi gibi görünüyor.
lynxlynxlynx

5
Resminizden, geometrinizin EPSG: 4326'da olduğu görülüyor. Antarktika, EPSG: 3031 gibi polar bir stereografik projeksiyon için daha uygundur. O zaman bile, Tarih Hattı boyunca direğe ve arkaya bir kesim çizgisi ile uğraşmanız gerekebilir.
Toby Speight

Yanıtlar:


3

Yorumlardan birinde önerildiği gibi, önce giriş geometrisini polar stereografik projeksiyona dönüştürürüm.

Ek olarak, ortaya çıkan kesim çizgisinden kurtulmak ST_Bufferiçin (bir miktar 0) kullanmak istersiniz .

Böylece istediğiniz sonucu elde edersiniz:

-- ST_Transform(geom,3031) reprojects to south polar stereographic,
-- in meters.  ST_Buffer(...) doesn't change the shape, but removes
-- the cut line to the pole (at 180 degrees).
WITH line AS (
    SELECT ST_ExteriorRing(
        ST_Buffer(ST_Transform(geom, 3031), 0)
    ) AS geom
    FROM line_sample_test
),

-- This just generates a table of numbers.  In this case, from 0
-- to the geometry length, counting by 1,000,000 (1000 km).
linemeasure AS (
    SELECT generate_series(0, ST_Length(geom)::int, 1000000) AS i
    FROM line
),

-- Convert those values to a fraction of the overall length (for
-- use as input to ST_LineInterpolatePoint)
linefraction AS (
    SELECT i / ST_Length(geom) AS fraction
    FROM line, linemeasure
),

-- Do the interpolation
geometries AS (
    SELECT ST_LineInterpolatePoint(l.geom, lf.fraction) AS geom
    FROM linefraction lf, line l
),

-- Convert back to EPSG:4326 (i.e. lat/lon coords)
geometries_4326 AS (
    SELECT ST_Transform(geom, 4326) AS geom FROM geometries
)
SELECT * FROM geometries_4326

Bu sorgunun line_sample_testtabloda yalnızca bir satır olduğunu varsaydığına dikkat edin , bu nedenle gerçek giriş verileriniz için gereken şekilde ayarlayın.


ST_Buffer(geom, 0)Kesik çizgiyi ortadan kaldırma hilesini bilmiyordum - bu yararlı!
Toby Speight
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.