दुनिया में कई स्थानों पर अक्षांश-लंबे-बिंदुओं के आसपास 1 किमी सर्कल


11

मेरे पास दुनिया भर में फैले सैकड़ों लम्बे-लम्बे बिंदु हैं, और उनमें से प्रत्येक के चारों ओर वृत्त-बहुभुज बनाने चाहिए, जिनका दायरा 1000 मीटर है। मैं समझता हूं कि अंकों को पहले मीटर (यूनिट्स) के साथ डिग्री (लाट लॉन्ग) से अनुमानित किया जाना चाहिए, लेकिन प्रत्येक बिंदु के लिए UTM- जोन को मैन्युअल रूप से खोजने और परिभाषित किए बिना ऐसा कैसे किया जा सकता है?

फ़िनलैंड में पहले बिंदु के लिए यहाँ एक mwe है।

library(sp)
library(rgdal)
library(rgeos)
the.points.latlong <- data.frame(
  Country=c("Finland", "Canada", "Tanzania", "Bolivia", "France"),
  lat=c(63.293001, 54.239631, -2.855123, -13.795272, 48.603949),
  long=c(27.472918, -90.476303, 34.679950, -65.691146, 4.533465))
the.points.sp <- SpatialPointsDataFrame(the.points.latlong[, c("long", "lat")], data.frame(ID=seq(1:nrow(the.points.latlong))), proj4string=CRS("+proj=longlat +ellps=WGS84 +datum=WGS84"))

the.points.projected <- spTransform(the.points.sp[1, ], CRS( "+init=epsg:32635" ))  # Only first point (Finland)
the.circles.projected <- gBuffer(the.points.projected, width=1000, byid=TRUE)
plot(the.circles.projected)
points(the.points.projected)

the.circles.sp <- spTransform(the.circles.projected, CRS("+proj=longlat +ellps=WGS84 +datum=WGS84"))

लेकिन दूसरे बिंदु (कनाडा) के साथ यह काम नहीं करता है (क्योंकि गलत यूटीएम-जोन)।

the.points.projected <- spTransform(the.points.sp[2, ], CRS( "+init=epsg:32635" ))

यह मैन्युअल रूप से प्राप्त करने और UTM- ज़ोन बिंदु प्रति बिंदु को निर्दिष्ट किए बिना कैसे किया जा सकता है? मेरे पास अक्षांश से अधिक प्रति बिंदु कोई भी जानकारी नहीं है।

अपडेट करें:

आंद्रेजे और माइक टी दोनों से महान उत्तरों का उपयोग करना और संयोजन करना, यहां दोनों संस्करणों और भूखंडों के लिए कोड है। वे 4 या दशमलव पर अलग हैं, लेकिन दोनों बहुत अच्छे जवाब!

gnomic.buffer <- function(p, r) {
  stopifnot(length(p) == 1)
  gnom <- sprintf("+proj=gnom +lat_0=%s +lon_0=%s +x_0=0 +y_0=0",
                  p@coords[[2]], p@coords[[1]])
  projected <- spTransform(p, CRS(gnom))
  buffered <- gBuffer(projected, width=r, byid=TRUE)
  spTransform(buffered, p@proj4string)
}

custom.buffer <- function(p, r) {
  stopifnot(length(p) == 1)
  cust <- sprintf("+proj=tmerc +lat_0=%s +lon_0=%s +k=1 +x_0=0 +y_0=0 +ellps=WGS84 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs", 
                  p@coords[[2]], p@coords[[1]])
  projected <- spTransform(p, CRS(cust))
  buffered <- gBuffer(projected, width=r, byid=TRUE)
  spTransform(buffered, p@proj4string)
}

test.1 <- gnomic.buffer(the.points.sp[2,], 1000)
test.2 <- custom.buffer(the.points.sp[2,], 1000)

