বহুভুজের গড় প্রস্থ গণনা করছেন? [বন্ধ]


40

আমি রাস্তার পৃষ্ঠকে উপস্থাপন করে এমন বহুভুজের গড় প্রস্থ পরীক্ষা করতে আগ্রহী। আমার কাছে ভেক্টর হিসাবে রোড সেন্টারলাইনও রয়েছে (যা মাঝেমধ্যে ঠিক মাঝখানে হয় না)। এই উদাহরণে, রাস্তা-কেন্দ্ররেখাটি লালচে এবং বহুভুজ নীল:

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

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

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

আমি সবেমাত্র আর্কজিআইএস 10-তে ন্যূনতম বাউন্ডিং জ্যামিতি সরঞ্জামটি আবিষ্কার করেছি যা আমাকে নীচের সবুজ বহুভুজ উত্পাদন করতে সক্ষম করে:

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

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


আপনি কি সাইডবারে সম্ভাব্য সমাধানগুলি এড়িয়ে গেছেন? উদাহরণস্বরূপ gis.stackexchange.com / ক্র্যাশনস / ২৮৮০/২ সম্ভবত একটি সম্ভাব্য নকল পোস্টের একটি তুচ্ছ উত্তর হিসাবে পতাকাঙ্কিত হয়েছে

@ ড্যানপ্যাটারসন আমি এর মতো কোনও প্রশ্ন দেখিনি (অবশ্যই অনেকে সম্পর্কিত, অবশ্যই)। আপনি কি বলেছিলেন যে আমার প্রশ্নটি পতাকাঙ্কিত হয়েছিল? আমি আপনার দ্বিতীয় লাইন বুঝতে পারি না।
djq

এই সম্পর্কিত প্রশ্নটি, @ ড্যান, "প্রস্থ" এর একটি আলাদা ব্যাখ্যা নিয়ে উদ্বেগ প্রকাশ করে (ভাল, আসলে, ব্যাখ্যাটি পুরোপুরি পরিষ্কার নয়)। জবাব নেই প্রস্থ খোঁজার উপর ফোকাস করার প্রদর্শিত বিস্তৃত পর্যায়ে বরং গড়ে প্রস্থ থাকে।
whuber

@Whuber এখানে কেন্দ্রীভূত করতে চান হিসাবে আলোচনা, অন্য প্রশ্ন বন্ধ করে আমি আপনাকে পরামর্শ দিচ্ছি যে প্রশ্ন লোকদের সম্পাদিত হয় বুঝতে " একটি আয়তক্ষেত্রাকার ফালা গড় প্রস্থের estimative "
পিটার Krauss

@Peter: একটি আয়তক্ষেত্রাকার ফালা হয় কঠিনতর যুক্তিসহকারে একটি বহুভুজ, আরও সাধারণ শিরোনাম দাঁড়ানো কর্তব্য।
হোবার

উত্তর:


40

সমস্যার অংশটি হল "গড় প্রস্থ" এর উপযুক্ত সংজ্ঞা পাওয়া। বেশ কয়েকটি প্রাকৃতিক তবে কিছুটা হলেও আলাদা হবে dif সরলতার জন্য, গণনা করা সহজ যে বৈশিষ্ট্যগুলির উপর ভিত্তি করে সংজ্ঞাগুলি বিবেচনা করুন (উদাহরণস্বরূপ, এটি মিডিয়াল অক্ষের রূপান্তর বা বাফারের ক্রমগুলির উপর ভিত্তি করে এগুলি বাতিল করে দেয়)।

উদাহরণস্বরূপ, বিবেচনা একটি ছোট বাফার যে একটি নির্দিষ্ট "প্রস্থ" সঙ্গে একটি বহুভুজ এর আদি স্বজ্ঞা (ব্যাসার্ধ্যের বলে একটি দীর্ঘ, মোটামুটি সোজা পলিলাইন (দৈর্ঘ্য বলে প্রায় স্কোয়ারড প্রান্ত সঙ্গে) এল )। আমরা 2r = w এর প্রস্থ হিসাবে ভাবি । এভাবে:

  • এর পরিধি পি প্রায় 2L + 2w এর সমান;

  • এর অঞ্চল A প্রায় ডাব্লু এল এর সমান is

