একটি পোস্টজিআইএস টেবিলটিতে জিওজেএসন বহুভুজটি কীভাবে sertোকানো যায়?


33

আমার জিওজেএসন থেকে আমার পোস্টজিআইএস টেবিলটিতে একটি বহুভুজ sertোকানো দরকার। এসকিউএল ক্যোয়ারীটি কেমন দেখাচ্ছে।

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)

জিওজেএসন ইতিমধ্যে সঠিক রেফারেন্স সিস্টেমে রয়েছে। তবে এটি নির্দিষ্ট করা হয়নি। জিওজেএসনে আমি কীভাবে এসআরআইডি নির্দিষ্ট করব? জিওজেসনের মতো দেখতে কী দরকার?

আপডেট করুন: আমি যখন দ্বারা নির্মিত জ্যামিতি মোড়ানো ST_GeomFromGeoJSONসঙ্গে ST_SetSRID(..., 3857)এটি অন্য ত্রুটি ছোঁড়ার। আমার দৃষ্টিতে দেখে মনে হচ্ছে না যে জ্যামিতির একটি Z মাত্রা রয়েছে।

ERROR:  Geometry has Z dimension but column does not

আমার মনে হয় আপনার এই সারণিতে শ্রীড রয়েছে: 4326, আপনার টেবিলটি শ্রীড হয়েছে বলে মনে হচ্ছে: 3857 তবে আপনার জিওজসনের দৈর্ঘ্য / অক্ষাংশ রয়েছে (অর্থাত্ শ্রীঃ: 4326 বা ডাব্লুজিএস 84)
গ্যারি

আমি 3857 টি ব্যবহার করতে চাই then জিওজেসনের কীভাবে তখন দেখতে হবে?
দানিজার

উত্তর:


32

পোস্টজিআইএসের উত্স কোডটি একবার দেখে আমি জানতে পেরেছিলাম যে এটি কীভাবে এসআরআইডিগুলিকে পার্স করে। জিওজেএসনে এসআরআইডি নির্দিষ্ট করার সঠিক উপায় এখানে।

জিওজেএসএন স্পেসিফিকেশন বলে যে বহুভুজের স্থানাঙ্কগুলি লাইন স্ট্রিংগুলির একটি অ্যারে are সুতরাং আমি তাদের অতিরিক্ত বন্ধনী দিয়ে মোড়ানো ছিল।

{
    "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. দ্বিতীয়ত, স্থানাঙ্কগুলি দেখে মনে হচ্ছে ভৌগলিক স্থানাঙ্ক ব্যবস্থায় মানগুলি লাটলং, সম্ভবত EPSG: 4326। এরপরে EPSG: 3857 এ রূপান্তর করা দরকার।

আপনি এই দুটি জিনিস সংশোধন করার পরে, আপনি নিম্নলিখিত এসকিউএল কোয়েরি ব্যবহার করে সারিটি সন্নিবেশ করতে পারেন:

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

যদি এটি কাজ না করে, (যেমন আপনি এখনও জেড ডেমসনিয়ন দিয়ে ত্রুটি পেয়ে যাচ্ছেন), দয়া করে পোস্টগিস সংস্করণ এবং আপনার সারণির তৈরি বিবৃতি দিয়ে প্রশ্নটি আপডেট করুন।


কেন আপনি মনে করেন যে স্থানাঙ্কগুলি ইপিএসজিতে নেই: 3857?
দঞ্জির

3
কারণ ইপিএসজি: 3857 এর ইউনিটগুলি (সিউডো) মিটার এবং মূলটি আটলান্টিক মহাসাগরে। মিটারগুলির সাথে আপনার 6 দশমিক যথার্থতা নেই এবং এই ডেটাটি আফ্রিকার উপকূলের নিকটবর্তী আটলান্টিক মহাসাগরে অবস্থিত।
দেবদত্ত টেংশে

স্থানাঙ্কগুলি কোনও মানচিত্রে ইনপুট থেকে আসে এবং অনেকগুলি দশমিক হয়। পরীক্ষার জন্য আমি আফ্রিকার নিকটবর্তী আটলান্টিক মহাসাগরের একটি অঞ্চল আকর্ষণ করি। তবে আপনাকে ধন্যবাদ আমি পুরো মিটারের স্থানাঙ্কগুলিকে গোল করার জন্য মানচিত্রটি উন্নত করতে পারি।
ডানিজার

@ দানিজার: তাহলে ঠিক আছে। যদি এই স্থানাঙ্কগুলি EPSG: 4326 এ থাকে তবে এটি মার্কিন যুক্তরাষ্ট্রের পূর্ব রাজ্যগুলিতে অবস্থিত।
দেবদত্ত টেংশে

5

পরিবর্তে আপনার জিওজসনের অবশ্যই ইউটিএম মান থাকতে হবে, আপনি প্রজ বা অন্যান্য অনলাইন সরঞ্জামের সাহায্যে এটি রূপান্তর করতে পারেন, তবে আপনি নিজের টেবিলে এটি সন্নিবেশ করার আগে এটি পোষ্টগিজ সহ সহজে এবং সরাসরি করতে পারেন, এটি চেষ্টা করুন (অনির্ধারিত):

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

সুতরাং আপনি কি এসআরআইডিকে 4326 এর উপরে 3857 এ রূপান্তর করতে পরামর্শ দিচ্ছেন? তারপরে আমি সরাসরি ST_Transfor (ST_SetSRID (..., 4326), 3857) চেষ্টা করতে পারলাম, পারলাম না? কেন এই অতিরিক্ত রূপান্তর পদক্ষেপের প্রয়োজন হবে?
দানিজার

আমার মনে হয় আপনি যা যা জিজ্ঞাসা করছেন তা পরীক্ষা করা উচিত, সম্ভবত আপনার পরামর্শ অনুসারে আপনার প্রয়োজনীয় একমাত্র পদক্ষেপ এটি চেষ্টা করে দেখুন এবং যা পেয়েছেন তা পোস্ট করুন
গ্যারি

এটাই আমি পাই। 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 নেই একটি স্ট্রিং হতে, এটা প্রশ্নে একটি স্ট্রিং নয় এবং এটা উত্তর অন্তত এক একটি স্ট্রিং না আছে। এই উত্তরটি সুস্পষ্টভাবে নির্দেশ করতে পারে, তবে এটি সবার কাছে অগত্যা সুস্পষ্ট নয়, তাই কিছুটা creditণ পাওয়ার দাবি রাখে।
ফোর্বসেমিস্টার
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.