2015-02-21 10 views
0

Я использую пакет leafletR (http://cran.r-project.org/web/packages/leafletR/index.html), чтобы сделать апплет веб-апплет листовки, но не удалось загрузить 2 набора функций на одну и ту же карту.Проблемы с загрузкой 2 файлов GeoJSON в веб-карту листовки в R с использованием пакета leafletR

Как я понимаю, функция sheetlet() будет принимать только файлы GeoJSON одного типа геометрии.

У меня поэтому есть 2 отдельных файла GeoJSON, один с MultiPolygons и другой с точками.

Я смог получить MultiPolygons, чтобы сделать как choropleth с этим кодом:

#Load LeafletR 
require(leafletR) 

#Create quantiles 
cuts <- round(quantile(UKpostcode_areas$data, probs = seq(0, 1, 0.20), na.rm = FALSE), 0) 
cuts[1] <- 0 #We don't want any negative values, so let's make the first cut zero 

#Fields to include in the popup 
popup.1 <- c("name", "data") 

#Graduated style based on an attribute 
sty.1 <- styleGrad(prop = "data", breaks=cuts, right=FALSE, style.par="col", style.val=rev(heat.colors(6)), leg="Data", lwd=1) 

#Create the map and load into browser 
map <- leaflet(data = "map/UKpostcode_areas.geojson", dest = "map", style = sty.1, title = "UKpostcode_areas_choropleth", base.map= "osm", incl.data=TRUE, popup = popup.1) 

Я также смог получить очки, чтобы сделать:

#Create new style and popup details for the 2nd layer 
sty.2 <- styleSingle(col = "white", fill = "#2b83ba", fill.alpha = 1, rad = 3) 
popup.2 <- c("name", "trust") 

#Let's take a look at the map of hospitals 
map2 <- leaflet(data="map/hospitals.geojson", dest = "map", style = sty.2, popup = popup.2, title = "hospitals", base.map = "osm", incl.data=TRUE, controls = "all") 
browseURL(map2) 

Однако, когда Я пытаюсь сделать как на одной и той же карте Листовка, он просто дает мне пустой экран:

#Now we can combine the 2 into 1 map, this is problematic, can't get it to work! 
map3 <- leaflet(data = list("map/UKpostcode_areas.geojson", "map/hospitals.geojson"), style = list(sty.1, sty.2), dest = "map", title = "index", base.map= "osm", incl.data=TRUE, controls = "all") 
browseURL(map) 

Я подозреваю, что есть что-то не так с последними парами строк кода. Но я не могу понять, что.

ответ

0

То, что я думаю (на самом деле, я никоим образом не знаком с R), заключается в том, что объединение этих двух файлов GeoJSON не будет работать, если они на самом деле являются FeatureCollections. FeatureCollection будет выглядеть примерно так:

{ 
    "type": "FeatureCollection", 
    "features": [{ 
     // Feature 
    }, { 
     // Another feature 
    }] 
} 

Теперь, если объединить два из них вы будете в конечном итоге с чем-то вроде этого: L.GeoJSON слой

[{ 
    "type": "FeatureCollection", 
    "features": [{ 
     // Feature 
    }, { 
     // Another feature 
    }] 
}, { 
    "type": "FeatureCollection", 
    "features": [{ 
     // Feature 
    }, { 
     // Another feature 
    }] 
}] 

листовка не будет принимать это. То, что вы хотите сделать, это объединить встроенные массивы элементов и вставить их в новый объект FeatureCollection или просто объединить два массива функций в один новый массив и использовать их. L.GeoJSON может использовать FeatureCollection или массив функций. Но это не займет целый ряд FeatureCollections, и я думаю, что вы сейчас это делаете.

В JS я бы сделать что-то вроде этого:

var collectionA = { //FeatureCollection }; 
var collectionB = { //FeatureCollection }; 

var features = collectionA.features.concat(collectionB.features); 

var collection = { 
    "type": "FeatureCollection", 
    "features": features 
} 

// Now you can use: 
new L.GeoJSON(features); 
// Or you can use: 
new L.GeoJSON(collection); 

Другой способ заключается в использовании addData метод L.GeoJSON но я не знаю, если это доступно для вас при использовании LeafletR, но в JS мы можем do:

var collectionA = { //FeatureCollection }; 
var collectionB = { //FeatureCollection }; 

var layer = new L.GeoJSON(); 

layer.addData(collectionA); 
layer.addData(collectionB); 

Надеюсь, что это поможет.

1

Я считаю, что LeafletR может обрабатывать только несколько слоев, когда для каждого слоя существует один стиль.

Пример из leaflet()documentation page:

# more than one data set 
park <- toGeoJSON(data=system.file(package="leafletR", "files", 
    "park_sk.zip"), dest=tempdir()) 
peak <- toGeoJSON(system.file(package="leafletR", "files", "peak_sk.kml"), 
    dest=tempdir()) # httr package required 
sty.1 <- styleSingle(col="green", fill="green") 
sty.2 <- styleSingle(col="brown", fill="brown", rad=3) 
map <- leaflet(data=list(park, peak), dest=tempdir(), 
    style=list(sty.1, sty.2)) 
browseURL(map) 

Это работает, как ожидалось, но если изменить sty.2 в мерную стиле, например:

sty.2 <- styleGrad(prop="Name", col="brown", fill="brown", style.par="rad", 
    style.val=c(1,10), breaks=breaks, right=TRUE, out=1) 

это дает тот же пустой экран вы описали (хотя он отлично работает, если peak - единственный слой).Я не уверен, насколько важно, чтобы ваша карта имела градуированный стиль, но если вы используете styleSingle(), оба слоя должны появиться.

Смежные вопросы