PostGIS टेबल में GeoJSON बहुभुज कैसे डालें?


33

मुझे जियोजन्स से अपने पोस्टगिस टेबल में एक बहुभुज सम्मिलित करने की आवश्यकता है। यह SQL क्वेरी जैसा दिखता है।

INSERT INTO tablename (name, polygon)
VALUES (
    'Name',
    ST_GeomFromGeoJSON(
        '{
            "type": "Polygon",
            "coordinates": [
                [7.734375,51.835777520452],
                [3.8671875,48.341646172375],
                [7.20703125,43.580390855608],
                [18.6328125,43.834526782237],
                [17.9296875,50.289339253292],
                [13.7109375,54.059387886624],
                [7.734375,51.835777520452]
            ]
        }'
    )
)

दुर्भाग्य से, मुझे एक त्रुटि संदेश मिलता है।

ERROR:  Geometry SRID (0) does not match column SRID (3857)

GeoJSON पहले से ही सही संदर्भ प्रणाली में है। लेकिन यह निर्दिष्ट नहीं है। मैं GeoJSON में SRID को कैसे निर्दिष्ट करूं? जियोसन को कैसा दिखता है?

अद्यतन: जब मैं इसके ST_GeomFromGeoJSONसाथ बनाई गई ज्यामिति को लपेटता हूं ST_SetSRID(..., 3857)तो दूसरी त्रुटि होती है। मेरे विचार में ऐसा नहीं लगता कि ज्यामिति का कोई Z आयाम है।

ERROR:  Geometry has Z dimension but column does not

मुझे लगता है कि आपको यह निर्दिष्ट करने की आवश्यकता है कि तालिका में srid: 4326 है, ऐसा लगता है कि आपकी तालिका में srid: 3857 है, लेकिन आपके geojson में लंबा / अक्षांश (यानी। srid: 4326 या WGS84) है
Gery

मैं 3857 का उपयोग करना चाहता हूं। जियोसन को तब कैसा दिखता है?
दानीझार

जवाबों:


32

PostGIS के स्रोत कोड पर एक नज़र डालने पर मुझे पता चला कि यह SRID को कैसे पार करता है। जियोजन में SRID को निर्दिष्ट करने का सही तरीका यहाँ दिया गया है।

GeoJSON विनिर्देशन का कहना है कि बहुभुज के निर्देशांक लाइन स्ट्रिंग्स का एक सरणी हैं। इसलिए मुझे उन्हें अतिरिक्त ब्रैकेट के साथ लपेटना पड़ा।

{
    "type":"Polygon",
    "coordinates":
    [
        [
            [-91.23046875,45.460130637921],
            [-79.8046875,49.837982453085],
            [-69.08203125,43.452918893555],
            [-88.2421875,32.694865977875],
            [-91.23046875,45.460130637921]
        ]
    ],
    "crs":{"type":"name","properties":{"name":"EPSG:3857"}}
}

16

आपके JSON के साथ कुछ समस्याएं हैं।

  1. सबसे पहले, निर्देशांक सरणी का एक सरणी होना चाहिए।
  2. दूसरे, निर्देशांक को देखते हुए, ऐसा लगता है कि मान एक भौगोलिक समन्वय प्रणाली में लाटलोंग हैं, जो कि शायद ईपीएसजी: 32326 है। इसके बाद ईपीएसजी: 3857 में तब्दील होने की जरूरत है।

एक बार जब आप इन दो चीजों को ठीक कर लेते हैं, तो आप निम्न SQL क्वेरी का उपयोग करके, पंक्ति को सम्मिलित कर सकते हैं:

