পোস্টজিআইএস ব্যবহার করে বহুভুজ দিয়ে রাস্টারকে ছেদ করা - প্রত্নতাত্ত্বিক ত্রুটি


15

আমি কিছু রাস্টার / বহুভুজ ছেদ করার জন্য PostGIS2.0 ব্যবহার করছি । আমার কোন অপারেশনটি ব্যবহার করা উচিত এবং এটি সম্পাদন করার দ্রুততম উপায় কী তা বুঝতে আমার সমস্যা হচ্ছে। আমার সমস্যাটি নিম্নরূপ:

  • আমার একটি বহুভুজ এবং একটি রাস্টার আছে
  • বহুভুজের মধ্যে পড়ে এমন সমস্ত পিক্সেল আমি খুঁজে পেতে এবং পিক্সেলের মানটির যোগফল পেতে চাই
  • এবং (আপডেট হওয়া সমস্যা): আমি কোয়েরিটি সম্পাদন করার সময় কিছু পিক্সেলের জন্য মূল মানগুলি পাই যা মূল রাস্টারটিতে নেই that

আমি অসুবিধা বোঝার হচ্ছে কিনা আমি ব্যবহার করা উচিত ST_Intersects()বা ST_Intersection()। আমার পিক্সেলগুলি সংক্ষিপ্ত করার জন্য সর্বোত্তম পদ্ধতির কী তা আমি জানি না। এখানে আমি প্রথম পদ্ধতির চেষ্টা করেছি যা চেষ্টা করেছি (# 1):

SELECT 
    r.rast 
FROM
    raster as r, 
    polygon as p
WHERE
    ST_Intersects(r.rast, p.geom)

এটি rastমানগুলির একটি তালিকা ফেরত দেয় যা আমি কী করব তা নিশ্চিত নই। আমি ব্যবহার করে সারাংশের পরিসংখ্যান গণনা করার চেষ্টা করেছি ST_SummaryStats()তবে আমি নিশ্চিত নই যে এটি বহুভুজের মধ্যে থাকা সমস্ত পিক্সেলের ওয়েট-সমষ্টি কিনা।

SELECT  
        (result).count,
        (result).sum    
FROM (  
         SELECT 
            ST_SummaryStats(r.rast) As result
         FROM
            raster As r, 
            polygon As p
         WHERE
            ST_Intersects(r.rast, p.geom)    
    ) As tmp

অন্যান্য পদ্ধতির যা আমি চেষ্টা করেছি (# 2) ব্যবহার করে ST_Intersection():

 SELECT
        (gv).geom,         
        (gv).val
 FROM 
 (
    SELECT 
        ST_Intersection(r.rast, p.geom) AS gv
    FROM 
        raster as r, 
        polygon as p           
    WHERE 
        ST_Intersects(r.rast, p.geom)

      ) as foo;

এটি জ্যামিতির একটি তালিকা প্রত্যাবর্তন করে যা আমি আরও বিশ্লেষণ করি তবে আমি ধারণা করি এটি কম দক্ষ।

আমি অপ্রত্যাশিত যার উপর অপারেশনের দ্রুত আদেশও রয়েছে। আমি কি সবসময়ই বেছে নেব raster, polygonবা polygon, raster, বা বহুভুজটিকে কোনও রাস্টার হিসাবে রূপান্তর করব raster, raster?

সম্পাদনা: আমি # 2 R.K.এর লিঙ্ক থেকে কিছু বিশদ সহ পদ্ধতির আপডেট 2 ।

পদ্ধতির # 2 ব্যবহার করে, আমি ফলাফলগুলিতে নিম্নলিখিত ত্রুটিটি লক্ষ্য করেছি যা আমি আউটপুটটি বুঝতে না পারার কারণ এটি। এখানে আমার আসল রাস্টারটির চিত্র, এবং বহুভুজের একটি রূপরেখা যা এটি ছেদ করতে ব্যবহৃত হচ্ছে, উপরে ওভারলাইড করা হয়েছে:

এখানে চিত্র বর্ণনা লিখুন

এবং এখানে পোস্টজিআইএস ব্যবহার করে ছেদ করার ফলাফল:

এখানে চিত্র বর্ণনা লিখুন

ফলস্বরূপ সমস্যাটি হ'ল 21474836 এর মান ফিরে পাওয়া যাচ্ছে যা মূল রাস্টারে নেই। আমি জানি না কেন এটি হচ্ছে। আমি সন্দেহ করি এটি কোথাও কম সংখ্যার সাথে সম্পর্কিত (প্রায় 0 দ্বারা বিভাজন), তবে এটি ভুল ফলাফল দেয়।


দ্বিতীয় বিন্দু সম্পর্কে, আপনি বহুভুজকে ছেদ করে এমন পিক্সেলের মানগুলির সমষ্টি পেতে চান?
আর কে

হ্যাঁ, আমি ST_SummaryStats()# 1 এর জন্য ব্যবহার করেছি তবে কীভাবে এটি # 2 এর জন্য করবেন তা নিশ্চিত নই।
djq

একটি রেফারেন্সের একটি লিঙ্ক পোস্ট। আমি আশা করি এটি সাহায্য করবে.
আর কে

2
আপনার মানচিত্রে স্কেলের সর্বোচ্চ মানটি 32-বিট স্বাক্ষরিত পূর্ণসংখ্যার সর্বাধিক। আপনার ক্ষেত্রে এর অর্থ কী তা আমি জানি না তবে এটি এনএ মানগুলির সাথে করতে পারে। আপনার ক্যোয়ারির ব্যাপ্তিতে শূন্য মান থাকতে পারে যা সঠিকভাবে পরিচালনা করা হয় না। en.wikedia.org/wiki/2147483647#2147483647_in_computing
ইয়েলোক্যাপ

6
FWIW, 21474836 কোনও 32 বিট স্বাক্ষরিত ইন্টের সর্বাধিক মান নয় । যাইহোক, 2 ^ 31-1 = 2147483647 হয় সর্বোচ্চ, আর যে বিজ্ঞপ্তি 21474836 = 2147483647/100 (পূর্ণসংখ্যা বিভাগ)। এটি ইঙ্গিত দেয় যে অভ্যন্তরীণভাবে কিছু এনএ তৈরি হয় (সম্ভবত সীমান্ত কোষগুলির সাথে), তারা 2 ^ 31-1 হিসাবে উপস্থাপিত হয় এবং তারপরে কোডগুলি "ভুলে যায়" এগুলি এনএ এবং (সম্ভবত পুনর্নির্মাণ প্রক্রিয়াতে?) এটি তাদের 100 দ্বারা বিভক্ত করে।
whuber

উত্তর:


6

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

টিউটোরিয়ালে দুটি ডাটাसेट ব্যবহার করা হয়েছে, একটি পয়েন্ট শেপ ফাইল যা বহুভুজ উত্পাদন করতে বাফার হয়েছিল এবং ১৩ টি এসআরটিএম উচ্চতা রাস্টারগুলির একটি সিরিজ। এর মধ্যে অনেকগুলি পদক্ষেপ ছিল তবে রাস্টার এবং ভেক্টরকে ছেদ করার জন্য ব্যবহৃত ক্যোয়ারীটি এমন দেখাচ্ছে:

 CREATE TABLE caribou_srtm_inter AS
 SELECT id, 
        (gv).geom AS the_geom, 
        (gv).val
 FROM (SELECT id, 
              ST_Intersection(rast, the_geom) AS gv
       FROM srtm_tiled,
            cariboupoint_buffers_wgs
       WHERE ST_Intersects(rast, the_geom)
      ) foo;

মানগুলি তখন নিম্নলিখিতটি ব্যবহার করে সংক্ষিপ্ত করে দেওয়া হয়:

 CREATE TABLE result01 AS
 SELECT id, 
        sum(ST_Area(ST_Transform(the_geom, 32198)) * val) / 
        sum(ST_Area(ST_Transform(the_geom, 32198))) AS meanelev
 FROM caribou_srtm_inter
 GROUP BY id
 ORDER BY id;

এটি ব্যাখ্যা করার জন্য আমি পর্যাপ্ত পোস্টজিআইএস জানি না তবে আপনি কী অর্জন করার চেষ্টা করছেন তা নিশ্চিত মনে হয়। টিউটোরিয়ালটি মধ্যবর্তী পদক্ষেপগুলিতে আলোকপাত করা উচিত। শুভকামনা :)


ধন্যবাদ @ আরকে আমি সেই টিউটোরিয়ালটি দিয়ে পড়লাম। আমি মনে করি আমার গণনাটি আরও বেসিক, তবুও আমি এখনও এই প্রাথমিক পদক্ষেপটি খুঁজে পাচ্ছি!
djq

2

মূল প্রশ্নের দ্বিতীয় পয়েন্টটি সম্পর্কে - পোস্টগিস ২.০ বিকাশের বেশ কয়েকটি প্রকাশনা জিডিএল লাইব্রেরির এমন একটি সংস্করণ ব্যবহার করেছে যা কালিগুলিতে ভাসমান। যদি আপনার রাস্টারে এতে ভাসমান মান থাকে এবং আপনি জিডিএল এর একটি সংস্করণ ১.৯.০ এর চেয়ে কম ব্যবহার করছেন বা পোস্টজিআইএস ২.০ প্রিরিলেস এমন একটি সংস্করণ ব্যবহার করছেন যা GDALFPolygonize () কে সঠিকভাবে কল করেনি, তবে আপনি সম্ভবত এই বাগের মুখোমুখি হতে পারেন। পোস্টজিআইএস এবং জিডিএল বাগ ট্র্যাকারগুলিতে টিকিট জমা দেওয়া এবং বন্ধ করা হয়েছিল। এই বাগটি মূল প্রশ্নের প্রায় সময়ই সক্রিয় ছিল।

পারফরম্যান্সের ক্ষেত্রে, আপনি দেখতে পাবেন যে ব্যবহার ST_Intersects(raster, geom)করা ব্যবহারের চেয়ে অনেক দ্রুত ST_Intersects(geom, raster)। প্রথম সংস্করণ জ্যামিতিকে rasterizes এবং একটি রাস্টার-স্পেস ছেদ করে। দ্বিতীয় সংস্করণ জ্যামিতিকে ভেক্টরাইজ করে এবং একটি ভেক্টর-স্পেস ছেদ করে, যা আরও বেশি ব্যয়বহুল প্রক্রিয়া হতে পারে।


0

আমিও ব্যবহার অদ্ভুত বিষয় চাপ ছিল ST_SummaryStatsসঙ্গে ST_Clip। ডেটা আলাদাভাবে জিজ্ঞাসা করা আমাকে বলেছে যে আমার ST_SummaryStatsরাস্টারটির সর্বনিম্ন মান 32 এবং তারপরে সর্বোচ্চ 300, তবুও আমার টার্গেটের বহুভুজের পিক্সেল মানগুলির জন্য -32700 ফিরছিল।

আমি ইস্যুটির আশেপাশে হ্যাকিং শেষ করেছি:

WITH first AS (
   SELECT id, (ST_Intersection(geom, rast)).val
   FROM raster_table
   INNER JOIN vector_table ON ST_Intersects(rast, geom)
)
SELECT id, COUNT(val), SUM(val), AVG(val), stddev(val), MIN(val), MAX(val)
FROM first
GROUP BY id
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.