พื้นที่ของบัฟเฟอร์แบบวงกลมเป็นฟังก์ชันที่เพิ่มขึ้นแบบ monotonically ของรัศมีบัฟเฟอร์ (บนระบบพิกัดระนาบ) ดังนั้นกลยุทธ์การค้นหาง่ายสามารถหารัศมีR
ดังกล่าวว่าพื้นที่กันชนของรัศมีR
ตัดไปยังภูมิภาคเหลี่ยมA
คือ s
(ขึ้นอยู่กับความอดทนบางคน)
อัลกอริทึมการค้นหาที่ง่ายที่สุดจะเป็นการค้นหาแบบไบนารี่ เริ่มด้วยรัศมีสองอันหนึ่งอันเล็กมากและใหญ่หนึ่งอันเช่นบริเวณที่คุณต้องการนั้นอยู่ระหว่างพื้นที่ของบัฟเฟอร์ที่ถูกตัดของรัศมีเหล่านั้น จากนั้นก็นำจุดกึ่งกลางของพื้นที่เหล่านั้นและคำนวณพื้นที่บัฟเฟอร์แล้วหาว่ารัศมีที่คุณต้องการนั้นสูงกว่าหรือต่ำกว่าจุดกึ่งกลาง อัปเดตขีด จำกัด รัศมีของคุณและทำซ้ำจนกว่าคุณจะอยู่ในขอบเขตที่คุณต้องการ
การเขียนการค้นหาแบบไบนารีใน Python และการใช้ ArcGIS Python API นั้นเป็นวิธีที่ดีในการเรียนรู้! ฉันค่อนข้างแน่ใจว่าฉันได้ทำสิ่งนี้ใน R เมื่อหลายปีก่อน ...
นี่คือรหัส 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
ดังนั้นในกรณีนี้ความกว้างของบัฟเฟอร์ต่ำกว่า 64km เล็กน้อย
สิ่งเดียวที่ทำซอที่นี่คือค่าเริ่มต้นที่ต่ำกว่าและสูงกว่า - ฉันคิดว่าคุณสามารถใส่รัศมีที่ต่ำลงได้sqrt(A/pi)
และส่วนบนไม่สำคัญสำหรับอัลกอริทึมการค้นหาที่จะเพิ่มขึ้นจนกว่าจะจับช่วงเวลา
อัลกอริทึมการค้นหาอาจล้มเหลวหากรัศมีสูงสุดเริ่มต้นใหญ่เกินไปเนื่องจากคุณอาจบัฟเฟอร์ทั่วทั้งภูมิภาคด้วยรัศมีขนาดใหญ่ซึ่งในกรณีนี้การเปลี่ยนรัศมีจะไม่เปลี่ยนพื้นที่ ... แต่ข้อ จำกัด ที่สมเหตุสมผลควรหยุดสิ่งนี้