প্রস্থের ডাব্লু এবং দৈর্ঘ্যের এল এর পরে চতুর্ভুজ x ^ 2 - (পি / 2) এক্স + এ এর ​​শিকড় হিসাবে পুনরুদ্ধার করা যেতে পারে; বিশেষত, আমরা অনুমান করতে পারি

  • W = (পি - sqrt (পি ^ 2 - 16A)) / 4

যখন আপনি নিশ্চিত হন যে বহুভুজটি সত্যই দীর্ঘ এবং চর্মসার, আরও কাছাকাছি হিসাবে আপনি 2L + 2W 2L সমান নিতে পারেন যেখান থেকে

  • ডাব্লু (অসতর্কভাবে) = 2 এ / পি

এই আনুমানিক মধ্যে আপেক্ষিক ত্রুটি ডাব্লু / এল এর সমানুপাতিক: বহুভুজ চর্মসার, ডাব্লু / এল এর কাছাকাছি শূন্যের কাছাকাছি, এবং তত কাছাকাছি যত ভাল হয়।

এই পদ্ধতিটি কেবল খুব সহজ নয় (কেবলমাত্র অঞ্চলটি ঘেরের সাথে ভাগ করুন এবং 2 দিয়ে গুণ করুন) উভয় সূত্রের সাথে এটি গুরুত্বপূর্ণ নয় যে বহুভুজটি কীভাবে কেন্দ্রিক হয় বা এটি কোথায় অবস্থিত (কারণ এই জাতীয় ইউক্লিডিয়ান গতি অঞ্চলটি বা অঞ্চল পরিবর্তন করে না ঘের)।

রাস্তার বিভাগগুলিকে প্রতিনিধিত্ব করে এমন বহুভুজগুলির জন্য গড় প্রস্থের অনুমানের জন্য আপনি এই সূত্রগুলির কোনওটিই বিবেচনা করতে পারেন । ত্রুটি আপনি মূল অনুমান করা W (দ্বিঘাত সূত্র সঙ্গে) সম্পর্কে এলাকা কারণ আসে একটি এছাড়াও মূল পলিলাইন প্রতিটি মোড় এ ক্ষুদ্র wedges অন্তর্ভুক্ত করা হয়েছে। যদি মোড় কোণগুলির যোগফল টি রেডিয়ান হয় (এটি পললাইনটির সম্পূর্ণ নিখুঁত বক্রতা), তবে সত্যিই

  • পি = 2 এল + 2 ডাব্লু + 2 পাই টো এবং

  • এ = এল ডাব্লু + পাই টো ^ 2।

এগুলি পূর্ববর্তী (চতুষ্কোণ সূত্র) সমাধানগুলিতে প্লাগ করুন এবং সরল করুন। যখন ধোঁয়া পরিষ্কার হয়ে যায়, তখন বক্রতা শব্দ টি থেকে অবদানটি অদৃশ্য হয়ে যায়! মূলত যা প্রায় অনুমানের মতো দেখায় তা অ-স্ব-ছেদ করা পললাইন বাফারগুলির (পুরো স্কোয়ারযুক্ত প্রান্ত সহ) জন্য পুরোপুরি সঠিক। পরিবর্তনশীল-প্রস্থের বহুভুজগুলির জন্য, এটি গড় প্রস্থের যুক্তিসঙ্গত সংজ্ঞা


ধন্যবাদ @ শুভর এটি একটি দুর্দান্ত উত্তর এবং এটি আমাকে আরও স্পষ্টভাবে এটি ভাবতে সহায়তা করেছে।
ডিজেকিউ

@ শুভঃ আমি একটি কাগজ লিখছি এবং আপনার এখানে বর্ণিত পদ্ধতিটির জন্য আমার একটি যথাযথ ('একাডেমিক') রেফারেন্স দেওয়া দরকার। আপনার কি এ জাতীয় রেফারেন্স আছে? এই পরিমাপের একটি নাম আছে? যদি তা না হয় তবে আমি এটির পরে আপনার নাম রাখতে পারি! "হুবারের প্রস্থের পরিমাপ" সম্পর্কে কী?
জুলিয়েন

