এসকিউএল কোয়েরিতে পোস্টজিআইএস থেকে সম্পূর্ণ জিওজসন বৈশিষ্ট্য রয়েছে?


35

আমি পোস্টজিআইএসের বৈশিষ্ট্য সহ একটি জিওজসন বৈশিষ্ট্য পেতে চাই। একটি বৈশিষ্ট্য সংগ্রহের জন্য আমি একটি উদাহরণ পেয়েছি তবে আমি এটি কেবল কোনও বৈশিষ্ট্যের জন্য কাজ করতে পারি না।

SELECT row_to_json(fc)
 FROM ( SELECT 'FeatureCollection' As type, array_to_json(array_agg(f)) As features
 FROM (SELECT 'Feature' As type
    , ST_AsGeoJSON(lg.geog)::json As geometry
    , row_to_json(lp) As properties
   FROM locations As lg 
         INNER JOIN (SELECT loc_id, loc_name FROM locations) As lp 
       ON lg.loc_id = lp.loc_id  ) As f )  As fc;

এখনও পর্যন্ত আমি উদাহরণটির বৈশিষ্ট্য সংগ্রহের ক্যোয়ারীটি সংশোধন করার চেষ্টা করেছি। তবে আউটপুটটি বৈধ নয়।


আমাকে অন্য অ্যাপ্লিকেশনটির জন্য ধারণার প্রুফ করতে হয়েছিল তাই এই রেপোটি একসাথে রেখেছিলাম যা অংশ থেকে উত্তরগুলি এখানে ব্যবহার করে। আশা করি এই
স্টাফটি

উত্তর:


59

json_build_objectপোস্টগ্র্রেএসকিউএল 9.4+ এ এটি আরও কিছুটা সহজভাবে করা যেতে পারে , যা আপনাকে বিকল্প কী / মান যুক্তি সরবরাহ করে একটি JSON তৈরি করতে দেয়। উদাহরণ স্বরূপ:

SELECT json_build_object(
    'type',       'Feature',
    'id',         gid,
    'geometry',   ST_AsGeoJSON(geom)::json,
    'properties', json_build_object(
        'feat_type', feat_type,
        'feat_area', ST_Area(geom)::geography
     )
 )
 FROM input_table;

পোস্টগ্রিসএসকিউএল 9.5+ এ জিনিসগুলি আরও উন্নত হয় যেখানে কিছু নতুন অপারেটর jsonbডেটা টাইপের ( ডক্স ) জন্য যুক্ত করা হয়। এটি আইডি এবং জ্যামিতি ব্যতীত সমস্ত কিছু সম্বলিত একটি "বৈশিষ্ট্য" অবজেক্ট সেট আপ করা সহজ করে ।

SELECT jsonb_build_object(
    'type',       'Feature',
    'id',         gid,
    'geometry',   ST_AsGeoJSON(geom)::jsonb,
    'properties', to_jsonb(row) - 'gid' - 'geom'
) FROM (SELECT * FROM input_table) row;

একটি বৈশিষ্ট্য সংগ্রহ করতে চান? কেবল এগুলি দিয়ে সমস্ত গুটিয়ে নিন jsonb_agg:

SELECT jsonb_build_object(
    'type',     'FeatureCollection',
    'features', jsonb_agg(features.feature)
)
FROM (
  SELECT jsonb_build_object(
    'type',       'Feature',
    'id',         gid,
    'geometry',   ST_AsGeoJSON(geom)::jsonb,
    'properties', to_jsonb(inputs) - 'gid' - 'geom'
  ) AS feature
  FROM (SELECT * FROM input_table) inputs) features;

1
এই কার্যকারিতাটি একা আমাকে আজ সকালে 9.3.5 থেকে 9.5.3 এ আপগ্রেড করতে স্ক্র্যাম্বল করছে। যদি এটা হিসাবে সহজ হিসাবে ছিল regexp_replace(current_setting('server_version'),'(\d)\.(\d)\.(\d)','\1.\3.\2')...
জি.টি.।

1
ঠিক আছে - এখনই সমস্ত আপগ্রেড হয়েছে (যদিও উইন্ডোজ পরিষেবা হিসাবে চালানোর জন্য 9.5.3 পেতে পারে না)। যাইহোক ... দেওয়া উদাহরণ সম্পর্কে একটি সামান্য জিনিস - দ্বিতীয়টির json_build_objectকমাগুলির পরিবর্তে কলোন রয়েছে।
জিটি

pg v9.6
পাক

2
সম্পূর্ণতার জন্য, সম্ভবত জ্যামিতিটির শীর্ষকোষগুলি কঠোর জিওজসনের (ডান হাতের নিয়ম) সঠিক ক্রমে নেই, এটিকে সংশোধন করার জন্য, আমরা জ্যামের মধ্যে শীর্ষাংশগুলিকে ST_ForcePolygonCCW - পুনর্গঠন
T_

1
@ ক্রিসমার্ক এটি একটি ভাল বিষয় এবং এটি পোস্টজিআইএসের কার্যকারিতাটি নিজস্বভাবে ST_AsGeoJSONসংশোধন করার জন্য পরিবর্তন করা উচিত কিনা তা উত্থাপন করে ।
dbaston

21

এই উত্তরটি পোস্টগ্র্রেএসকিউএল 9.4 এর পূর্ববর্তী সংস্করণে ব্যবহার করা যেতে পারে। ব্যবহারের dbaston এর উত্তর পোস্টগ্রি জন্য 9.4+

