বিশ্বের অনেক জায়গায় ল্যাট-লম্বা-পয়েন্টগুলির চারপাশে 1 কিলোমিটার চেনাশোনা


11

আমার শত শত ল্যাট-লম্বা-পয়েন্ট রয়েছে যা সারা বিশ্বে ছড়িয়ে আছে এবং অবশ্যই একেবারে 1000 মিটার ব্যাসার্ধের সাথে অবশ্যই তাদের প্রত্যেকের চারদিকে বৃত্ত-বহুভুজ তৈরি করতে হবে। আমি বুঝতে পারি পয়েন্টগুলি প্রথমে ডিগ্রি (ল্যাট লম্বা) থেকে মিটার-ইউনিটগুলির সাথে কোনও কিছুর দিকে প্রক্ষেপণ করা উচিত, তবে প্রতিটি পয়েন্টের জন্য ইউটিএম-জোনগুলি ম্যানুয়ালি অনুসন্ধান এবং সংজ্ঞা না দিয়ে কীভাবে এটি করা যেতে পারে?

এখানে ফিনল্যান্ডের প্রথম পয়েন্টের জন্য একটি মেগাও রয়েছে।

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" ))

ম্যানুয়ালি ইউটিএম-জোন পয়েন্ট প্রতি বিন্দু না পেয়ে এবং নির্দিষ্ট না করে কীভাবে এটি করা যায়? আমার কাছে লম্বা লম্বা চেয়ে পয়েন্ট প্রতি আর কোনও তথ্য নেই।

হালনাগাদ:

AndreJ এবং মাইক টি উভয়ের দুর্দান্ত উত্তরগুলি ব্যবহার এবং একত্রিত করার জন্য, এখানে উভয় সংস্করণ এবং প্লটগুলির কোড। তারা 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
ম্যানুয়াল অনুসন্ধানের অংশটির একটি সম্ভাব্য সমাধান: আপনি যদি কোনও ইউটিএম জোন গ্রিড পেয়ে থাকেন এবং আপনার পয়েন্টগুলির সাথে এটি ছেদ করেন, তবে আপনি উপযুক্ত অঞ্চলটিকে একটি বৈশিষ্ট্য হিসাবে যুক্ত করুন? বৈশিষ্ট্যটি হয় জোনের নাম বা ইপিএসজি কোড হতে পারে, তবে প্রতিটি পয়েন্টের জন্য স্বয়ংক্রিয়ভাবে সঠিক সিআরএস নির্বাচন করতে ভেরিয়েবল হিসাবে খাওয়ানো যেতে পারে এমন কিছু।
ক্রিস ডব্লু

1
"ঠিক 1000 মি" এবং "বৃত্ত-বহুভুজ" শব্দবন্ধটি নিয়ে আমার সমস্যা আছে। আপনার চেনাশোনা-বহুভুজ অসীম অংশ প্রয়োজন হতে ঠিক 1000m এবং UTM (অথবা অন্য কোন প্ল্যানার সিস্টেম) রূপান্তর আরও বেশি ত্রুটি পরিচয় করিয়ে দিতে যাচ্ছে। "নির্ভুল" ব্যবহারে সতর্কতা অবলম্বন করুন।
স্পেসডম্যান

হ্যাঁ, আমার এটি অন্যভাবে প্রকাশ করা উচিত হয়নি। আমি বোঝাতে চাইছিলাম 1100 মি বা 900 মি খুব দূরে থাকবে, এবং বৃত্তের প্রায় 20 টি অংশ ঠিক আছে।
ক্রিস

উত্তর:


9

@ আন্ড্রেজে এর অনুরূপ, তবে একটি গতিশীল জিনমিক প্রজেকশন ব্যবহার করুন , আমি আরও বেশি নির্ভুলতার জন্য ডায়নামিক আজিমুথাল ইক্যুইডিসিটিভ প্রজেকশনকে বোঝাতে চাইছি । প্রতিটি পয়েন্টকে কেন্দ্র করে একটি এইকিউ অভিক্ষেপ বাফার সার্কেলের মতো সমস্ত দিকগুলিতে সমান দূরত্ব স্থাপন করবে। (একটি মারকেটর অভিক্ষেপ উত্তর এবং পূর্ব দিকের কিছু বিকৃতি হবে, যেহেতু এটি একটি সিলিন্ডারের পাশের চারপাশে আবৃত থাকে।)

ফিন্ল্যাণ্ড প্রায় আপনার প্রথম পয়েন্টের জন্য সুতরাং, 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
উইকিপিডিয়া পৃষ্ঠা থেকে: "স্পর্শকাতর বিন্দুতে কোনও বিকৃতি ঘটে না, তবে এ থেকে দূরে দ্রুত বিকৃতি বৃদ্ধি পায়"। আপনি কি একটি নমুনা অফসেট গণনা তৈরি করেছেন? সম্ভবত এন.ইউইউইকিপিডিয়া.আর / উইকি / আজিমুথাল_উইকুইডিসিটি_প্রজেক্টটি আরও উপযুক্ত।
আন্দ্রেজে