library(ggplot2)
test.1.f <- fortify(test.1)
test.2.f <- fortify(test.2)
test.1.f$transf <- "gnomic"
test.2.f$transf <- "custom"
test.3.f <- rbind(test.1.f, test.2.f)

p <- ggplot(test.3.f, aes(x=long, y=lat, group=transf))
p <- p + geom_path()
p <- p + facet_wrap(~transf)
p

(यह सुनिश्चित नहीं है कि अपडेट में प्लॉट कैसे प्राप्त करें)।


1
मैन्युअल खोज भाग का एक संभावित समाधान: क्या होगा यदि आप एक UTM ज़ोन ग्रिड प्राप्त करते हैं और अपने बिंदुओं के साथ इसे काटते हैं, ताकि आप एक विशेषता के रूप में उपयुक्त ज़ोन जोड़ सकें? विशेषता या तो ज़ोन का नाम या ईपीएसजी कोड हो सकता है, लेकिन प्रत्येक बिंदु के लिए सही सीआरएस का चयन करने के लिए चर के रूप में खिलाया जा सकता है।
क्रिस डब्ल्यू

1
मुझे "बिल्कुल 1000 मीटर" और वाक्यांश "सर्कल-पॉलीगॉन" के साथ समस्या है। अपने सर्कल-बहुभुज अनंत खंडों की जरूरत होने के लिए वास्तव में 1000 मी, और UTM (या किसी अन्य प्लानर प्रणाली) को बदलने और भी अधिक त्रुटियों को पेश करने जा रहा है। "सटीक" के उपयोग से सावधान रहें।
सपत्नीक

हां, मुझे इसे अलग तरह से व्यक्त नहीं करना चाहिए था। मेरा मतलब था कि 1100 मीटर या 900 मीटर बहुत दूर होगा, और सर्कल पर लगभग 20 सेगमेंट ठीक हैं।
क्रिस

जवाबों:


9

@AndreJ के समान, लेकिन एक गतिशील सूक्ष्मतम प्रक्षेपण का उपयोग करें , मेरा मतलब है कि अधिक सटीकता के लिए एक गतिशील अज़ीमुथल समकालिक प्रक्षेपण । प्रत्येक बिंदु पर केंद्रित एक AEQ प्रोजेक्शन सभी दिशाओं में समान दूरी की परियोजना करेगा, जैसे कि बफ़र्ड सर्कल। (उत्तर और पूर्वी दिशाओं में एक मर्केटर प्रोजेक्शन में कुछ विकृतियां होंगी, क्योंकि यह एक सिलेंडर के चारों ओर लपेटता है।)

तो फिनलैंड के आसपास आपके पहले बिंदु के लिए, PROJ.4 स्ट्रिंग इस तरह दिखेगा :

+proj=aeqd +lat_0=63.293001 +lon_0=27.472918 +x_0=0 +y_0=0

तो आप इस गतिशील प्रक्षेपण बनाने के लिए एक आर फ़ंक्शन बना सकते हैं:

aeqd.buffer <- function(p, r)
{
    stopifnot(length(p) == 1)
    aeqd <- sprintf("+proj=aeqd +lat_0=%s +lon_0=%s +x_0=0 +y_0=0",
                    p@coords[[2]], p@coords[[1]])
    projected <- spTransform(p, CRS(aeqd))
    buffered <- gBuffer(projected, width=r, byid=TRUE)
    spTransform(buffered, p@proj4string)
}

फिर कनाडा के लिए कुछ ऐसा करें (आइटम 2):

aeqd.buffer(the.points.sp[2,], 1000)

1
विकिपीडिया पृष्ठ से: "स्पर्शरेखा बिंदु पर कोई विकृति नहीं होती है, लेकिन विकृति तेजी से दूर हो जाती है"। क्या आपने एक नमूना ऑफसेट संगणना बनाई है? शायद en.wikipedia.org/wiki/Azimuthal_equidistant_projection बेहतर अनुकूल है।
आंद्रेजे

