2017-07-21 5 views
4

グループ変数をリーフレットで機能させてグループごとにポリゴンを作成することはできません。Rリーフレット:グループ別に追加ポリゴン

マイデータ:

data <- data.frame(group = c("p_pladser.1", "p_pladser.1", "p_pladser.2","p_pladser.2", "p_pladser.3", "p_pladser.3", "p_pladser.4", "p_pladser.4","p_pladser.6", "p_pladser.6", "p_pladser.6"), lat = c(55.67179, 55.67171, 55.67143, 55.67135, 55.67110, 55.67099, 55.67173, 55.67158, 55.67155, 55.67154, 55.67145), long = c(12.55825, 12.55853, 12.55956, 12.55984, 12.56041, 12.56082, 12.55819, 12.55873, 12.55913, 12.55914, 12.55946)) 

私は

leaflet(data) %>% 
    addTiles() %>% 
    addPolygons(lat = ~ lat, lng = ~ long, group = ~ group) 

を試してみました何これは、その結果:私は必要なもの

enter image description here

は、個別に接続されるように駐車スペースありggplot2で同じデータを使って行われます。

ggplot() + 
geom_line(data=data, aes(lat, long, group=group)) + 
theme(legend.position="none") 

enter image description here

編集:グループでポリゴンを作成するためのサンプルデータ。

df <- data.frame(group = c(9,9,9,9,3,3,4,10,4,4,6,6,9,9,6,7,8,6,6,6,4,10,10,10,10,5,5,5,5,6,2,6,8,10,4,1,1,8,2,2,8,1,1,2,3,3,1,2,3,5,5,7,7,7,7,7), lat = c(12.51324264,12.513305365,12.513460965,12.513471705,12.51323028,12.51343869,12.51002744,12.50998803,12.50981405,12.50976721,12.511631235,12.513047085,12.513872565,12.51284178,12.512897255,12.51491698,12.51098456,12.51271646,12.512567055,12.51193457,12.510672405,12.509586335,12.509513235,12.509228595,12.51019304,12.514326785,12.51430267,12.51431847,12.514476435,12.512163885,12.51235039,12.51238198,12.51063921,12.51044102,12.510237215,12.510051915,12.51031317,12.511275515,12.51133816,12.51112378,12.51150496,12.50974082,12.51063222,12.51169496,12.512893665,12.51391899,12.510612445,12.51168118,12.5127838,12.5139199,12.515012135,12.51503213,12.515610885,12.515487105,12.515415995,12.51546271), long = c(55.662148595,55.66274813,55.662200085,55.662681285,55.6618097,55.66187776,55.66261815,55.66273954,55.66191013,55.66203335,55.66224483,55.66231779,55.662361495,55.662510495,55.662309905,55.66241728,55.66220386,55.662301165,55.6622937,55.662261925,55.66218702,55.663355645,55.663463555,55.66335952,55.663351875,55.661814145,55.66214884,55.661928915,55.662022445,55.66189588,55.66176534,55.662082195,55.66289834,55.663009465,55.66231188,55.661666315,55.66180155,55.662641355,55.661861295,55.661826095,55.662688875,55.66121794,55.66126692,55.66132434,55.661389205,55.66144555,55.66141339,55.661468365,55.661532485,55.66159399,55.66165429,55.661505195,55.662096835,55.6617923,55.662226165,55.661944765)) 

答えて

3

だからオブジェクトにあなたの座標を回し、addPolylinesを使用する必要があります。

以下では、データをオブジェクトに変換しました。その列は長くて緯度のように見えることが重要です。

本質的に、データはグループごとに分割され、long/latの行列に変換され、Lineに変換され、ID線のオブジェクトにプッシュされます。これはすべてSpatialLinesにまとめられています。

library(leaflet) 
library(sp) 

# data 
data <- data.frame(group = c("p_pladser.1", "p_pladser.1", "p_pladser.2","p_pladser.2", "p_pladser.3", "p_pladser.3", "p_pladser.4", "p_pladser.4","p_pladser.6", "p_pladser.6", "p_pladser.6"), lat = c(55.67179, 55.67171, 55.67143, 55.67135, 55.67110, 55.67099, 55.67173, 55.67158, 55.67155, 55.67154, 55.67145), long = c(12.55825, 12.55853, 12.55956, 12.55984, 12.56041, 12.56082, 12.55819, 12.55873, 12.55913, 12.55914, 12.55946)) 

# turn into SpatialLines 
split_data = lapply(unique(data$group), function(x) { 
    df = as.matrix(data[data$group == x, c("long", "lat")]) 
    lns = Lines(Line(df), ID = x) 
    return(lns) 
}) 