2
যে বৃত্তের উত্সে সঠিক স্কেল রয়েছে এবং সেখানে প্রচলিত আছে এমন কোনও প্রক্ষেপণ সূক্ষ্মভাবে সম্পাদন করবে, কেবলমাত্র 1000 মি তাই ছোট। অনেক বড় রেডিয়াইয়ের জন্য তবে কোনও জ্ঞোমনিক প্রজেকশন ভয়ঙ্কর হবে। আপনি সম্ভবত একটি ইক্যুইডিসিটিউট প্রজেকশন নির্ধারণ করতে চেয়েছিলেন ।
হোবার

2
দুর্দান্ত প্রতিক্রিয়া, একটি AEQ অভিক্ষেপ স্পষ্টতই এই কৌশলটির জন্য আরও ভাল পারফরম্যান্স করছে, তাই আমি জিনোমিকটি স্যুইচ করেছি। AEQP 10,000+ কিলোমিটার সীমার মতো অনেক বেশি দূরত্বের জন্যও ধরে রাখবে।
মাইক টি

1
আমি কোডটি ভুল বুঝে চলেছি, তবে আপনাকে কেবল একবার বাফার বহুভুজ তৈরি করতে হবে, যে কোনও এইকিউডি প্রক্ষেপণে (কেন্দ্রটি সর্বদা শূন্য থাকে, সর্বনিম্ন কোন্ডার সর্বদা -1 কে, সর্বোচ্চ সর্বদা + 1 কে থাকে Then AEQD প্রতিটি পয়েন্টকে কেন্দ্র করে যেটি আপনাকে ল্যাট /
লং

2
@ মেকনেডি আপনি একটি ভাল পয়েন্ট আছে। projectedপ্রকৃতপক্ষে সর্বদা (0, 0) এ থাকে bufferedএবং x- এবং y- দিকনির্দেশগুলিতে পয়েন্টগুলি 1000 ডলার m যদি এটি অপ্টিমাইজ করা সমালোচিত হয়, তবে কেবল বাফারের একটি সাধারণ কার্টেসিয়ান সংস্করণটিকে ডায়নামিক AEQD থেকে ডাব্লুজিএস 84 এ রূপান্তর করুন।
মাইক টি

4

ডান ইউটিএম জোনটি অনুসন্ধান করার পরিবর্তে আপনি প্রতিটি পয়েন্টের সাথে একটি কাস্টম ট্রান্সভার্স মেরেটার প্রজেকশন তৈরি করতে পারেন

+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

সেই অভিক্ষেপে বৃত্তটি আঁকুন। প্রস্তাবিত বৃত্তের শীর্ষস্থানীয় স্থানাঙ্ক সর্বদা এক রকম হবে, তাই আপনাকে কেবল একবারেই এটি তৈরি করতে হবে। নিম্নলিখিতগুলির জন্য, কেবল তাদের জন্য নতুন কাস্টম সিআরএস নির্ধারণ করুন।

আরও ব্যবহারের জন্য EPSG: 4326 এ চেনাশোনাটিকে পুনরায় প্রজেক্ট করুন।

1000 মিটার পরিসরের মধ্যে, বৃত্তটি প্রায় সঠিক হবে। যদি না হয় (বা বৃহত্তর চেনাশোনাগুলির জন্য), aeqdপরিবর্তে ব্যবহার করুন tmerc


0

আপনি যদি ইপিএসজিতে 1000 মিটার তৈরির পদ্ধতিকে গ্রহণ করেন: আপনার প্রতিটি পয়েন্টের চারদিকে 4326। তারপরে আপনার অন্যান্য স্থানাঙ্ক সিস্টেমে EPSG: 4326 রূপান্তর করবেন? পয়েন্টটি প্রজেক্ট করার সুবিধাটি হ'ল ইপিএসজি: 4326 দিয়ে পৃথিবীর বক্রতা সম্পর্কে আপনাকে চিন্তা করতে হবে না।


1
আপনি ঠিক কিভাবে EPSG থেকে 1000 মিটার বাফার তৈরি করতে পারবেন: 4326, যার দৈর্ঘ্যের ইউনিট ডিগ্রি রয়েছে?
মাইক টি

আমি এটির কাছে যাওয়ার এক উপায় EPSG: 32635 এ 1000 মিটার বাফার তৈরি করা। এটিকে EPSG এ রূপান্তর করুন: 4326 এবং এখন আপনার প্রয়োজনীয় নম্বরটি হবে।
গ্রেগ

1
এই কৌশলটির সীমাবদ্ধতার পাশাপাশি প্রশ্নে বর্ণিত একই পদ্ধতি।
মাইক টি
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.