2

でパッケージのover()機能を使いたい。spR

を割り当てますCRS

#say that polygon is EPSG3857 (Web Mercator PROJECTION)
proj4string(finalPolygon) <- CRS("+proj=merc +a=6378137 +b=6378137 +lat_ts=0.0 +lon_0=0.0 +x_0=0.0 +y_0=0 +k=1.0 +units=m +nadgrids=@null +wktext  +no_defs")

そしてすべてが良さそうです。

str(finalPolygon)
> ..@ proj4string:Formal class 'CRS' [package "sp"] with 1 slot
> .. .. ..@ projargs: chr "+proj=merc +a=6378137 +b=6378137 +lat_ts=0.0 +lon_0=0.0 +x_0=0.0 +y_0=0 +k=1.0 +units=m +nadgrids=@null +no_defs"

CRSのを確認してみましょうallPoints

str(allPoints)
>..@ proj4string:Formal class 'CRS' [package "sp"] with 1 slot
> .. .. ..@ projargs: chr "+init=epsg:3857 +proj=merc +a=6378137 +b=6378137 +lat_ts=0.0 +lon_0=0.0 +x_0=0.0 +y_0=0 +k=1.0 +units=m +nadgrids=@null +no_def"

したがって、over()今関数を実行すると

pointsInPolygon <- over(allPoints, finalPolygon))

エラーが発生します:

同一のCRS(x, y)はTRUEではありません

ここで何が問題なのかはわかっていると思いますが、解決方法がわかりません。

よく見ると、allPointsさらにいくつかの単語があります-つまり+init=epsg:3857. ここで、スロット内の文字列が同一であるかどうかを単純に比較することを読みました。ご覧のとおり、それらは同じです (Spatial リファレンスのクレアチンはまったく同じです) が、文字列は作成方法が原因でわずかに異なります。sp packageCRSCRS

私が使うとき

#say that points is EPSG3857 (Web Mercator PROJECTION)
proj4string(spatialEPSG3857) <- CRS("+proj=merc +a=6378137 +b=6378137 +lat_ts=0.0 +lon_0=0.0 +x_0=0.0 +y_0=0 +k=1.0 +units=m +nadgrids=@null +wktext  +no_defs")

それは私にallPointsこれを返します:

proj4string<-( 、値 = )内の警告*tmp*: 新しい CRS が既存の CRS を持つオブジェクトに割り当てられました: +init=epsg:3857 +proj=merc +a=6378137 +b=6378137 +lat_ts=0.0 +lon_0=0.0 +x_0= 0.0 +y_0=0 +k=1.0 +units=m +nadgrids=@null +no_defs 再投影なし。再投影には、パッケージ rgdal の関数 spTransform を使用します

関数はover()機能しますが、返されるものは意味がありません。

この問題にどう立ち向かう!?

4

1 に答える 1

3

finalPolygonあなたはによって作成されたはずです

finalPolygon <- SpatialPolygons(list(myPolygon), proj4string = CRS(proj4string(cornersEPSG3857)))

そのドキュメントには、CRS がデフォルトで NA に設定されていると記載されているためです。代わりに、次のステートメントで CRS を設定しますCRS("+proj=merc +a=6378137 +b=6378137 +lat_ts=0.0 +lon_0=0.0 +x_0=0.0 +y_0=0 +k=1.0 +units=m +nadgrids=@null +wktext +no_defs")

> CRS("+init=epsg:3857")
CRS arguments:
 +init=epsg:3857 +ellps=WGS84 +proj=merc +a=6378137 +lat_ts=0.0
+lon_0=0.0 +x_0=0.0 +y_0=0 +k=1.0 +units=m +nadgrids=@null +no_defs 

これはあなたが使用したものですcornersEPSG3857。これらの 2 つの文字列は同じ CRS を表している (つまり、同じセマンティクスを持っている) かもしれませspんが、それらは構文的に異なり、基になるPROJ.4ライブラリ (GDAL の一部であり、 package を介してインターフェースされますrgdal) にも、2 つの構文的に異なる proj4string のセマンティクスを比較する関数はありません。

この問題の解決策は、新しい CRS を一度定義することです。

crs3857 =  CRS("+init=epsg:3857")

スクリプト全体でそれを使用します。

(最後の警告は、ユーザーが単に CRS を上書きしたときに再投影するとは思わないようにするためのものです。上書きして、問題解決しましたが、それほどクリーンな方法ではありません)

于 2015-09-04T12:00:15.253 に答える