PostGIS के साथ एक पोल-रैपिंग समुद्र तट के साथ बिंदु नमूनाकरण


11

मैं एक ऐसे कार्य पर काम कर रहा हूं, जिसके लिए मुझे हर 1000 किमी के किनारे पर नमूना बिंदु प्राप्त करने की आवश्यकता है, और अंटार्कटिका के साथ एक समस्या में भाग लिया है। मैं जो कुछ बता सकता हूं, उससे यह लगता है कि यह फ़ंक्शन में ज्यामिति के उपयोग के साथ एक मुद्दा है, जब मुझे लगता है कि इस ऑपरेशन के लिए भूगोल का उपयोग किया जाना चाहिए।

इसी समान प्रश्न से फ़ंक्शन का उपयोग करते हुए , मैं एक परिणाम का उत्पादन करने में सक्षम हूं जो इस तरह दिखता है बुरा परिणाम:।

जैसा कि आप देख सकते हैं, ST_AddMeasure()और ST_LocateAlong()ज्यामिति को गोलाकार रूप से व्यवहार नहीं करते हैं, जिसके परिणामस्वरूप कई बिंदु हैं जो दक्षिण ध्रुव पर बैठते हैं। तिथि रेखा (बाईं ओर) के साथ क्लिप पर एक बिंदु भी जोड़ा गया था। इन दोनों कार्यों के प्रलेखन के अनुसार, केवल ज्यामिति का उपयोग किया जा सकता है।

बहुभुज और अंक उत्पन्न करने के लिए उपयोग किए जाने वाले कोड को यहां पाया जा सकता है , लेकिन यह वह SQL है जिसका उपयोग अंक उत्पन्न करने के लिए किया जाता है:

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;

मैं इस समुद्र तट के साथ प्रत्येक 1000 किलोमीटर पर अंक कैसे उत्पन्न कर सकता हूं?


क्या आपने ST_Segmentize की कोशिश की है? यह केवल जियोमेट्री पर काम कर सकता है, लेकिन कम से कम अंक उत्पन्न करने के लिए एक तेज तरीका की तरह लगता है। वैसे भी, पोल पर अंक क्यों नहीं हटाए? यह बग की तुलना में उपयोग किए गए प्रक्षेपण के एक साइड इफेक्ट की तरह दिखता है।
lynxlynxlynx

5
आपकी तस्वीर से, ऐसा लगता है कि आपके पास EPSG: 4326 में आपकी ज्यामिति है। अंटार्कटिका ईपीएसजी: 3031 जैसे ध्रुवीय स्टैरोग्राफिक प्रक्षेपण के लिए बेहतर अनुकूल है। फिर भी, ऐसा लगता है कि आपको डेट लाइन के साथ, पोल और बैक में कट-लाइन से निपटने की आवश्यकता हो सकती है।
टोबी स्पाइट

जवाबों:


3

जैसा कि टिप्पणियों में से एक में सुझाव दिया गया है, मैं पहले इनपुट ज्यामिति को एक ध्रुवीय स्टीरियोग्राफिक प्रक्षेपण में बदल दूंगा।

अतिरिक्त रूप से, आप परिणामी कट लाइन से छुटकारा पाने के लिए ST_Bufferउस पर (एक राशि के साथ 0) उपयोग करना चाहेंगे ।

तो इससे आपका वांछित परिणाम प्राप्त होगा:

-- 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

ध्यान दें कि यह क्वेरी मानती है कि line_sample_testतालिका में केवल एक पंक्ति है , इसलिए अपने वास्तविक इनपुट डेटा के लिए आवश्यक रूप से ट्विक करें।


मैं ST_Buffer(geom, 0)कट-लाइन को खत्म करने की तरकीब नहीं जानता था - यह उपयोगी है!
टोबे स्पाइट
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.