@ জুলিয়েন আমার কোনও রেফারেন্স নেই। এই ফর্ম্যাটটিতে কাজ করতে পারে: MISC {20279, TITLE = poly বহুভুজের গড় প্রস্থ গণনা করা?}, AUTHOR = {হুইবার ( gis.stackexchange.com/users/664/ whuber )}, HOWPUBLISHED = {GIS}, দ্রষ্টব্য = {URL: gis.stackexchange.com/q/20279/664 (সংস্করণ: 2013-08-13)}, ইপিআরআইএনটি = { gis.stackexchange.com/q/20279 }, ইউআরএল = is gis.stackexchange.com/q/20279 }
whuber

18

এখানে আমি @ ভুবার সমাধান সম্পর্কে সামান্য অপ্টিমাইজেশন দেখাই, এবং আমি "বাফার প্রস্থ" এর নিরিখে রেখেছি, কারণ এটি আরও সাধারণ সমস্যার সমাধানকে সংহত করার জন্য দরকারী: এখানে কি কোনও স্টাফুফার ইনভার্স ফাংশন রয়েছে, যা প্রস্থের প্রাক্কলনটি দেয়?

CREATE FUNCTION buffer_width(
        -- rectangular strip mean width estimator
    p_len float,   -- len of the central line of g
    p_geom geometry, -- g
    p_btype varchar DEFAULT 'endcap=flat' -- st_buffer() parameter
) RETURNS float AS $f$
  DECLARE
    w_half float;
    w float;    
  BEGIN
         w_half := 0.25*ST_Area(p_geom)/p_len;
         w      := 0.50*ST_Area( ST_Buffer(p_geom,-w_half,p_btype) )/(p_len-2.0*w_half);
     RETURN w_half+w;
  END
$f$ LANGUAGE plpgsql IMMUTABLE;

এই সমস্যার জন্য প্রায় @celenius প্রশ্ন রাস্তায় প্রস্থ , sw, সমাধান

 sw = buffer_width(ST_Length(g1), g2)

sw"গড় প্রস্থ" কোথায় , g1এর কেন্দ্রীয় লাইন g2এবং রাস্তাটি g2একটি পলিজোন । আমি শুধু OGC মান গ্রন্থাগার, সাথে পরীক্ষিত ব্যবহৃত PostGIS , এবং একই buffer_width ফাংশন অন্যান্য গুরুতর প্রয়োগ পদ্ধতি সমাধান।

প্রদর্শন

A2এর এলাকা g2, L1(কেন্দ্রীয় লাইনের দৈর্ঘ্য g1) এর g2

যেন আমরা তৈরি করতে পারেন g2দ্বারা g2=ST_Buffer(g1,w), এবং যে g1সোজা, তাই g2দৈর্ঘ্য সঙ্গে একটি আয়তক্ষেত্র হয় L1এবং প্রস্থ 2*w, এবং

    A2 = L1*(2*w)   -->  w = 0.5*A2/L1

এটি @ ভুবারের একই সূত্র নয়, কারণ এখানে wআয়তক্ষেত্রের ( g2) প্রস্থের অর্ধেক অংশ রয়েছে । এটি একটি ভাল অনুমানকারী, তবে আমরা পরীক্ষাগুলি দ্বারা (নীচে) দেখতে পাচ্ছি, সঠিক নয়, এবং ফাংশনটি g2অঞ্চলটি হ্রাস করতে এবং একটি চূড়ান্ত অনুমানকারী হিসাবে এটি একটি ক্লু হিসাবে ব্যবহার করে ।

এখানে আমরা "এন্ডক্যাপ = স্কোয়ার" বা "এন্ডক্যাপ = রাউন্ড" সহ বাফারগুলি মূল্যায়ন করি না, যার A2 সাথে একই পয়েন্ট বাফারের একটি ক্ষেত্রের যোগফল প্রয়োজন w

