2017-01-17 4 views
4

Ich lade mehrere Punkte aus einer Geojson-Datei und möchte Duplikate löschen, die in den Daten vorhanden sind (Bei einigen Merkmalen sind die Eigenschaften trotz der ID gleich). Um dieses Ziel zu erreichen, möchte ich herausfinden, ob ol.Feature Objekte gleich zu anderen ol.Feature Objekten sind.Einfachster Weg zur Überprüfung der OL3-Merkmalsgleichheit

Ist die Gleichheit auf ol.Feature Objekten definiert oder muss ich sie selbst definieren?

Antwort

0

ich denke, es eine Menge auf die Perspektive und Anwendungsfall abhängig zu sagen, wenn Merkmale gleich sind, weshalb es für den Benutzer Gleichheit definieren gelassen wird. Einige mögen sagen, dass die Merkmale gleich sind, wenn sie die (exakte) gleiche Geometrie teilen (1). Andere könnten sagen, dass Merkmale die gleichen Eigenschaften haben müssen (2) oder sogar beide (3).

Um Eigenschaften Gleichheit zu überprüfen Ich würde empfehlen, die Attribute zu definieren, die für Ihre Definition der Gleichheit wichtig sind. Dann können Sie Code ähnlich wie diese verwenden, um zu überprüfen, ob 2 ol.Feature Objekte gleich sind:

// 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; 
} 

Für Geometrie Gleichheit Sie vielleicht zu prüfen, ob die (x & y) Koordinaten gleich sind. Hier einige weitere Überlegungen:

  • 2 Geometrien können gleich aussehen, aber die Koordinaten sind nicht in der gleichen Reihenfolge:

Z.B.: linea: pointA-pointB und lineB: pointB-pointA

oder sogar dies: Polygona: pointA-pointB-pointC-pointA und polygonB: pointB-pointC-pointA-pointB

  • Für einige Merkmale könnte es sinnvoll sein zu sagen, dass die Geometrie so nahe bei einer anderen liegt, dass sie wahrscheinlich das gleiche Merkmal darstellt ... (zB (kleine) Messfehler oder Gleitkomma-Ungenauigkeiten).
+0

Schöne Gedanken. Die Geometrieüberlegungen haben mir bei den LineString-Funktionen sehr geholfen! – Bel

0

Zwei ol.Feature Objekt mit den exakt gleichen Eigenschaften wird nicht gleich einem anderen sein.

Also ja, Sie müssen die Duplikate manuell löschen. Du sagst, dass die IDs immer einzigartig sind, aber der Rest kann manchmal derselbe sein. In diesem Fall könnten Sie Ihre Funktionen einbinden. Erhalte für jede eine JSON-Zeichenfolge aller Eigenschaften (mit Ausnahme der ID und der Geometrie) und vergleiche das mit einer neuen Sammlung von Features.

Hier ist, wie Sie dies tun könnte (nicht getestet, aber das könnte Ihnen eine Idee geben):

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

Sie sollten jede Funktion eine Schleife durch und seine Eigenschaften bekommen. Die ID wird immer unterschiedlich sein, und deshalb ist es nicht möglich, die Methode getFeatureById (von der Ebene oder der Quelle) oder die Methode getId (von einer einzigen Funktion) zu verwenden.

Ich habe ein lebendes Beispiel erstellt, das funktioniert und entfernt die duplizierten Funktionen, wenn Sie die Taste drücken.

Beachten Sie, dass wir bekommen die Eigenschaften Namen und Tag und wir sie in eine JSON Variable wandeln sie leicht zu vergleichen, aber Sie können die Eigenschaften auswählen, die Ihren Bedürfnissen passen.

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>

Verwandte Themen