2017-01-17 3 views
4

Я загружаю несколько точек из файла geojson и хочу удалить дубликаты, которые существуют в данных (для некоторых функций свойства равны, несмотря на ID). Для достижения этой цели, я хочу узнать, ol.Feature Объектов равным другим ol.Feature объектов.Самый простой способ проверить соответствие функции OL3

Является ли равенство каким-то образом определённым по объектам ol.Feature, или я должен определить его самостоятельно?

ответ

0

Я думаю, что это во многом зависит от точки зрения и прецедента сказать, когда функции равны, поэтому он остается пользователю определить равенство. Некоторые могут сказать, что функции равны, если они разделяют (точную) ту же геометрию (1). Другие могут сказать, что функции должны иметь те же свойства (2) или даже оба (3).

Для проверки свойств равенства Я бы рекомендовал определить атрибуты, имеющие значение для вашего определения равенства. Затем вы можете использовать код, подобный этому, чтобы проверить, если 2 ol.Feature объекты равны:

// Define your important properties  
var mySelectedProperties = ["importantProperty", "anotherImportantProperty", "propertyX"]; 

// Check for property equality between two ol.Feature objects 
function areEqual(featureA, featureB){ 
    var equal = true; 
    for(let property of mySelectedProperties){ 
     if(featureA.get(property) != featureB.get(property)){ 
      equal = false;   
      return equal ; 
     } 
    } 
    return equal; 
} 

Для геометрии равенства вы можете захотеть, чтобы проверить, если (х & у) координаты совпадают. Вот еще некоторые соображения:

  • 2 геометрий может выглядеть одинаково, но координаты не в том же порядке:

Э.Г.: Linea: точка А-pointB и lineB: pointB-точка А

или даже это: polygonA: точка А-pointB-pointC-точка А и polygonB: pointB-pointC-точка А-pointB

  • Для некоторых функций может иметь смысл сказать, что геометрия настолько близка к другой, что она, вероятно, представляет одну и ту же функцию ... (например, (небольшие) ошибки измерения или неточности с плавающей запятой).
+0

Приятные мысли. Геометрические соображения очень помогли мне с функциями LineString! – Bel

0

Два объекта ol.Feature с такими же свойствами не будут одинаковыми.

Итак, да, вам необходимо очистить дубликаты вручную. Вы говорите, что идентификаторы всегда уникальны, но остальное время может быть одинаковым. В этом случае вы можете использовать свои функции. Для каждого из них получите строку JSON всех свойств (за исключением id и geometry) и сравните ее с новым набором функций.

Вот как вы могли бы сделать это (непроверенное, но это может дать вам идею):

var uniqueFeatures = []; 
var feature; 
var properties; 
var json; 
var jsons = []; 
for (var i = 0, ii = features.length; i < ii; i++) { 
    feature = features[0]; 

    // Stringify the properties of the feature 
    properties = feature.getProperties(); 
    var props4json; 
    for (var key in properties) { 
    if (key !== 'id' && key !== 'geometry') { 
     props4json[key] = properties[key]; 
    } 
    } 
    json = JSON.stringify(props4json); 

    // Check if the stringified properties exist... 
    // if not, we have a new unique feature. 
    if (jsons.indexOf(json) === -1) { 
    jsons.push(json); 
    uniqueFeatures(feature); 
    } 
} 
4

Вы должны перебрать каждую функцию и получить его свойство. Идентификатор всегда будет отличаться, и поэтому невозможно использовать метод getFeatureById (со слоем или источником) или метод getId (из одной функции).

Я создал живой пример, который работает и удаляет дублированные функции, когда вы нажимаете кнопку.

Обратите внимание, что мы получаем свойство имени и тега и мы преобразующие их в переменную JSON легко сравнить их, но вы можете выбрать свойства, которые соответствуют вашим потребностям.

var features = []; 
 
var point1 = ol.proj.transform([-50, 4.678], 'EPSG:4326', 'EPSG:3857'); 
 
var point2 = ol.proj.transform([20, 4.678], 'EPSG:4326', 'EPSG:3857'); 
 

 
var feature1 = new ol.Feature({ 
 
    geometry: new ol.geom.Point(point1), 
 
    name: "First", 
 
    tag: "TAG" 
 
}); 
 
var feature2 = new ol.Feature({ 
 
    geometry: new ol.geom.Point(point2), 
 
    name: "Second", 
 
    tag: "TAG" 
 
}); 
 

 
features.push(feature1); 
 
features.push(feature2); 
 
features.push(new ol.Feature({ 
 
    geometry: new ol.geom.Point(point1), 
 
    name: "First", 
 
    tag: "TAG" 
 
})); 
 

 
var vectorSource = new ol.source.Vector({ 
 
\t features: features 
 
}); 
 

 
var vectorLayer = new ol.layer.Vector({ 
 
\t source: vectorSource 
 
}); 
 

 
var map = new ol.Map({ 
 
    layers: [ 
 
    new ol.layer.Tile({ 
 
     source: new ol.source.OSM() 
 
    }), 
 
    vectorLayer 
 
    ], 
 
    target: 'map', 
 
    view: new ol.View({ 
 
    center: [0, 0], 
 
    zoom: 2 
 
    }) 
 
}); 
 

 
document.getElementById("btn").onclick = function(){ 
 
    var totalProperties = []; 
 
    vectorSource.getFeatures().forEach(function(feature){ 
 
    var propertiesThis = {}, 
 
     p = feature.getProperties(); 
 

 
    for (var i in p) { 
 
     if (i === 'name' || i === 'tag') { 
 
     propertiesThis[i] = p[i]; 
 
     } 
 
    } 
 
    var jsonProperties = JSON.stringify(propertiesThis); 
 
    
 
    if (totalProperties.indexOf(jsonProperties) === -1) { 
 
     totalProperties.push(jsonProperties); 
 
    } else { 
 
     vectorSource.removeFeature(feature); 
 
     console.log(propertiesThis['name'] + " feature removed") 
 
    } 
 
    }); 
 
};
<link href="https://openlayers.org/en/v3.20.1/css/ol.css" rel="stylesheet"/> 
 
<script src="https://openlayers.org/en/v3.20.1/build/ol.js"></script> 
 
<div id="map" class="map" tabindex="0"></div> 
 

 
<button id="btn">Remove duplicates</button>

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