क्षेत्र बफ़र बनाएँ जो एक समुद्र तट द्वारा सीमित हैं


10

मैं एक पूर्व-परिभाषित क्षेत्र (जैसे 400 वर्ग किमी) के आधार पर अंकों का एक बफर बनाने के लिए ArcGIS 10.2 का उपयोग करने की कोशिश कर रहा हूं। इसके अलावा, कुछ बिंदुओं के बफ़र कोस्टलाइन के करीब हैं, जिसके लिए बफ़र्स को समुद्र तट पर क्लिप करने की आवश्यकता होती है और अभी भी वही क्षेत्र है जो अंतर्देशीय (400 वर्ग किमी) हैं।

क्या किसी को पता है कि यह मॉडल बिल्डर या आर्कपी के साथ कैसे किया जा सकता है?

मेरे पास आर्कि और आर के साथ सीमित कौशल हैं, लेकिन इसके लिए एक समाधान प्राप्त करने के लिए कुछ स्क्रिप्टिंग पर काम करने में खुशी होगी।

कृपया नीचे दी गई छवि देखें, जिसे मैं प्राप्त करने की कोशिश कर रहा हूं

[1]


2
क्या आप शब्दों में वर्णन करने की कोशिश कर रहे हैं की एक तस्वीर शामिल कर पाएंगे?
PolyGeo

जब आप काटेंगे तब आप क्षेत्रों को कैसे बड़ा करेंगे? बफर के त्रिज्या का विस्तार करके?
पीटर हॉर्सबेल मोलर

जवाबों:


15

वृत्ताकार बफर का क्षेत्र बफर त्रिज्या का एक मोनोटोनिक रूप से बढ़ता हुआ कार्य है (वैसे भी एक प्लेनर समन्वय प्रणाली पर)। तो एक साधारण खोज रणनीति एक त्रिज्या पा सकती 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)बढ़ा सकते हैं और ऊपरी महत्वपूर्ण नहीं है क्योंकि खोज एल्गोरिथ्म इसे तब तक बढ़ाएगा जब तक कि यह अंतराल को पकड़ नहीं लेता।

खोज एल्गोरिथ्म विफल हो सकता है यदि प्रारंभिक अधिकतम त्रिज्या वास्तव में बहुत बड़ा है, क्योंकि आप अपने पूरे क्षेत्र को एक विशाल त्रिज्या के साथ बफर कर सकते हैं, जिस स्थिति में त्रिज्या अभ्यस्त बदलने से क्षेत्र में परिवर्तन नहीं होता है ... लेकिन समझदार सीमाएं ऐसा होने से रोकना चाहिए।


आर में आपने यह कैसे किया? मैं यह उल्लेख करना भूल गया कि मुझे आर में कुछ अनुभव है इसलिए मैं आर के उपयोग से कोई समाधान नहीं मानूंगा।
फन्केह-मोनकेह 27'16

rgeosपैकेज और उसके gBufferसमारोह, सबसे अधिक संभावना है ...
Spacedman

वास्तव में मैं एक झूठ बताता हूं, मैंने पायथन में क्यूजीआईएस प्लगइन के रूप में कुछ ऐसा लागू किया - यह बहुभुज को बफर कर देता था जब तक कि बफर पॉली 2x (या एनएक्स) मूल बहुभुज का क्षेत्र नहीं था। हालांकि खोज एल्गोरिथ्म।
स्पेसमैन

+1। Rकोड में दिखाए गए दृष्टिकोण के फायदे हैं (ए) यह खोज तर्क से जीआईएस गणना को अलग करता है और (बी) यह खोज एल्गोरिदम पर कैपिटल unirootकरता है जिसे अनुकूलित और परीक्षण किया गया है - आपको एक लिखना नहीं है अपने आप को (और यह संभवतः सबसे कुशल नहीं होगा)।
whuber

मुझे संदेह है कि इसके ऑप्टिमाइज़ मॉड्यूल में समान रूट-फाइंडिंग एल्गोरिदम के लिए डर लगना है : docs.scipy.org/doc/scipy/reference/optimize.html (हाँ; uniroot ब्रेंट, scipy ब्रेंट-ईश फ़ंक्शंस का हवाला देता है)
Spacedman

1

अंकों की स्थिति के कारण यह लगभग असंभव है। आप 400 किमी 2 के बफ़र बना सकते हैं , लेकिन समुद्र तट के करीब बिंदुओं के पास हमेशा दूर वाले लोगों की तुलना में एक छोटा क्षेत्र होगा (> 400 किमी 2 )।

केवल एक चीज जो आप कर सकते हैं, वह बिंदुओं पर एक बफर विश्लेषण करते हैं और बाद में फ़ीचर के साथ निर्मित बफ़र्स को क्लिप करते हैं।


2
यह असंभव नहीं हो सकता है , लेकिन यह एक एनपी पूर्ण समस्या हो सकती है जो समाधान को भ्रमित कर सकती है। क्षेत्र को परिपूर्ण करना चुनौती है (निकट आने के लिए पुनरावृत्तियों के स्कोर ले सकते हैं)।
विंस

3
यह असंभव नहीं है, और यह भी मुश्किल नहीं है!
Spacedman
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.