Да, это можно сделать с помощью Turf, но Turf работает только с EPSG: 4326 координат, и что перекрытия в EPSG: 4326 не обязательно будут перекрываться при отображении в EPSG: 3857 и наоборот, например [[0,50], [5,55], [10,60]] не совсем прямая линия при преобразовании в EPSG: 3857, тогда как [[0,50], [10,60]].Преобразования также вводят очень небольшие различия округления.Несмотря на очень маленькую разницу, любое различие прекратит обнаружение перекрытий (а использование параметра допуска Turf для км может дать ложные срабатывания).Этот пример выполняет дополнительные итерации и добавляет дополнительный компонент в MultiLineString для проверки пересечения между вершинами длинных отрезков.После округления до 12 мест в EPSG обнаруживается перекрытие: с 4326 (с реальными дробными значениями, которые могут даже не работать), но если вы увеличите масштаб достаточно, вы увидите, что это параллельная линия в EPSG: 3857.Что действительно необходимо, так это функция, основанная на источнике Turf lineOverlap, которая будет работать с любыми координатами и обрабатывать допуски в мм, соответствующие этим координатам.
var transformR = function(coordinates, output, dimensions) {
var dims = dimensions || 2;
for (var i=0; i<coordinates.length; i+=dims) {
coordinates[i] = Math.round(coordinates[i]*1e12)/1e12;
coordinates[i+1] = Math.round(coordinates[i+1]*1e12)/1e12;
}
return coordinates;
}
var style = function(feature) {
switch(feature.getGeometry().getType()) {
case 'MultiLineString':
var increment = 2;
var styles = [
new ol.style.Style({
stroke: new ol.style.Stroke({
color: 'green',
width: increment
})
})
];
var overlaps = [];
var format = new ol.format.GeoJSON();
var geometry = feature.getGeometry().clone().transform(map.getView().getProjection(), 'EPSG:4326');
geometry.applyTransform(transformR); // round transformed coordinates
var linestrings = geometry.getLineStrings();
for (var i=0; i<linestrings.length-1; i++) {
for (var j=i+1; j<linestrings.length; j++) {
var line1 = format.writeFeatureObject(new ol.Feature(linestrings[i]));
var line2 = format.writeFeatureObject(new ol.Feature(linestrings[j]));
var overlapping = turf.lineOverlap(line1, line2).features;
overlapping.forEach(function(overlap){ overlaps.push(overlap.geometry.coordinates); });
}
}
overlaps.forEach(function(overlap){
var width = increment;
var line = turf.lineString(overlap);
for (var i=0; i<linestrings.length; i++) {
var line1 = format.writeFeatureObject(new ol.Feature(linestrings[i]));
var overlapping = turf.lineOverlap(line, line1).features;
if (overlapping.length > 0 && JSON.stringify(overlapping[0].geometry.coordinates) == JSON.stringify(overlap)) {
width += increment;
}
}
styles.push(
new ol.style.Style({
geometry: new ol.geom.LineString(overlap).transform('EPSG:4326', map.getView().getProjection()),
stroke: new ol.style.Stroke({
color: 'green',
width: width
})
})
);
});
return styles;
}
}
var multiline = new ol.Feature(new ol.geom.MultiLineString([
[[6, 14], [2, 6]],
[[3, 8], [4, 10], [5, 12]],
[[2, 4], [3, 8], [4, 10]]
]));
var source = new ol.source.Vector();
var map = new ol.Map({
layers: [
new ol.layer.Vector({
source: source,
style: style
})
],
target: 'map',
view: new ol.View()
});
multiline.getGeometry().transform('EPSG:4326', map.getView().getProjection());
source.addFeature(multiline);
map.getView().fit(multiline.getGeometry());
<link href="https://cdn.rawgit.com/openlayers/openlayers.github.io/master/en/v5.3.0/css/ol.css" rel="stylesheet" />
<script src="https://cdn.rawgit.com/openlayers/openlayers.github.io/master/en/v5.3.0/build/ol.js"></script>
<script src="https://npmcdn.com/@turf/turf@5.1.6/turf.min.js"></script>
<div id="map" class="map"></div>