রেফারেন্সস: ২০০৫ এর অনুরূপ ফোরামে ডব্লু। হুবার এ জাতীয় এবং অন্যান্য সমাধান ব্যাখ্যা করেছেন।

পরীক্ষা এবং কারণগুলি

সরলরেখার জন্য ফলাফল হিসাবে প্রত্যাশিত, সঠিক হয়। তবে অন্যান্য জ্যামিতির জন্য ফলাফল হতাশাজনক হতে পারে। মূল কারণটি হ'ল, সম্ভবত সমস্ত মডেল হুবহু আয়তক্ষেত্রগুলির জন্য, বা জ্যামিতির জন্য যা "স্ট্রিপ আয়তক্ষেত্র" এর সাথে সান্নিধ্যযুক্ত হতে পারে। এই সীমাবদ্ধতার সীমা পরীক্ষা করার জন্য এখানে একটি "পরীক্ষার কিট" ( wfactorউপরের ফলাফলগুলিতে দেখুন )।

 SELECT *, round(100.0*(w_estim-w)/w,1) as estim_perc_error
    FROM (
        SELECT btype, round(len,1) AS len, w, round(w/len,3) AS wfactor,
               round(  buffer_width(len, gbase, btype)  ,2) as w_estim ,
               round(  0.5*ST_Area(gbase)/len       ,2) as w_near
        FROM (
         SELECT
            *, st_length(g) AS len, ST_Buffer(g, w, btype) AS gbase
         FROM (
               -- SELECT ST_GeomFromText('LINESTRING(50 50,150 150)') AS g, -- straight
               SELECT ST_GeomFromText('LINESTRING(50 50,150 150,150 50,250 250)') AS g,
            unnest(array[1.0,10.0,20.0,50.0]) AS w
              ) AS t, 
             (SELECT unnest(array['endcap=flat','endcap=flat join=bevel']) AS btype
             ) AS t2
        ) as t3
    ) as t4;

ফলাফল:

আয়তক্ষেত্রের সাথে (কেন্দ্রীয় লাইনটি একটি স্ট্রাইট লাইন):

         btype          |  len  |  w   | wfactor | w_estim | w_near | estim_perc_error 
------------------------+-------+------+---------+---------+--------+------------------
 endcap=flat            | 141.4 |  1.0 |   0.007 |       1 |      1 |                0
 endcap=flat join=bevel | 141.4 |  1.0 |   0.007 |       1 |      1 |                0
 endcap=flat            | 141.4 | 10.0 |   0.071 |      10 |     10 |                0
 endcap=flat join=bevel | 141.4 | 10.0 |   0.071 |      10 |     10 |                0
 endcap=flat            | 141.4 | 20.0 |   0.141 |      20 |     20 |                0
 endcap=flat join=bevel | 141.4 | 20.0 |   0.141 |      20 |     20 |                0
 endcap=flat            | 141.4 | 50.0 |   0.354 |      50 |     50 |                0
 endcap=flat join=bevel | 141.4 | 50.0 |   0.354 |      50 |     50 |                0

অন্যান্য জিওমেট্রিগুলির সাথে (কেন্দ্ররেটে ভাঁজ করা):

         btype          | len |  w   | wfactor | w_estim | w_near | estim_perc_error 
 -----------------------+-----+------+---------+---------+--------+------------------
 endcap=flat            | 465 |  1.0 |   0.002 |       1 |      1 |                0
 endcap=flat join=bevel | 465 |  1.0 |   0.002 |       1 |   0.99 |                0
 endcap=flat            | 465 | 10.0 |   0.022 |    9.98 |   9.55 |             -0.2
 endcap=flat join=bevel | 465 | 10.0 |   0.022 |    9.88 |   9.35 |             -1.2
 endcap=flat            | 465 | 20.0 |   0.043 |   19.83 |  18.22 |             -0.9
 endcap=flat join=bevel | 465 | 20.0 |   0.043 |   19.33 |  17.39 |             -3.4
 endcap=flat            | 465 | 50.0 |   0.108 |   46.29 |  40.47 |             -7.4
 endcap=flat join=bevel | 465 | 50.0 |   0.108 |   41.76 |  36.65 |            -16.5

 wfactor= w/len
 w_near = 0.5*area/len
 w_estim is the proposed estimator, the buffer_width function.

