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