वृत्ताकार बफर का क्षेत्र बफर त्रिज्या का एक मोनोटोनिक रूप से बढ़ता हुआ कार्य है (वैसे भी एक प्लेनर समन्वय प्रणाली पर)। तो एक साधारण खोज रणनीति एक त्रिज्या पा सकती R
है, जैसे कि R
बहुभुज क्षेत्र से जुड़े त्रिज्या के बफर का क्षेत्र A
(कुछ सहनशीलता तक) है s
।
सबसे सरल खोज एल्गोरिदम बस एक द्विआधारी खोज होगी। दो राडियों से शुरू करें, एक बहुत छोटा और एक बहुत बड़ा, जैसे कि आप जो क्षेत्र चाहते हैं, वह उन राडियों के क्लैप्टेड बफ़र्स के क्षेत्र के बीच है। फिर बस उन लोगों के मध्य बिंदु को लें और बफर क्षेत्रों की गणना करें, और यह पता लगाएं कि क्या त्रिज्या आपको मध्य बिंदु के ऊपर या नीचे है। अपनी त्रिज्या सीमा को अपडेट करें और तब तक दोहराएं जब तक आप अपने इच्छित क्षेत्र की कुछ सहिष्णुता के भीतर नहीं पहुंच जाते।
पायथन में एक द्विआधारी खोज लिखना और आर्कगिस पायथन एपीआई का उपयोग करना सीखने का एक अच्छा तरीका लगता है! मुझे पूरा यकीन है कि मैंने R में ऐसा किया है, सालों पहले ...
यहाँ कुछ आर कोड है:
cropareabuff <- function(pt, region, target){
f = function(r){
b = rgeos::gBuffer(pt, width=r)
return(gArea(gIntersection(b, region)) - target)
}
f
}
buff_with_area <- function(pt, region, target, lower, upper){
f = cropareabuff(pt, region, target)
r = uniroot(f, lower=lower, upper=upper, extendInt="upX")
list(r=r, b=gIntersection(rgeos::gBuffer(pt, width=r$root), region))
}
उपयोग:
पहले एक साधारण यूके बहुभुज क्षेत्र स्थापित करें:
library(raster); library(rgeos); library(rgdal)
uk = getData("GADM", country="GBR", level=0)
uk = spTransform(uk,CRS("+init=epsg:27700"))
uk = gSimplify(uk, tol=1000)
अब एक बिंदु को परिभाषित करें:
p = SpatialPoints(coords=list(x=269042, y=235937), proj4string=CRS("+init=epsg:27700"))
तो आप बस:
b = buff_with_area(p, uk, 10000000000, 1, 10000)
यह दो घटकों के साथ एक सूची b
है, बफर है:
plot(b$b, col=2)
plot(uk, add=TRUE)
और इसका सही क्षेत्र है:
gArea(b$b)
[1] 1e+10
और r
से आउटपुट है uniroot
, जिसमें बफर त्रिज्या मान शामिल है।
> b$r$root
[1] 63338.88
तो इस मामले में बफर की चौड़ाई 64 किमी से कम थी।
यहाँ केवल एक ही चीज़ है, जो निम्न और ऊपरी प्रारंभिक मानों के साथ है - मुझे लगता है कि आप निम्न त्रिज्या को sqrt(A/pi)
बढ़ा सकते हैं और ऊपरी महत्वपूर्ण नहीं है क्योंकि खोज एल्गोरिथ्म इसे तब तक बढ़ाएगा जब तक कि यह अंतराल को पकड़ नहीं लेता।
खोज एल्गोरिथ्म विफल हो सकता है यदि प्रारंभिक अधिकतम त्रिज्या वास्तव में बहुत बड़ा है, क्योंकि आप अपने पूरे क्षेत्र को एक विशाल त्रिज्या के साथ बफर कर सकते हैं, जिस स्थिति में त्रिज्या अभ्यस्त बदलने से क्षेत्र में परिवर्तन नहीं होता है ... लेकिन समझदार सीमाएं ऐसा होने से रोकना चाहिए।