INSERT INTO "Parcels"("Name", the_geom)
    VALUES ('Corrected_Shape', 
    ST_TRANSFORM(ST_GeomFromGeoJSON('{
    "type":"Polygon",
    "coordinates":[[
        [-91.23046875,45.460130637921],
        [-79.8046875,49.837982453085],
        [-69.08203125,43.452918893555],
        [-88.2421875,32.694865977875],
        [-91.23046875,45.460130637921]
    ]],
    "crs":{"type":"name","properties":{"name":"EPSG:4326"}}
}'),3857));

यदि यह काम नहीं करता है, (यानी आप अभी भी जेड डायमेंशन के साथ त्रुटि प्राप्त कर रहे हैं), तो कृपया पोस्टजीस संस्करण के साथ सवाल अपडेट करें, और अपनी तालिका का विवरण बनाएं।


आपको क्या लगता है कि निर्देशांक EPSG: 3857 में क्यों नहीं हैं?
दानीजार

3
क्योंकि EPSG: 3857 की इकाइयाँ (छद्म) मीटर हैं, और उत्पत्ति अटलांटिक महासागर में है। आपके पास मीटर के साथ 6 दशमलव सटीकता नहीं होगी, और यह डेटा अफ्रीका के तट के पास अटलांटिक महासागर में होगा।
देवदत्त तेंगशे

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

@danijar: फिर यह सब ठीक है। अगर ये निर्देशांक EPSG: 4326 में होते, तो यह अमेरिका के पूर्वी राज्यों में होता।
देवदत्त तेंगशे

5

इसके बजाय आपके जियोजोन में UTM मान होना चाहिए, आप इसे प्रोज या अन्य ऑनलाइन टूल के साथ बदल सकते हैं, लेकिन आप इसे अपनी तालिका में डालने से पहले आसानी से और सीधे पोस्टगिस के साथ कर सकते हैं, इसे आज़माएं (अप्राप्त):

SELECT ST_AsText(ST_Transform(ST_GeomFromGeoJSON
    (
        {
            "type":"Polygon",
            "coordinates":[
                [7.734375,51.835777520452],
                [3.8671875,48.341646172375],
                [7.20703125,43.580390855608],
                [18.6328125,43.834526782237],
                [17.9296875,50.289339253292],
                [13.7109375,54.059387886624],
                [7.734375,51.835777520452]
            ]
        }
    ),4326),3857));

तो आप SRID को 4326 से 3857 में बदलने का सुझाव देते हैं? तब मैं सीधे ST_Transform (ST_SetSRID (..., 4326), 3857) की कोशिश कर सकता था, क्या मैं नहीं कर सकता था? यह अतिरिक्त परिवर्तन कदम क्यों आवश्यक होगा?
दानीजार

मुझे लगता है कि आपको परीक्षण करना चाहिए कि आप क्या पूछ रहे हैं, शायद आप जो सुझाव देते हैं वह केवल एक कदम है जिसकी आपको आवश्यकता है, इसे आज़माएं और आपको जो मिला है उसे पोस्ट करें
Gery

यही मुझे मिलता है। ERROR: transform: couldn't project point (9.25253e-302 6.08985e+159 1.18576e-322): latitude or longitude exceeded limits (-14)
दानीझार

3
INSERT INTO tablename (name, polygon)
VALUES
(
    'Name',
    ST_GeomFromGeoJSON
    (
        '{
            "type":"Polygon",
            "coordinates":[
                [7.734375,51.835777520452],
                [3.8671875,48.341646172375],
                [7.20703125,43.580390855608],
                [18.6328125,43.834526782237],
                [17.9296875,50.289339253292],
                [13.7109375,54.059387886624],
                [7.734375,51.835777520452]
            ]
        }'
    )
)

लापता "'"


4
क्या आप इस उत्तर में अधिक संदर्भ जोड़ सकते हैं और बता सकते हैं कि यह ओपी के प्रश्न का उत्तर कैसे देता है, और मौजूदा उत्तरों से अलग है
देवदत्त तेंग्शे

ईमानदारी से, JSON को एक स्ट्रिंग होना चाहिए, यह प्रश्न में एक स्ट्रिंग नहीं है और यह कम से कम उत्तरों में से एक स्ट्रिंग नहीं है। यह उत्तर स्पष्ट हो सकता है, लेकिन यह सभी के लिए आवश्यक नहीं है, इसलिए कुछ श्रेय के हकदार हैं।
फोर्ब्समेस्टर
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.