สร้างบัฟเฟอร์พื้นที่ที่ถูก จำกัด โดยแนวชายฝั่ง


10

ฉันกำลังพยายามใช้ ArcGIS 10.2 เพื่อสร้างบัฟเฟอร์ของจุดตามพื้นที่ที่กำหนดไว้ล่วงหน้า (เช่น 400 ตารางกิโลเมตร) ยิ่งไปกว่านั้นบัฟเฟอร์ของบางจุดอยู่ใกล้กับแนวชายฝั่งที่ต้องการให้บัฟเฟอร์ถูกตัดที่แนวชายฝั่งและยังคงมีพื้นที่เดียวกับที่อยู่ในบก (400 ตารางกิโลเมตร)

ไม่มีใครรู้ว่าสิ่งนี้สามารถทำได้ด้วยตัวสร้างแบบจำลองหรือ Arcpy?

ฉันมีทักษะ จำกัด กับ Arcpy และ R แต่ยินดีที่จะใช้สคริปต์บางอย่างเพื่อแก้ปัญหานี้

โปรดดูภาพด้านล่างแสดงภาพกราฟิกของสิ่งที่ฉันพยายามที่จะบรรลุ

[1]


2
คุณจะสามารถใส่รูปภาพของสิ่งที่คุณพยายามอธิบายด้วยคำพูดได้หรือไม่?
PolyGeo

คุณจะทำให้พื้นที่กว้างขึ้นเมื่อคุณตัดได้อย่างไร โดยการขยายรัศมีของบัฟเฟอร์?
Peter HorsbøllMøller

คำตอบ:


15

พื้นที่ของบัฟเฟอร์แบบวงกลมเป็นฟังก์ชันที่เพิ่มขึ้นแบบ 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)และส่วนบนไม่สำคัญสำหรับอัลกอริทึมการค้นหาที่จะเพิ่มขึ้นจนกว่าจะจับช่วงเวลา

อัลกอริทึมการค้นหาอาจล้มเหลวหากรัศมีสูงสุดเริ่มต้นใหญ่เกินไปเนื่องจากคุณอาจบัฟเฟอร์ทั่วทั้งภูมิภาคด้วยรัศมีขนาดใหญ่ซึ่งในกรณีนี้การเปลี่ยนรัศมีจะไม่เปลี่ยนพื้นที่ ... แต่ข้อ จำกัด ที่สมเหตุสมผลควรหยุดสิ่งนี้


คุณทำเช่นนี้ใน R อย่างไร ฉันลืมที่จะพูดถึงว่าฉันมีประสบการณ์ในการ R ดังนั้นฉันจะไม่รังเกียจวิธีการแก้ปัญหาโดยใช้ R เช่นกัน
Funkeh-Monkeh

rgeosแพคเกจและgBufferฟังก์ชั่นมากที่สุด ...
Spacedman

จริงๆแล้วฉันโกหกฉันได้นำบางอย่างมาใช้ใน Python เป็นปลั๊กอิน QGIS - มันบัฟเฟอร์หลายเหลี่ยมจนกระทั่งบัฟเฟอร์โพลีเท่ากับ 2x (หรือ Nx) พื้นที่ของรูปหลายเหลี่ยมดั้งเดิม อัลกอริทึมการค้นหาเดียวกัน
Spacedman

+1 ข้อดีของวิธีการที่แสดงในRรหัสคือ (a) แยกการคำนวณ GIS ออกจากตรรกะการค้นหาและ (b) ใช้ประโยชน์จากอัลกอริธึมการค้นหา (ในuniroot) ที่ได้รับการปรับให้เหมาะสมและทดสอบ - คุณไม่ต้องเขียน ตัวคุณเอง (และมันอาจจะไม่ได้ผลดีที่สุด)
whuber

ฉันสงสัยว่า scipy ใช้อัลกอริธึมการค้นหารูทที่คล้ายกันในโมดูลออปติไมซ์ : docs.scipy.org/doc/scipy/reference/optimize.html (ใช่แล้ว? uniroot cites Brent, scipy มีฟังก์ชัน Brent-ish)
Spacedman

1

มันเกือบจะเป็นไปไม่ได้เนื่องจากตำแหน่งของคะแนน คุณสามารถสร้างบัฟเฟอร์ของ 400km 2แต่จุดที่อยู่ใกล้กับชายฝั่งจะมีพื้นที่เล็กกว่าเสมอเมื่อเทียบกับที่อยู่ไกลออกไป (> 400km 2 )

สิ่งเดียวที่คุณทำได้คือทำการวิเคราะห์บัฟเฟอร์ที่จุดและตัดบัฟเฟอร์ที่สร้างด้วยคุณสมบัติชายฝั่งทะเลหลังจากนั้น


2
อาจเป็นไปไม่ได้แต่อาจเป็นปัญหา NP Completeที่อาจทำให้สับสนในการแก้ปัญหา การได้พื้นที่ที่สมบูรณ์แบบนั้นเป็นความท้าทาย (อาจใช้คะแนนซ้ำเพื่อเข้าใกล้)
วินซ์

3
มันเป็นไปไม่ได้และมันก็ไม่ยาก!
Spacedman
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.