আমাদের সম্পর্কে btypeদেখতে ST_Buffer নির্দেশিকা , ভাল ilustratins এবং এখানে ব্যবহৃত LINESTRINGs সঙ্গে।

উপসংহার :

  • এর অনুমানকারী w_estimসবসময় তুলনায় ভাল w_near;
  • "আয়তক্ষেত্রাকার কাছাকাছি" g2জ্যামিতিগুলির জন্য, ঠিক আছে, যে কোনওwfactor
  • অন্য জ্যামিতির জন্য ("আয়তক্ষেত্রাকার স্ট্রিপগুলির কাছাকাছি"), wfactor=~0.01ত্রুটির 1% সীমা ব্যবহার করুন w_estim। এই ডাব্লুফ্যাক্টর পর্যন্ত, অন্য একটি অনুমানকারী ব্যবহার করুন।

সতর্কতা এবং প্রতিরোধ

অনুমানের ত্রুটি কেন ঘটে? আপনি যখন ST_Buffer(g,w)"আয়তক্ষেত্রাকার স্ট্রিপ মডেল" ব্যবহার করেন , আপনি প্রত্যাশা করেন যে প্রস্থের বাফারের সাহায্যে নতুন অঞ্চলটি wপ্রায় w*ST_Length(g)বা w*ST_Perimeter(g)... যখন হয় না তখন সাধারণত ওভারলেগুলি (ভাঁজযুক্ত রেখাগুলি দেখুন) বা "স্টাইলিং" দ্বারা হয় গড় wত্রুটির অনুমান । এটি পরীক্ষার মূল বার্তা।

কোনও বাফার বাদশায় এই সমস্যাটি সনাক্ত করতে বাফার প্রজন্মের আচরণটি পরীক্ষা করুন:

SELECT btype, w, round(100.0*(a1-len1*2.0*w)/a1)::varchar||'%' AS straight_error,  
                 round(100.0*(a2-len2*2.0*w)/a2)::varchar||'%' AS curve2_error,
                 round(100.0*(a3-len3*2.0*w)/a3)::varchar||'%' AS curve3_error
FROM (
 SELECT
    *, st_length(g1) AS len1, ST_Area(ST_Buffer(g1, w, btype)) AS a1,
    st_length(g2) AS len2, ST_Area(ST_Buffer(g2, w, btype)) AS a2,
    st_length(g3) AS len3, ST_Area(ST_Buffer(g3, w, btype)) AS a3
 FROM (
       SELECT ST_GeomFromText('LINESTRING(50 50,150 150)') AS g1, -- straight
              ST_GeomFromText('LINESTRING(50 50,150 150,150 50)') AS g2,
              ST_GeomFromText('LINESTRING(50 50,150 150,150 50,250 250)') AS g3,
              unnest(array[1.0,20.0,50.0]) AS w
      ) AS t, 
     (SELECT unnest(array['endcap=flat','endcap=flat join=bevel']) AS btype
     ) AS t2
) as t3;

ফলাফল:

         btype          |  w   | straight_error | curve2_error | curve3_error 
------------------------+------+----------------+--------------+--------------
 endcap=flat            |  1.0 | 0%             | -0%          | -0%
 endcap=flat join=bevel |  1.0 | 0%             | -0%          | -1%
 endcap=flat            | 20.0 | 0%             | -5%          | -10%
 endcap=flat join=bevel | 20.0 | 0%             | -9%          | -15%
 endcap=flat            | 50.0 | 0%             | -14%         | -24%
 endcap=flat join=bevel | 50.0 | 0%             | -26%         | -36%

        সতর্ক


13

