পোস্টজিআইএস বহুভুজ প্রান্ত বিশ্লেষণ (ওরিয়েন্টেশন, প্রান্ত দৈর্ঘ্য)


9

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

আমি বেশ কয়েকটি বিল্ডিংয়ের উপর বিশ্লেষণ করতে চাই। আমার আগ্রহী একটি বিষয় হ'ল তাদের অভিমুখী পৃষ্ঠসমূহের সাথে সম্পর্কিত ওরিয়েন্টেশন। নীচের ছবিতে চিত্রিত হিসাবে, আমি বহুভুজগুলির একটি সিরিজে সমস্ত প্রান্তের দৈর্ঘ্য এবং (সাধারণ) দৃষ্টিভঙ্গি পেতে চাই। উদাহরণে আমি কেবল একটি পৃষ্ঠকে হাইলাইট করেছি।

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

ফলাফলের টেবিলটি দেখতে এমন হতে পারে :

building_id | edge_id | orientation | edge_length
-------------------------------------------------
      1     |    1    |     315     |    10.0
      1     |    2    |      45     |     7.0
      1     |   ...   |     ...     |     ...

তবে, আমি নিশ্চিত নই যে এটি আরও প্রক্রিয়াজাতকরণের জন্য ফলাফল সংরক্ষণের একটি স্মার্ট উপায় (যেমন প্রান্ত থেকে পরবর্তী বিল্ডিংয়ের জন্য দূরত্ব গণনা ইত্যাদি) etc. সুতরাং আমার প্রশ্ন দ্বিগুণ:

  1. কোনও দক্ষ পোস্টজিআইএস ফাংশন রয়েছে যা বহুভুজগুলির কিনারা বিশ্লেষণ করতে পারে? কোনও নেটিভ পোস্টজিআইএস ফাংশন না থাকলে আমি বিকল্পভাবে পাইথন-ভিত্তিক পদ্ধতির বিষয়ে আগ্রহী।
  2. বহুগুণে বিভিন্ন সংখ্যক প্রান্ত থাকতে পারে বলে কোনও পোস্টজিআইএস টেবিলে ফলাফল সংরক্ষণের স্মার্ট উপায় কী হবে?

2
প্রথম বহুভুজ অংশ তৈরি করুন: stackoverflow.com/questions/7595635/... তারপর সূচনাকাল এবং শেষবিন্দু স্থানাঙ্ক X1, Y1 এবং x2, Y2 মত চেয়ে ST_Azimuth COLUMNS (ST_Startpoint (জ্যামিতি), ST_Endpoint (জ্যামিতি)) যেতে হবে । ( postgis.org/docs/ST_Azimuth.html )
তামাস কোসা

1
@ তমসকোসা: আপনার কাছে একটি উত্তরের উত্তম সার রয়েছে। কেন এটি একটিকে প্রসারিত করবেন না? এছাড়াও, নরমালগুলির জন্য, আজিমুথগুলির প্রয়োজন +/- পাই / 2।
মার্টিন এফ

1
@ তামাসকোসা এটি এমন একটি পদ্ধতির যা আমিও ভাবছিলাম। ST_ExteriorRing ব্যবহার করুন এবং তারপরে আপনি যা বলছেন তেমন আজিমুথগুলি পান। আমি কীভাবে আদর্শভাবে ফলাফলগুলি সংরক্ষণ করব, যেহেতু বিল্ডিংগুলিতে বিভিন্ন ধরণের প্রান্ত থাকতে পারে? আমি উপরে বর্ণিত মত একটি ছকে? আমি মার্টিনএফের সাথে একমত, এটি প্রায় একটি উত্তর;)
n1000

শুধু কৌতূহলী, আপনি কেন স্বাভাবিক চান ... সূর্যের এক্সপোজার?
মার্টিন এফ

1
আপনার প্রশ্নের প্রথম অংশটির উত্তর দেওয়া হয়েছে - আপনি ST_DumppPoint এবং ST_Azimuth ব্যবহার করতে পারেন। দ্বিতীয় অংশের জন্য, আউটপুটে কোনও স্থানিক উপাদান না থাকায়, আমি মনে করি বহুভুজ এবং এজ_আইডির একটি লিঙ্ক আপনি খুঁজে পাবেন।
জন পাওয়েল

