2017-08-31 1 views
2

非常に単純な状況:ポリゴンは地理的領域を定義しており、gps座標によって与えられた点がそのポリゴン内にあるかどうかを知りたい。このポイントはポリゴン内にありますか?

私は多くの問題を抱えていて、spのようなさまざまな機能やパッケージを試しましたが、なぜ失敗するのかは分かりません。

私はこの非常に単純な機能を試してみました:この機能のために与えられた例は、私と一緒に動作しませんが、この単純なケースは何...理由です https://www.rdocumentation.org/packages/SDMTools/versions/1.1-221/topics/pnt.in.poly

install.packages("SDMTools v1.1-221") 
library(SDMTools v1.1-221) 

## Coordinates of the polygon corners 
lat <- c(48.43119, 48.43119, 48.42647, 48.400031, 48.39775, 48.40624, 48.42060, 48.42544, 48.42943) 
lon <- c(-71.06970, -71.04180, -71.03889, -71.04944, -71.05991, -71.06764, -71.06223, -71.06987, -71.07004) 
pol = cbind(lat=lat,lng=lon) 

## Point to be tested 
x <- data.frame(lng=-71.05609, lat=48.40909) 

## Visualization, this point clearly stands in the middle of the polygon 
plot(rbind(pol, x)) 
polygon(pol,col='#99999990') 

## Is that point in the polygon? 
out = pnt.in.poly(x,poly) 

## Well, no (pip=0) 
print(out) 

答えて

3

に逆転され、私はspの中からあなたのポイントとポリゴンで完璧に動作するものを持っています。

私はあなたのコードを選択し、機能要件に合うようにベクトルとポイント座標としてlatlonを残しました。

しかし、データフレームを簡単に作成して、緯度/経度値として明示的に列を使用することができます。ここで

はそれの要点です:

require(sp) 
## Your polygon 
lat <- c(48.43119, 48.43119, 48.42647, 48.400031, 48.39775, 48.40624, 48.42060, 48.42544, 48.42943) 
lon <- c(-71.06970, -71.04180, -71.03889, -71.04944, -71.05991, -71.06764, -71.06223, -71.06987, -71.07004) 


## Your Point 
lng=-71.05609 
lt=48.40909 

# sp function which tests for points in polygons 

point.in.polygon(lt, lng, lat, lon, mode.checked=FALSE) 

そして、ここでは、出力されます。

[1] 1 

ドキュメントからこの解釈:

整数配列の値は次のとおりです。

  • 0ポイントは厳格ですポリゴン
  • 1点までLY外観は、あなたの点であるよう
  • 3点はポリゴン

の頂点である

  • 2点が多角形のエッジの相対的内部にあるポリゴンに厳密インテリア1これに基づいて、あなたの地図が示すように、それは完全にポリゴンの範囲内になければなりません!これらのタイプのデータで良好な成果を得るための鍵は、正しいフォーマットの変数を提供することです。

    あなたは同じように簡単に2つのポリゴン変数だけでなく、一連の点としてtest$lattest$lonとテストフレームtestとしてdf$latdf$lonでデータフレームdfを持っていた可能性があります。あなただけのような式でそれらのそれぞれの代用になります。

    point.in.polygon(df$lat, df$lon, test$lat, test$lon, mode.checked=FALSE) 
    

    をそして、それはちょうどあなたが最初に適切なフォーマットでそれを取得してください0、1の2の3の

    のベクトルを返します! Here is a link to the function page:

  • 2

    ?pnt.in.polyのドキュメントに明示的に記載されていないことがありますが、lnglatの列の順序が重要です。 polで列の順序を入れ替える必要があります。空間goemetryで

    pol = cbind(lat=lat, lng=lon) 
    pnt.in.poly(x, pol) 
    #   lng  lat pip 
    # 1 -71.05609 48.40909 0 
    
    pol = cbind(lng=lon, lat=lat) 
    pnt.in.poly(x, pol) 
    #   lng  lat pip 
    # 1 -71.05609 48.40909 1 
    

    lngはしばしばx-axisとして考えている、とあなたが表示されますlaty-axisは、私はあなたが使用している方法を使用していない、あなたのplot()

    関連する問題