যদি আপনি আপনার বহুভুজ ডেটা আপনার কেন্দ্ররেখার ডেটাতে যোগ করতে পারেন (স্থানিক বা টেবুলার অর্থ দ্বারা), তবে কেবলমাত্র প্রতিটি কেন্দ্ররেখার প্রান্তিককরণের জন্য বহুভুজ অঞ্চলগুলি যোগ করুন এবং কেন্দ্ররেখার দৈর্ঘ্য অনুসারে ভাগ করুন।


সেটা সত্য! এই ক্ষেত্রে, আমার কেন্দ্ররেখাগুলি একই দৈর্ঘ্য নয়, তবে আমি সর্বদা তাদের হিসাবে এক হিসাবে যোগদান করতে পারতাম এবং বহুভুজ প্রতি তাদের বিভক্ত করতে পারি।
ডিজেকিউ

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

ধন্যবাদ স্ক্রো, এটি বর্তমানে পোস্টজিআইএস-এ নেই, তবে এটি লোড করা খুব দ্রুত I পরিচালনা করতে সক্ষম হওয়া উচিত)। প্রধানত আমার মাথায় প্রথমে পরিষ্কার হওয়ার চেষ্টা করছে।
ডিজেকিউ

+1 এটি উপলভ্য পরিস্থিতিতে এটির জন্য একটি দুর্দান্ত সহজ সমাধান।
whuber

9

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

আমার সমাধানটি ছিল:

(perimeter / pi) * area / (perimeter**2 / (4*pi))
= 4 * area / perimeter

এটাই:

(Diameter of a circle with the same perimeter as the polygon) * Area / (Area of a circle with the same perimeter as the polygon)

ফাংশনটি হ'ল:

def add_average_width(featureClass, averageWidthField='Width'):
    '''
    (str, [str]) -> str

    Calculate the average width of each feature in the feature class. The width
        is reported in units of the feature class' projected coordinate systems'
        linear unit.

    Returns the name of the field that is populated with the feature widths.
    '''
    import arcpy
    from math import pi

    # Add the width field, if necessary
    fns = [i.name.lower() for i in arcpy.ListFields(featureClass)]
    if averageWidthField.lower() not in fns:
        arcpy.AddField_management(featureClass, averageWidthField, 'DOUBLE')

    fnsCur = ['SHAPE@LENGTH', 'SHAPE@AREA', averageWidthField]
    with arcpy.da.UpdateCursor(featureClass, fnsCur) as cur:
        for row in cur:
            perim, area, width = row
            row[-1] = ((perim/pi) * area) / (perim**2 / (4 * pi))
            cur.updateRow(row)

    return averageWidthField

উপরে থেকে ফাংশনটি ব্যবহার করে বিভিন্ন আকারের গড় প্রস্থ (এবং রেফারেন্সের জন্য কিছু অন্যান্য জ্যামিতির গুণাবলী) সহ রফতানি করা মানচিত্র এখানে রয়েছে:

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


4
আপনি যদি ভাবটি সরল করেন তবে তা ঠিক হবে area / perimeter * 4
কুলেব্রেন

ধন্যবাদ, @ কুলেব্রন। আমি সূত্রের সরলতার চেয়ে ধারণাটির স্বচ্ছতার জন্য যাচ্ছিলাম, এবং সমীকরণকে সরল করার বিষয়ে আমি কখনও ভাবিনি। এটি আমার কিছু প্রক্রিয়াজাতকরণ সময় সাশ্রয় করবে।
টম

0

আনুমানিক মধ্যস্থ অক্ষ সহ আরও একটি সমাধান:

  1. বহুভুজের আনুমানিক মিডিয়াল অক্ষ গণনা করুন;
  2. আনুমানিক মধ্যম অক্ষের দৈর্ঘ্য পান;
  3. অক্ষের উভয় প্রান্ত থেকে বহুভুজের সীমানা পর্যন্ত দূরত্ব পান;
  4. অক্ষের দৈর্ঘ্য এবং ধাপ 3 থেকে দূরত্ব - এটি প্রায় বহুভুজ দৈর্ঘ্য;
  5. এখন আপনি বহু দৈর্ঘ্যের ক্ষেত্রটি এই দৈর্ঘ্যের দ্বারা ভাগ করতে পারেন এবং বহুভুজের গড় প্রস্থ পান।

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