2
कोई भी प्रक्षेपण जिसमें सर्कल के मूल में सही पैमाना है और यह अनुरूप है कि ठीक होगा, सिर्फ इसलिए कि 1000 मी इतना छोटा है। बहुत बड़े रेडी के लिए, हालांकि, एक ग्नोमोनिक प्रक्षेपण भयानक होगा। आप शायद एक इक्विडिस्टेंट प्रोजेक्शन को निर्धारित करना चाहते हैं।
व्हिबर

2
महान प्रतिक्रिया, एक AEQ प्रक्षेपण स्पष्ट रूप से इस तकनीक के लिए बहुत बेहतर प्रदर्शन कर रहा है, इसलिए मैंने सूक्ति को बंद कर दिया है। AEQP भी 10,000 से अधिक किमी रेंज की तरह, अधिक से अधिक दूरी के लिए पकड़ करेगा।
माइक टी

1
मुझे कोड की गलतफहमी हो सकती है, लेकिन आपको केवल एक बार ही बफर बहुभुज बनाने की आवश्यकता होती है, किसी भी AEQD प्रोजेक्शन में (केंद्र हमेशा शून्य होता है, न्यूनतम समन्वय हमेशा -1 k होता है, अधिकतम हमेशा 1k होता है। फिर इसे अव्यक्त / lP का उपयोग करके अनप्रोजेक्ट करें। AEQD प्रत्येक बिंदु पर केंद्रित है जिसे आपको
अव्यक्त

2
@mkennedy आपके पास एक अच्छी बात है। projectedवास्तव में हमेशा (0, 0) पर होता है, और bufferedअंक m 1000 मीटर x - और y -directions में होता है। यदि इसे अनुकूलित करना महत्वपूर्ण था, तो बस डायनेमिक AEQD से बफर के एक सरल कार्टेशियन संस्करण को WGS84 में बदल दें।
माइक टी

4

सही UTM ज़ोन की खोज करने के बजाय, आप हर बिंदु के लिए एक कस्टम ट्रांसवर्स मर्चेंट प्रोजेक्शन बना सकते हैं

+proj=tmerc +lat_0=.... +lon_0=... +k=1 +x_0=0 +y_0=0 +ellps=WGS84 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs

उस प्रोजेक्शन में सर्कल बनाएं। अनुमानित सर्कल वर्टेक्स निर्देशांक हमेशा समान होंगे, इसलिए आपको उन्हें केवल एक बार बनाना होगा। निम्नलिखित के लिए, बस उन्हें नए कस्टम CRS असाइन करें।

आगे के उपयोग के लिए ईपीएसजी: 4326 पर सर्कल को फिर से लागू करें।

1000 मीटर की सीमा के भीतर, सर्कल लगभग सटीक होगा। यदि नहीं (या बड़े सर्कल के लिए), aeqdइसके बजाय का उपयोग करें tmerc


0

क्या होगा यदि आप ईपीएसजी में 1000 मीटर बनाने का दृष्टिकोण लेते हैं: आपके प्रत्येक बिंदु के चारों ओर 4326। फिर EPSG: 4326 को अपने अन्य समन्वय प्रणाली में रूपांतरित करें? बिंदु को प्रोजेक्ट करने का लाभ यह है कि आपको EPSG: 4326 के साथ पृथ्वी की वक्रता के बारे में चिंता करने की आवश्यकता नहीं है।


1
आप EPSG: 4326 से 1000 मीटर बफ़र कैसे बनाएंगे, जिसकी लंबाई इकाइयों में डिग्री है?
माइक टी

ईपीएसजी: 32635 में एक 1000 मीटर बफर बनाने के लिए मैं जिस तरह से संपर्क करूंगा वह है। इसे EPSG में कनवर्ट करें: 4326 और अब आपके पास आपकी जरूरत का नंबर होगा।
ग्रेग

1
इस तकनीक की सीमाओं के साथ, प्रश्न में वर्णित वही दृष्टिकोण है।
माइक टी
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.