উত্তর:


10

গতকাল আমার কাছে এটিকে বিশদে তৈরি করার সময় ছিল না ... 4 টি পদক্ষেপে আমার সমাধান দেখুন:

CREATE OR REPLACE VIEW bd_segment AS
SELECT
      ST_PointN(geom, generate_series(1, ST_NPoints(geom)-1)) AS sp,
      ST_PointN(geom, generate_series(2, ST_NPoints(geom)  )) AS ep
    FROM
       -- extract the individual linestrings
       (SELECT (ST_Dump(ST_Boundary(the_geom))).geom
       FROM bd) AS linestrings;

CREATE OR REPLACE VIEW bd_segment_geom AS
SELECT sp, ep, st_makeline(sp, ep) 
FROM bd_segment;

CREATE OR REPLACE view bd_segment_id AS 
SELECT bd.gid, row_number() 
    OVER (order by bd.gid), degrees(st_azimuth(ff.sp, ff.ep)-1.57079633) AS az_deg,
    ST_LENGTH(ff.st_makeline) , ff.st_makeline FROM bd_segment_geom ff
JOIN bd ON st_touches(ff.st_makeline, bd.the_geom)
GROUP BY bd.gid, ff.sp, ff.ep, ff.st_makeline;

UPDATE bd_segment_id
SET az_deg = az_deg + 360
WHERE az_deg < 0;

শেষ জিজ্ঞাসাটি আপনাকে st_touches ব্যবহার করে একটি স্থানিক জোড় দিয়ে বিল্ডিং আইডস দেয়। আশা করি এটা সাহায্য করবে. আপডেট - কিউজিসে সমাধানটি এর মতো দেখায়: এখানে চিত্র বর্ণনা লিখুন


1
চিত্তাকর্ষক! আমি এটা কাজ পেয়েছিলাম। তোমাকে অনেক ধন্যবাদ! বিপুল সংখ্যক বিল্ডিংয়ের সাথে এটি কিছুটা ধীর হয়ে যায়। আজিমুথগুলি এখনই স্বাভাবিক নয়। আপনি কীভাবে এটিকে সম্বোধন করবেন সে সম্পর্কে আপনার ধারণা আছে? বহুভুজের "বাহ্যিক" দিকটি কীভাবে সন্ধান করব তা নিশ্চিত নই।
n1000

1
রেডিয়ানে আজিমুথটিতে 90 ডিগ্রি যুক্ত করুন: ডিগ্রি (st_azimuth (ff.sp, ff.ep) +1.57079633)। এটি কখনও কখনও ৩ 360০ এর চেয়ে বড় মানের উত্পন্ন করে but তবে একটি আপডেট ক্যোয়ারির সাহায্যে আপনি সেগুলি প্রতিস্থাপন করতে পারেন। আপনি যদি স্ট্যাটিক ভিউ হিসাবে ব্যবহার করতে চান তবে "ক্রিয়েটিভ মেটেরিয়াল ভিউ" তৈরি করুন এবং এটি প্রথমবারেই ধীর হবে না।
তামাস কোসা

2
বেশ না। উত্তর 0 ° হিসাবে ধরে নেওয়া , এটি বহুভুজ / বিল্ডিংয়ের অভ্যন্তরের দিকে (যেমন আপনার স্ক্রিনশটটিতেও দেখা যায়) দিকে স্বাভাবিক দেয় । তবে আপনি ঠিক বলেছেন - একটি সরল UPDATEকৌশলটি করা উচিত। এই দুর্দান্ত সমাধানের জন্য আবার ধন্যবাদ। গ্রহণ করার আগে অন্যান্য উত্তরগুলি উপস্থিত হলে আমি আরও কিছু দিন অপেক্ষা করব।
n1000

1
কি হবে ST_ForceRHR? এই উত্তরটি আসলে ঠিক আছে বলে মনে হচ্ছে।
জাকুব কানিয়া

@ জাকুবকানিয়া আমি একটি ST_ForceRHRসমাধান নিয়ে আসার চেষ্টা করেছি , তবে সফল হইনি। ইঙ্গিতগুলির জন্য ধন্যবাদ জানাতে হবে ... আমি চেষ্টা করেছিST_Dump(ST_Boundary(ST_ForceRHR(the_geom)))
n1000
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.