ক্যোয়ারী নিম্নোক্ত: (যেখানে 'GEOM'জ্যামিতি ক্ষেত্র, idক্ষেত্র JSON সম্পত্তি, অন্তর্ভুক্ত করতে shapefile_featureটেবিল নাম, এবং 489445বৈশিষ্ট্যের আইডি চেয়েছিলাম)

SELECT row_to_json(f) As feature \
     FROM (SELECT 'Feature' As type \
     , ST_AsGeoJSON('GEOM')::json As geometry \
     , row_to_json((SELECT l FROM (SELECT id AS feat_id) As l)) As properties \
     FROM shapefile_feature As l WHERE l.id = 489445) As f;

আউটপুট:

{
   "geometry":{
      "type":"MultiPolygon",
      "coordinates":[
         [
            [
               [
                  -309443.24253826,
                  388111.579584133
               ],
               [
                  -134666.391073443,
                  239616.414560895
               ],
               [
                  -308616.222736376,
                  238788.813082666
               ],
               [
                  -309443.24253826,
                  388111.579584133
               ]
            ]
         ]
      ]
   },
   "type":"Feature",
   "properties":{
      "feat_id":489445
   }
}

যেহেতু আপনি এটিকে আপনার প্রশ্নের শরীর থেকে উত্তরটিতে নিয়ে এসেছেন, এর অর্থ কি এই কোয়েরি এবং ফলাফলটি এখন সঠিকভাবে কাজ করছে? জিওজেএসএনলিন্টের মাধ্যমে এটি চালানো , এখনও এটি বৈধ আউটপুট দিচ্ছে বলে মনে হয় না।
রায়ানডাল্টন

1
দুর্দান্ত, এটি উপলব্ধি করে। আমি অনুমান করি যে আমি কেবল যথেষ্ট ঘনিষ্ঠভাবে দেখিনি। একবার জিআইএস.এসই প্রশ্নটি বন্ধ করে দেওয়ার অনুমতি দিলে এটিকে "স্বীকৃত" হিসাবে নির্দ্বিধায় মনে করেন। ধন্যবাদ!
রায়ানডাল্টন

1
এটি কেবল জিওএসএসএনলিন্ট নয় যা একক উদ্ধৃতি গ্রহণ করে না। জেএসএন কোনওভাবেই একক উদ্ধৃতিগুলি আনুষ্ঠানিকভাবে স্বীকৃতি দেয় না। যদি কোনও পার্সার এগুলিকে সনাক্ত করে তবে এটি একটি মানহীন এক্সটেনশন এবং সম্ভবত সেরা এড়ানো হবে avoided
jpmc26

@ BelowtheRadar এটি একটি dict, জেএসএন নয়। এগুলি খুব আলাদা জিনিস। জেএসএন একটি স্ট্রিং। সর্বদা. এটি একটি পাঠ্য বিন্যাস, একইভাবে এক্সএমএল কেবল একটি পাঠ্য বিন্যাস। এ dictমেমরি অবজেক্ট ইন।
jpmc26

5

ডাবস্টনের উত্তরের জন্য সামান্য সংশোধন (আমি মন্তব্য করব তবে আমার পয়েন্ট নেই) আপনার এস এস এএসজিও জেএসএন এর আউটপুটটিকে জেসন (জিনিসটি ::json) হিসাবে কাস্ট করতে হবে :

SELECT json_build_object(
  'type',       'Feature',
  'id',         gid,
  'geometry',   ST_AsGeoJSON(geom)::json,
  'properties', json_build_object(
    'feat_type', feat_type,
    'feat_area', ST_Area(geom)::geography
  )
)
FROM input_table;

অন্যথায় জ্যামিতি সদস্য একটি স্ট্রিং হতে চলেছে। এটি বৈধ জিওজেএসন নয়


4

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

উত্তরে সরাসরি মন্তব্য করার মতো খ্যাতি আমার নেই, তবে চূড়ান্ত জসনব_এগটি "বৈশিষ্ট্য" উপস্থানে নয়, "বৈশিষ্ট্য" কলামে থাকা উচিত। কলামের নামের সাথে একত্রিত করা (বা "বৈশিষ্ট্যগুলি: ফিচার" যদি আপনি এটি নিকৃষ্টভাবে খুঁজে পান) প্রতিটি উপাদানকে সরাসরি "বৈশিষ্ট্যগুলি" অ্যারে যোগ করার পরে রাখে যা সঠিক পথ।

সুতরাং নিম্নলিখিতটি, যা @ ডাবাস্টনের জবাবের সাথে বেশ সমান, যেমনটি কয়েক সপ্তাহ আগে পর্যন্ত ছিল (প্লাস @ জোহান পাওয়েল এর উপকরণের নামকরণের সংশোধন) কাজ করে:

SELECT jsonb_build_object(
  'type',     'FeatureCollection',
  'features', jsonb_agg(feature)
)
FROM (
  SELECT jsonb_build_object(
    'type',       'Feature',
    'id',         gid,
    'geometry',   ST_AsGeoJSON(geom)::jsonb,
    'properties', to_jsonb(inputs) - 'gid' - 'geom'
  ) AS feature
  FROM (
    SELECT * FROM input_table
  ) inputs
) features;
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.