spTransformの代替?


8

特定のプロジェクションを持つシェープファイルがあるとしましょう。

s<-readOGR(dsn=".",layer="Spain")

別の予測のポイントとして、スペインの空港もあります。

a<-readOGR(dsn=".",layer="airports")

スペインのシェープファイルにポイントを配置する場合は、座標が同じになるように配置する必要があります。通常、これは次のように行われます。

 a<-spTransform(a,CRS(proj4string(s))

しかし、それは同じですか?

proj4string(a)<-proj4string(s)

はいの場合、シンプルでspTransformを使用する必要があるため、標準的な方法ではないのはなぜですか?

回答:


6

別のCRSを割り当てても、基になる空間データの投影は変更されませ。CRSは、空間オブジェクトの内部部分であり、Rに空間座標の解釈方法を指示します。

library(rgdal)

# Load Tanzania in UTM 36
tz.36 <- readOGR(dsn = ".", layer = "tz_36")
summary(tz.36) # Show the bounding coordinates:

Coordinates:
         min     max
x   94000.58 1315978
y 8699697.87 9889701
Is projected: TRUE 
proj4string :
[+proj=utm +zone=36 +south +datum=WGS84 +units=m +no_defs +ellps=WGS84 +towgs84=0,0,0]
....

次に、形状を隣接するUTMゾーンに変換します。

tz.37 <- spTransform(tz.36, CRS("+init=epsg:32737"))
summary(tz.37)

Coordinates:
        min       max
x -576091.7  657248.1
y 8700995.0 9888925.5
Is projected: TRUE 
proj4string :
[+init=epsg:32737 +proj=utm +zone=37 +south +datum=WGS84 +units=m +no_defs +ellps=WGS84 +towgs84=0,0,0]

ジオメトリの座標は、隣接するUTMゾーンに合わせて正しく変更されました。変換せずに単にCRSを再割り当てするとどうなりますか?

# Make a copy of the original object.
tz.37.b <- tz.36 
# Assign the CRS
proj4string(tz.37.b) <- CRS("+init=epsg:32737") 

Warning message:
In `proj4string<-`(`*tmp*`, value = <S4 object of class "CRS">) :
  A new CRS was assigned to an object with an existing CRS:
+proj=utm +zone=36 +south +datum=WGS84 +units=m +no_defs +ellps=WGS84 +towgs84=0,0,0
without reprojecting.
For reprojection, use function spTransform in package rgdal

警告されました...では、座標はどのようになっていますか?

summary(tz.37.b)

    Coordinates:
         min     max
x   94000.58 1315978
y 8699697.87 9889701
Is projected: TRUE 
proj4string :
[+init=epsg:32737 +proj=utm +zone=37 +south +datum=WGS84 +units=m +no_defs +ellps=WGS84 +towgs84=0,0,0]

数値(座標)はUTMゾーン36の元の番号ですが、形状は間違ったUTMゾーンにマッピングされ、間違った場所に表示されます。

編集する

OPによって提案された正確な方法を使用します。

# Make a new copy of the original UTM 36 shape:
tz.37.c <- tz.36
# Now assign the proj4string using OP's suggestion:
proj4string(tz.37.c) <- proj4string(tz.37)
summary(tz.37.c)

Coordinates:
         min     max
x   94000.58 1315978
y 8699697.87 9889701
Is projected: TRUE 
proj4string :
[+init=epsg:32737 +proj=utm +zone=37 +south +datum=WGS84 +units=m +no_defs +ellps=WGS84 +towgs84=0,0,0]

エクステントは元のutm36オブジェクトと同じですが、proj4stringはutm37になりました。(興味深いことに、今回は警告はありませんでした。)注:結果は、EPSGコードでCRSを割り当てた場合とまったく同じです。テストする:

identical(tz.37.b, tz.37.c)
TRUE

タンザニアの地域の実際のUTM37レイヤーを使用して、実際の形状がどのように見えるかを確認してみましょう。

# Load the region shape
tz.regions.37 <- readOGR(".", "tz_regions_37_simp")
# Plot it
plot(tz.regions.37, lwd = 1, border = 'red')
# Now add the CRS-assigned (not transformed!) object:
plot(tz.37.c, add = T, border = 'blue', lwd = 2)

ここに画像の説明を入力してください

それらは整列しないので、この方法は機能しません!何についての変換オブジェクト?

plot(tz.37, add = T, border = 'darkgreen', lwd = 2)

ここに画像の説明を入力してください

変換されたオブジェクトが正しい場所に表示されます(濃い緑色の背景)。

注意:UTMゾーン間で同じデータム(ここではWGS84)間で変換する場合、私の例のように違いは劇的です。ただし、異なるデータム間で変換する場合、違いははるかに微妙な場合があります。たとえば、以下はザンジバルの2つの形状で、どちらもUTM 37ですが、一方はWGS84で、もう一方はARC1960です。

ここに画像の説明を入力してください


proj4string(tz.37.b)<-CRS( "+ init = epsg:32737")の代わりに試して、投稿pro4string(tz.37.b)<-proj4string(proj u後)、それが機能するかどうかを確認します。説明で言及したようにそれを実行し、正しい位置に表示されました。
gsa

したがって、1つのshpにCRSがない場合、spTransformを適用する前の最初のステップは何ですか?必要なcrsを指定してから、spTransformを適用すると、すべてが適切になりますか?
gsa

あなたは間違いなく正しいCRSを見つけてそれを最初に適用するべきです、そうでなければspTransformはオブジェクトを再投影するための基礎を持っていません!
シンバマング2015年

4

いいえ:これら2つの形式は同じではありません。これは仕様によるものです。その理由は、CRSを持たないオブジェクトにCRSを割り当てたい場合や、座標を変更せずにCRSを変更したい場合や、座標をあるCRSから別のCRSに変換または変換したい場合があります。最初の(割り当て、置換)は、

proj4string(a)<-proj4string(s)

そして2番目の(変換、変換)

a<-spTransform(a,CRS(proj4string(s))

あなたは最初のコマンドが実際に2番目のコマンドがすることをすることを考える最初ではないのでsp、最初のフォームを試したときに次の警告を出しますが、aが、CRSはすでに異なります。

Warning message:
In ReplProj4string(obj, CRS(value)) :
  A new CRS was assigned to an object with an existing CRS:
+init=epsg:28992 +proj=sterea [etc]
without reprojecting.
For reprojection, use function spTransform in package rgdal

(はのメソッドを呼び出すのspTransform関数なので、完全に正しくはなりません)。sprgdal

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.