2016-09-29 17 views
2

У нас есть карта листов, которую мы пытаемся построить с использованием GeoJSON. Наши данные поступают в от живого потока, поэтому мы начинаем с инициализации в формате GeoJSON с пустыми данными:Как ссылаться на данные существующего объекта листовки GeoJSON?

var myLayer = L.geoJson([], { 
    style: function(feature) { 
    var color = getDataband(LATENCY_BANDS, feature.properties.latency).color; 

    return { 
     fillColor: color 
    }; 
    }, 

    pointToLayer: function(feature, latlng) { 
    return L.circleMarker(latlng, geojsonMarkerOptions); 
    }, 

    filter: function(feature, layer) { 
    var latency = feature.properties.latency; 

    for (var i = 0; i < ENABLED_LATENCY_BANDS.length; i++) { 
     if (ENABLED_LATENCY_BANDS[i].contains(latency)) { 
     return true; 
     } 
    } 

    return false; 
    } 
}); 

Затем мы добавим точек данных по одному, как сообщения поступают из живого потока по телефону:

var geojsonFeature = { 
    "type": "Feature", 
    "properties": { 
    "latency": sample.latency 
    }, 
    "geometry": { 
    "type": "Point", 
    "coordinates": [location.longitude, location.latitude] 
    } 
}; 

myLayer.addData(geojsonFeature); 

Однако наш фильтр динамически изменяется в зависимости от пользовательского ввода. Поэтому нам необходимо удалить все существующие данные и повторно добавить все данные на карту всякий раз, когда пользователь вводит изменения, чтобы новый фильтр применился ко всем существующим и новым данным. Мы пытались дозвониться следующее, когда вводимые пользователем изменения:

map.removeLayer(myLayer); 
    myLayer.addTo(map); 

Однако, когда myLayer повторно добавляется к карте, старые данные стираются и появляются только новые данные.

Похоже, мы должны повторно инициализировать объект myLayer, прежде чем мы позвоним myLayer.addTo(map), но мы не знаем, как повторно инициализировать myLayer с существующими характеристиками. Документация не объясняет, как ссылаться на данные объекта листовки GeoJSON.

Как мы ссылаемся на данные объекта листовки GeoJSON?

Спасибо.

+0

http://leafletjs.com/reference.html#layergroup-eachlayer – xmojmr

ответ

1

Опция filter имеет эффект только при создании экземпляра и при использовании .addData() способ. Кроме того, когда функция отфильтрована, она не просто «скрыта», а не записана в памяти (т. Е. Не входит в эту группу).

Странно, что ваши старые данные уничтожены, удалив группу и добавив ее обратно на карту, если вы изменили условия фильтра или нет.

В любом случае, вероятно, нет документации о том, как «ссылаться на данные объекта Leolet GeoJSON» в том смысле, в котором вы пытаетесь достичь, потому что это зависит от реализации.

В вашем случае вам нужно будет скопировать ваши функции в скрытой группе/массиве, чтобы при изменении условий фильтра вы могли переоценить эти функции с помощью нового фильтра.

Например, вы могли бы сделать что-то вроде:

var accumulatedFeatures = []; 

// When data arrives 
accumulatedFeatures.push(geojsonFeature); 
myLayer.addData(geojsonFeature); 

// When filter conditions change 
myLayer.clearLayers(); // http://leafletjs.com/reference-1.0.0.html#layergroup-clearlayers 
myLayer.addData(accumulatedFeatures); // Re-evaluate all data through new filter 
+0

Я надеялся, что не нужно хранить отдельный список за пределами GeoJSON, но это работает. Благодаря! – carmenism

+0

Привет. Это в основном работает, но имеет непредвиденные последствия. Я больше не могу просматривать всплывающие окна для функций. Если я нажму на всплывающее окно, оно будет отображаться на короткое время и отклонено. Это не слишком удивительно, потому что в любой момент любая функция может обновляться или удаляться, что вызывает вызовы 'clearLayers' и' addData'. Есть идеи? – carmenism

+0

Привет, не видя своего кода, трудно сказать. Почему вы вызываете четкие слои при поступлении данных, а не только при изменении фильтра? Вероятно, лучше подойдет в новом вопросе. – ghybs