我正在从geojson文件加载多个点,并希望删除数据中存在的重复项(对于某些功能,尽管ID属性相同)。为了实现这一目标,我想了解ol.Feature
个对象与其他ol.Feature
对象的相等。
是否在ol.Feature对象上以某种方式定义了等式,还是我必须自己定义它?
答案 0 :(得分:4)
您应该遍历每个功能并获取其属性。 ID将始终不同,这就是为什么无法使用方法const { Component, PropTypes } = React;
class Result extends Component {
render() {
return (
<div>
{this.props.children}
</div>
);
}
}
class MyComponent extends Component {
render(){
const reducer = {
results: ['A', 'B', 'C', 'D', 'E']
};
const loading = false;
const hasResults = true;
if (loading){
return ( <div>loading</div>);
} else {
if (hasResults) {
return (
<div>hey
{reducer.results.map((result, i) => {
return <Result key={'credit-card-result-' + i}>{result}</Result>;
})}
</div>
);
} else {
return (
<div>no results found </div>
);
}
}
}
}
ReactDOM.render(
<MyComponent />,
document.getElementById('root')
);
(来自图层或来源)或方法getFeatureById
(来自单个要素)。
我创建了一个有效的示例,当您按下按钮时,该示例正在工作并删除重复的功能。
请注意,我们获取了属性名称和标记,我们将它们转换为JSON变量以便轻松比较它们,但您可以选择适合您需求的属性
getId
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({
features: features
});
var vectorLayer = new ol.layer.Vector({
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")
}
});
};
答案 1 :(得分:0)
具有完全相同属性的两个ol.Feature
对象将彼此不相等。
所以是的,您需要手动清除重复项。你说ids总是独一无二的,但其余时间可能是相同的。在这种情况下,您可以循环使用您的功能。对于每一个,获取所有属性的JSON字符串(id和几何除外)并比较新的特征集。
以下是你如何做到这一点(未经测试,但这可以给你一个想法):
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);
}
}
答案 2 :(得分: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;
}
对于几何相等,您可能需要检查(x&amp; y)坐标是否相同。这里还有一些注意事项:
例如: lineA:pointA-pointB 和 lineB:pointB-pointA
甚至是这样: polygonA:pointA-pointB-pointC-pointA 和 polygonB:pointB-pointC-pointA-pointB