এর জন্য এক ধরণের "ক্ষেত্রের গণনা" দরকার যার মধ্যে মান গণনা করা (একটি অক্ষাংশ, দ্রাঘিমাংশ, কেন্দ্রীয় আজিমুথ, অনিশ্চয়তা এবং দূরত্বের উপর ভিত্তি করে) সংখ্যার পরিবর্তে বাউটি আকার হয়। কারণ এই জাতীয় ক্ষেত্র গণনা ক্ষমতা আরকভিউ ৩.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)
}
এটি এমন কোনও টেবিলে প্রয়োগ করার উদ্দেশ্যে যাঁর রেকর্ডগুলি আপনার কাছে ইতিমধ্যে কিছু আকারে থাকা উচিত: তাদের প্রত্যেকটির অবস্থান, অজিমুথ, অনিশ্চয়তা (প্রতিটি পক্ষের একটি কোণ হিসাবে) এবং ((চ্ছিকভাবে) কত বড় করা যায় তার ইঙ্গিত দেয় bowtie। আসুন পুরো গোলার্ধের পুরো অঞ্চল জুড়ে 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))
জিআইএসে আমদানির জন্য শেফফাইল আউটপুট তৈরি করতে, shapefiles
প্যাকেজটি ব্যবহার করুন :
require(shapefiles)
write.shapefile(convert.to.shapefile(shapes, input, "id", 5), "f:/temp/bowties", arcgis=T)
এখন আপনি ফলাফলগুলি প্রজেক্ট করতে পারেন ইত্যাদি This (আপনি যদি 180 / -180 ডিগ্রি দ্রাঘিমাংশকে খুব সাবধানতার সাথে দেখেন তবে আপনি দেখতে পাবেন কোথায় এই জিআইএস এই লাইনটি অতিক্রম করে এমন ধনুকের বন্ধনগুলি ক্লিপ করেছে G এটি জিআইএসের সাথে একটি সাধারণ ত্রুটি; এটি কোডে কোনও বাগ প্রতিফলিত করে না R
))