data_lines = SpatialLines(split_data) 

leaflet(data_lines) %>% 
    addTiles() %>% 
    addPolylines() 

enter image description here


ポリゴン

あなたはポリゴンを使用したい場合は、あなたが行が行われほぼ同様の方法で行われSpatialPolygonsオブジェクトを作成します。 。

は、座標の以上4組の多角形で存在していないとして、それが4に到達するまで、それは最初のペアをリサイクルしますいくつかの警告メッセージを表示するために期待しています。

split_data_poly = lapply(unique(data$group), function(x) { 
    df = as.matrix(data[data$group == x, c("long", "lat")]) 
    polys = Polygons(list(Polygon(df)), ID = x) 
    return(polys) 
}) 

data_polys = SpatialPolygons(split_data_poly) 

leaflet(data_polys) %>% 
    addTiles() %>% 
    addPolygons() 

順不同ポリゴン&色

は、これは、単純ではなく、より多くのポイントがあり、より複雑になっています。 本当の簡単な解決策は、適切に注文されたソースからデータを取得することです。 速い選択肢は、凸包を使用することですchull。これは形状を維持することは保証されていません。

色を追加するのが簡単です。SpatialPolygonSpatialPolygonDataFrameにすると、グループとその色に関するメタ情報が表示されます。

以下の例では、SpatialPolygonDataFrameの色が列として含まれています。この例では、赤色と青色が交互に表示されています。

data <- data.frame(group = c(9,9,9,9,3,3,4,10,4,4,6,6,9,9,6,7,8,6,6,6,4,10,10,10,10,5,5,5,5,6,2,6,8,10,4,1,1,8,2,2,8,1,1,2,3,3,1,2,3,5,5,7,7,7,7,7), lat = c(12.51324264,12.513305365,12.513460965,12.513471705,12.51323028,12.51343869,12.51002744,12.50998803,12.50981405,12.50976721,12.511631235,12.513047085,12.513872565,12.51284178,12.512897255,12.51491698,12.51098456,12.51271646,12.512567055,12.51193457,12.510672405,12.509586335,12.509513235,12.509228595,12.51019304,12.514326785,12.51430267,12.51431847,12.514476435,12.512163885,12.51235039,12.51238198,12.51063921,12.51044102,12.510237215,12.510051915,12.51031317,12.511275515,12.51133816,12.51112378,12.51150496,12.50974082,12.51063222,12.51169496,12.512893665,12.51391899,12.510612445,12.51168118,12.5127838,12.5139199,12.515012135,12.51503213,12.515610885,12.515487105,12.515415995,12.51546271), long = c(55.662148595,55.66274813,55.662200085,55.662681285,55.6618097,55.66187776,55.66261815,55.66273954,55.66191013,55.66203335,55.66224483,55.66231779,55.662361495,55.662510495,55.662309905,55.66241728,55.66220386,55.662301165,55.6622937,55.662261925,55.66218702,55.663355645,55.663463555,55.66335952,55.663351875,55.661814145,55.66214884,55.661928915,55.662022445,55.66189588,55.66176534,55.662082195,55.66289834,55.663009465,55.66231188,55.661666315,55.66180155,55.662641355,55.661861295,55.661826095,55.662688875,55.66121794,55.66126692,55.66132434,55.661389205,55.66144555,55.66141339,55.661468365,55.661532485,55.66159399,55.66165429,55.661505195,55.662096835,55.6617923,55.662226165,55.661944765)) 

split_data_poly = lapply(unique(data$group), function(x) { 
    df = as.matrix(data[data$group == x, c("long", "lat")]) 
    ch = chull(df) # remove me if not wanted 
    df = df[ch, ] # remove me if not wanted 
    polys = Polygons(list(Polygon(df)), ID = x) 
    return(polys) 
    return(df) 
}) 

data_polys = SpatialPolygonsDataFrame(SpatialPolygons(split_data_poly), 
             data.frame(group = 1:10, colour = c("red", "blue"))) 

leaflet(data_polys) %>% 
    addTiles() %>% 
    addPolygons(color = ~colour) 
+0

これはすべての行であれば問題は解決しますが、2つ以上の点がある場合は、リーフレットでポリゴンを描画したいと思います。これは可能ですか? –

+0

もちろん、線ではなくポリゴンを作成するだけです。 - 上記を参照してください – zacdav

+0

最後の質問あなたはそれを取得します。ポリゴンを追加するとき、リーフレットはポリゴンを描画せず、むしろランダムに点を接続します。それも解決する方法はありますか? –

関連する問題