উদাহরণ

এখানে পোস্টগ্রি ফাংশন (: আপনি ইনস্টল করতে হবে নোট উদাহরণ postgis এবং postgis_sfcgal এক্সটেনশন):

CREATE FUNCTION ApproximatePolygonLength(geom geometry)
RETURNS float AS $$
    SELECT
        CASE
            /* in case when approximate medial axis is empty or simple line
             * return axis length
             */
            WHEN (ST_GeometryType(axis.axis) = 'ST_LineString' OR ST_IsEmpty(axis.axis))
                THEN axis_length.axis_length
                    + start_point_distance.start_point_distance
                    + end_point_distance.end_point_distance
            /* else geometry is too complex to define length */
            ELSE NULL
        END AS length
    FROM
        LATERAL (
            SELECT
                ST_MakeValid(geom) AS valid_geom
        ) AS valid_geom,
        LATERAL (
            SELECT
                /* `ST_LineMerge` returns:
                 *  - `GEOMETRYCOLLECTION EMPTY`, if `ST_ApproximateMedialAxis` is an empty line (i.e. for square);
                 *  - `LINESTRING ...`, if `ST_ApproximateMedialAxis` is a simple line;
                 *  - `MULTILINESTRING ...`, if `ST_ApproximateMedialAxis` is a complex line
                 *     that can not be merged to simple line. In this case we should return `NULL`.
                 */
                ST_LineMerge(
                    ST_ApproximateMedialAxis(
                        valid_geom.valid_geom
                    )
                ) AS axis
        ) AS axis,
        LATERAL (
            SELECT
                ST_Boundary(valid_geom.valid_geom) AS border
        ) AS border,
        LATERAL (
            SELECT
                ST_Length(axis.axis) AS axis_length
        ) AS axis_length,
        LATERAL (
            SELECT
                ST_IsClosed(axis.axis) AS axis_is_closed
        ) AS axis_is_closed,
        LATERAL (
            SELECT
                CASE WHEN axis_is_closed.axis_is_closed THEN 0
                ELSE
                    ST_Distance(
                        border.border,
                        CASE ST_GeometryType(axis.axis)
                            WHEN 'ST_LineString' THEN ST_StartPoint(axis.axis)
                            /* if approximate medial axis is empty (i.e. for square),
                             * get centroid of geometry
                             */
                            ELSE ST_Centroid(valid_geom.valid_geom)
                        END
                    )
                END AS start_point_distance
        ) AS start_point_distance,
        LATERAL (
            SELECT
                CASE WHEN axis_is_closed.axis_is_closed THEN 0
                ELSE
                    ST_Distance(
                        border.border,
                        CASE ST_GeometryType(axis.axis)
                            WHEN 'ST_LineString' THEN ST_EndPoint(axis.axis)
                            /* if approximate medial axis is empty (i.e. for square),
                             * get centroid of geometry
                             */
                            ELSE ST_Centroid(valid_geom.valid_geom)
                        END
                    )
                END AS end_point_distance
        ) AS end_point_distance;
$$ LANGUAGE SQL;

CREATE FUNCTION ApproximatePolygonWidth(geom geometry)
RETURNS float AS $$
    SELECT
        CASE
            WHEN length IS NULL THEN NULL
            ELSE area.area / length.length
        END AS width
    FROM
        (
            SELECT ApproximatePolygonLength(geom) AS length
        ) AS length,
        (
            SELECT
                ST_Area(
                    ST_MakeValid(geom)
                ) AS area
        ) AS area;
$$ LANGUAGE SQL;

অসুবিধা:

বহুভুজ প্রায় আয়তক্ষেত্রাকার হয়ে থাকে এবং মানুষ তার দৈর্ঘ্য স্বজ্ঞাতভাবে নির্ধারণ করতে পারে তবে আনুমানিক মধ্যম অক্ষের প্রান্তের কাছে খুব কম শাখা থাকে এবং সুতরাং অ্যালগোরিদম কিছুই দেয় না।

উদাহরণ:

ভাঙা উদাহরণ

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.