इसके लिए एक प्रकार की "फ़ील्ड गणना" की आवश्यकता होती है, जिसमें गणना की गई (एक अक्षांश, देशांतर, केंद्रीय अज़ीमथ, अनिश्चितता और दूरी के आधार पर) एक संख्या के बजाय बोटी आकार है। क्योंकि ऐसी फ़ील्ड गणना क्षमताओं को ArcView 3.x से ArcGIS 8.x में संक्रमण में बहुत अधिक कठिन बना दिया गया था और कभी भी पूरी तरह से बहाल नहीं किया गया है, आजकल हम पायथन, आर या जो भी इसके बजाय स्क्रिप्टिंग का उपयोग करते हैं: लेकिन विचार प्रक्रिया अभी भी है वही।
मैं काम कर रहे R
कोड के साथ वर्णन करूंगा । इसके मूल में एक धनुषी आकार की गणना है, जिसे हम एक फ़ंक्शन के रूप में संलग्न करते हैं। फ़ंक्शन वास्तव में बहुत सरल है: धनुष के सिरों पर दो आर्क उत्पन्न करने के लिए, इसे नियमित अंतराल (अज़ीमथ) पर एक अनुक्रम का पता लगाने की आवश्यकता है। इसके लिए प्रारंभ (लोन, लाट) और तय की गई दूरी के आधार पर किसी बिंदु के (लोन, लाट) निर्देशांक को खोजने की क्षमता की आवश्यकता होती है। यह सबरूटीन के साथ किया जाता है goto
, जहां सभी भारी अंकगणित उठाने होते हैं। बाकी सिर्फ आवेदन करने goto
और फिर उसे लागू करने के लिए सब कुछ तैयार कर रहा है।
bowtie <- function(azimuth, delta, origin=c(0,0), radius=1, eps=1) {
#
# On entry:
# azimuth and delta are in degrees.
# azimuth is east of north; delta should be positive.
# origin is (lon, lat) in degrees.
# radius is in meters.
# eps is in degrees: it is the angular spacing between vertices.
#
# On exit:
# returns an n by 2 array of (lon, lat) coordinates describing a "bowtie" shape.
#
# NB: we work in radians throughout, making conversions from and to degrees at the
# entry and exit.
#--------------------------------------------------------------------------------#
if (eps <= 0) stop("eps must be positive")
if (delta <= 0) stop ("delta must be positive")
if (delta > 90) stop ("delta must be between 0 and 90")
if (delta >= eps * 10^4) stop("eps is too small compared to delta")
if (origin[2] > 90 || origin[2] < -90) stop("origin must be in lon-lat")
a <- azimuth * pi/180; da <- delta * pi/180; de <- eps * pi/180
start <- origin * pi/180
#
# Precompute values for `goto`.
#
lon <- start[1]; lat <- start[2]
lat.c <- cos(lat); lat.s <- sin(lat)
radius.radians <- radius/6366710
radius.c <- cos(radius.radians); radius.s <- sin(radius.radians) * lat.c
#
# Find the point at a distance of `radius` from the origin at a bearing of theta.
# http://williams.best.vwh.net/avform.htm#Math
#
goto <- function(theta) {
lat1 <- asin(lat1.s <- lat.s * radius.c + radius.s * cos(theta))
dlon <- atan2(-sin(theta) * radius.s, radius.c - lat.s * lat1.s)
lon1 <- lon - dlon + pi %% (2*pi) - pi
c(lon1, lat1)
}
#
# Compute the perimeter vertices.
#
n.vertices <- ceiling(2*da/de)
bearings <- seq(from=a-da, to=a+da, length.out=n.vertices)
t(cbind(start,
sapply(bearings, goto),
start,
sapply(rev(bearings+pi), goto),
start) * 180/pi)
}
यह एक ऐसी मेज पर लागू करने का इरादा है जिसका रिकॉर्ड आपके पास पहले से ही किसी न किसी रूप में होना चाहिए: उनमें से प्रत्येक स्थान, अज़ीमथ, अनिश्चितता (प्रत्येक पक्ष के कोण के रूप में) देता है, और (वैकल्पिक रूप से) कितना बड़ा बनाने का संकेत है। बो टाई। आइए उत्तरी गोलार्ध में 1,000 धनुषों को स्वस्थ करके ऐसी तालिका का अनुकरण करें:
n <- 1000
input <- data.frame(cbind(
id = 1:n,
lon = runif(n, -180, 180),
lat = asin(runif(n)) * 180/pi,
azimuth = runif(n, 0, 360),
delta = 90 * rbeta(n, 20, 70),
radius = 10^7/90 * rgamma(n, 10, scale=2/10)
))
इस बिंदु पर, चीजें लगभग किसी भी क्षेत्र की गणना के समान सरल हैं। यह रहा:
shapes <- as.data.frame(do.call(rbind,
by(input, input$id,
function(d) cbind(d$id, bowtie(d$azimuth, d$delta, c(d$lon, d$lat), d$radius, 1)))))
(समय परीक्षण से संकेत मिलता है कि R
प्रति सेकंड लगभग 25,000 कोने उत्पन्न हो सकते हैं। डिफ़ॉल्ट रूप से, अज़ीमुथ के प्रत्येक डिग्री के लिए एक शीर्ष है, जो eps
तर्क के माध्यम से उपयोगकर्ता-निपटाने योग्य है bowtie
।)
आप R
चेक के रूप में परिणाम का एक सरल प्लॉट बना सकते हैं :
colnames(shapes) <- c("id", "x", "y")
plot(shapes$x, shapes$y, type="n", xlab="Longitude", ylab="Latitude", main="Bowties")
temp <- by(shapes, shapes$id, function(d) lines(d$x, d$y, type="l", lwd=2, col=d$id))
GIS को आयात करने के लिए एक आकृति उत्पादन तैयार करने के लिए, shapefiles
पैकेज का उपयोग करें :
require(shapefiles)
write.shapefile(convert.to.shapefile(shapes, input, "id", 5), "f:/temp/bowties", arcgis=T)
अब आप परिणामों को प्रोजेक्ट कर सकते हैं, आदि यह उदाहरण उत्तरी गोलार्ध के एक स्थैतिक प्रक्षेपण का उपयोग करता है और धनुष संबंध अनिश्चितता की मात्राओं द्वारा रंगीन होते हैं। (यदि आप 180 / -180 डिग्री देशांतर पर बहुत ध्यान से देखते हैं, तो आप देखेंगे कि इस जीआईएस ने धनुष संबंधों को कहां से हटा दिया है, इस रेखा को पार कर रहा है। यह जीआईएस के साथ एक सामान्य दोष है; यह R
कोड में बग को प्रतिबिंबित नहीं करता है।)