2016-11-26 2 views
3

map/mapproject/maptoolsパッケージでRを使用していくつかのマップをプロットし、実際に私ができることを制限しています。"maps"パッケージでRにxlim/ylimの投影を使用すると、より大きなマップになります

library(maps) 
map("world",xlim=c(-10.67,34.5),ylim=c(31.55,71.05), interior = T) 

Europe map without projection specified

予想通りの結果である:任意の投影を指定せずに(東でクリップアイスランドせず、またように、ETRS89/ETRS-LCCから採取された制限に)ヨーロッパの地図を描く

限界値が使用されており、結果のマップがそれに従います。

マップでデフォルトで使用される投影ヘルプごとに、されています。これが私のニーズのために良いの投影ではありません

The default is to use a rectangular projection with the aspect ratio 
chosen so that longitude and latitude scales are equivalent at the 
center of the picture. 

上記spatialreferenceに示したように、私は、ParallelsとLCCの投影を使用します。 .ORGリンク:それははるかに大きい面積(非常に遠く北に行くとincludiを含むことを

library(maps) 
map("world",xlim=c(-10.67,34.5),ylim=c(31.55,71.05), interior = T, projection="lambert", parameters = c(45,65)) 
box() 

Europe map with projection specified

結果は予想外であります本質的に地図を使用不可能にする。

library(maps) 
library(mapproj) 
map("world",xlim=c(-10.67,34.5),ylim=c(31.55,71.05), interior = T, projection="lambert", parameters = c(45,65)) 
map.grid(cex=0.1 , col="grey30") 
box() 

Europe map with LCC projection and grid

私が持っているしたいと思います(と私が仮定すると、上記のコードの結果がどうなるか:見知らぬ人は、グリッドを使用した場合、元の限界を明確に考慮されるということです何

)は、私が指定した限界を含む長方形の作物でした(使用された投影のために調整され、上記の長方形のものより多くの面積が予想される)。さらに、マップの周りに空白があり、map()で投影を使用するたびに存在する境界線があります。

質問:マップ/ mapproj/maptoolsを使用しているときにこの結果を得る方法はありますか?大きな間隔で動作するように見えるので、xlim/ylimを人為的に変更しようとしました(つまり、次回のデクリメントで突然ヨーロッパの半分が消えてしまうまで効果が出ません)。

答えて

1

spatialreference.orgで与えられた境界は、「左下、右上の座標」として与えられています。これは偶然あなたが書いたものに非常に近くなります。これらの座標は、正しくは次のようになります。

xlim=c(-10.6700,31.5500), ylim=c(34.5000,71.0500) 

ただし、ここでは問題はないようです。

2番目のxlimパラメータで再生すると、map()は、そのラインの座標の一部が範囲内にある限り、隣接するラインを含めるように見えます。ロシアの国はアフリカと東ヨーロッパのいくつかの国とともに、2番目のxlimパラメータで29-31頃に大きなジャンプを起こしています。 boundaryをオンまたはオフにするとこれが幾分確認されますが、これは国の多くの国境を隠してしまいます。

私が見つけた回避策は、近隣諸国が最初に描画されることを明示的に除外することでした。次に、add=Tを使用して地図をもう一度描画します。最初の図でcol="white"を使用して同じ場所に2回描かないようにすると、線が太くなります。

library(maps) 
library(mapproj) 
map("world",regions="(?!Russia|Morocco|Algeria|Tunisia|Turkey|Ukraine)",col="white",xlim=c(-10.6600,31.5500), ylim=c(34.5000,71.0500), interior=T, projection="lambert", parameters=c(10.44,52.775)) 
map("world",xlim=c(-10.6600,31.5500), ylim=c(34.5000,71.0500), interior=T, projection="lambert", parameters=c(10.44,52.775),add=T) 
map.grid(cex=0.1, col="grey30") 
box() 

それが再びアイスランドおよび他の国々や島々が含まれます削除、原因xlimylimにはまだ不足しているいくつかの行があるように思われます。あるいはもっと良いアプローチがあるかもしれません。

resulting plot

+0

乾杯、私はすでに受け入れていましたが、コメントするのを忘れました。たとえそれが実際に少し長めになっていても(しかしそれがうまくいく方法を克服する必要がある)、それは私のために働く。 @ alex-deckmynの説明は、なぜこのように動作するのかについてもう少し詳しく説明しますが、本質的にあなたの分析と一致します。 – fsmunoz

2

の基本的な動作「(マップ)」XLIMとYLimプロパティ内のすべての行を抽出することであるが、また、ドメイン内の部分的な線は、データベースから抽出されます。投影がない場合、xlimとylimもプロットの制限として使用されますが、明らかに機能しないデータが投影されているときに使用されます。 (xlimとylimを投影することはできません。これは、長方形のドメインではないためです)。マップコードは洗練されたものではなく、プロットの限界をデータの範囲(不要な線を含む)に設定するだけです。 (最近の)「地図」の管理者として、これは実際に私が修正しようとするかもしれないものです。残念ながら、mapprojには逆投影は含まれていません。逆投影は、期待どおりに正確に行う必要があります。地図を一番下に限定するのではなく(一番上に上げるのではなく)はるかに簡単です。

回避策として、あなたも(マップの出力値を使用して)次のことを試みることができる:

range(mymap$x, na.rm=TRUE) 

mymap <- map("world",xlim=c(-10.6600,31.5500), ylim=c(34.5000,71.0500), projection="lambert", parameters=c(10.44,52.775), plot=FALSE) 

今、あなたはmymapというの$ xとのmymap $ yの範囲を見ることができます

またはちょうどplot(mymap)の範囲を確認し、必要な間隔を決定します。

そして、最後に、あなたはインスタンス

plot(mymap, type="l", asp=1,xaxt="n",yaxt="n",xlab="",ylab="", xlim=c(-0.2,0.15), ylim=c(-0.75,-0.35)) 

ない理想的な、しかし十分にできれば良いため、あなたが望む正確制限にマップをプロットすることができます。 "asp = 1"は、プロットウィンドウのサイズを変更しても、マップ上のアスペクト比を正しく維持することです。

+0

多くのお返事をいただきありがとうございます。私はその理由をよりよく理解しており、助けになります。実際には正しいですが、私の仕事目的のために、私はすでに受け入れていた@chkriのものです。私は考古学的な記事のためにそれを使っている人の視点からこれに取り組んでいます。もっと直接的な方法で利用できるなら、それは素晴らしいことでしょう。 – fsmunoz

+0

マップv3.2(2017年6月)のmap()には、投影地図の制限を強制するための新しいオプションlforceがあります。 lforce = "e"の場合、マップデータは投影前に指定された限界値に正確に制限されます。これはプロットウィンドウだけでなくマップの出力値にも影響します。 xlimとylimで定義された4つのコーナーが投影され、プロットウィンドウがこの領域内の最大の矩形に制限されます。 "l"は4つのコーナーを含む大きな矩形になりますが、限界は完全ではないかもしれない。 –

関連する問題