世界の多くの場所で緯度経度の地点を1 km周回


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

しかし、2番目のポイント(カナダ)では機能しません(UTMゾーンが間違っているため)。

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

ポイントごとにUTMゾーンポイントを手動で取得および指定せずにこれを行うにはどうすればよいですか?1ポイントあたりの緯度経度の情報はこれ以上ありません。

更新:

AndreJとMike Tの両方からの素晴らしい答えを使用して組み合わせ、ここにバージョンとプロットの両方のコードがあります。それらは小数第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ゾーングリッドを取得し、それをポイントと交差させて、適切なゾーンを属性として追加するとどうなりますか?属性はゾーン名またはEPSGコードのいずれかですが、各ポイントに適切なCRSを自動的に選択する変数として入力できるものです。
クリスW 14年

1
「正確に1000m」とフレーズ「circle-polygons」に問題があります。円ポリゴンには、正確に 1000mの無限セグメントが必要です。UTM(または他の平面システム)に変換すると、さらに多くのエラーが発生します。「正確」の使用には注意してください。
スペースマン14年

はい、違う表現をするべきではありません。つまり、1100mまたは900mはオフになり、円上の約20のセグメントは問題ないということです。
クリス

回答:


9

@AndreJに似ていますが、動的なgnomic 投影を使用します。これは、精度を高めるための動的な方位角の等距離投影を意味します。各ポイントを中心とするAEQ投影は、バッファリングされた円など、すべての方向に等しい距離を投影します。(メルカトル図法は円柱の側面に巻き付くため、北と東の方向にいくらかの歪みがあります。)

したがって、フィンランド周辺の最初のポイントでは、PROJ.4文字列は次のようになります

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

したがって、R関数を作成してこの動的な投影を行うことができます。

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の方が適しています。
AndreJ 14年

2
どれ円の原点に正しいスケールを持ち、コンフォーマルである投影が千メートルは非常に小さいという理由だけで、罰金が行います。しかし、はるかに大きい半径の場合、ノモニック投影はひどいものになります。おそらく等距離射影を規定するつもりでした。
whuber

2
素晴らしいフィードバック、AEQプロジェクションは明らかにこの手法の方がはるかに優れているため、gnomicに切り替えました。AEQPは、10,000 km以上の距離のように、はるかに長い距離にも耐えます。
マイクT 14年

1
コードを誤解している可能性がありますが、AEQD投影では、バッファーポリゴンを1回だけ作成する必要があります(中心は常にゼロ、最小座標は常に-1k、最大は常に+ 1kです。その後、 AEQDは...あなたは緯度/経度の値を取得する必要があるとの点のそれぞれを中心に
mkennedy

2
@mkennedy良い点があります。projected確かに常に(0、0)にありbufferedx方向とy方向に±1000 mのポイントがあります。これを最適化することが重要である場合、単純なデカルトバージョンのバッファを動的AEQDからWGS84に変換するだけです。
マイクT 14年

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を割り当てます。

さらに使用するために、円をEPSG:4326に再投影します。

1000mの範囲内で、円はほぼ正確になります。そうでない場合(またはより大きな円の場合)、aeqd代わりにを使用しますtmerc


0

各ポイントの周りにEPSG:4326で1000メートルを作成するアプローチをとるとどうなりますか。次に、EPSG:4326を他の座標系に変換しますか?ポイントを投影することの利点は、EPSG:4326で地球の曲率を心配する必要がないことです。


1
度単位の長さの単位を持つEPSG:4326から1000 mのバッファをどのくらい正確に作成しますか?
マイクT 14年

これにアプローチする1つの方法は、EPSG:32635に1000メートルのバッファーを作成することです。これをEPSG:4326に変換すると、必要な番号が得られます。
グレッグ14年

1
これは、この手法の制限とともに、質問で説明したものと同じアプローチです。
マイクT 14年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.