Я рисую несколько линий (LineString) длиной 400 км. Средняя точка, кажется, не совсем там, где должна быть, но она близка (скажем, в 3 км). Похоже, LineString не рисуется геодезическим. Не могу найти ничего в документации, чтобы сказать в любом случае. Итак, вопрос: является ли линия LineString геодезической, и если нет, то как мне это сделать?
Является ли LineString в OpenLayers 6 нарисованной геодезической?
comment
Нет, если вам нужны геодезические линии, вам понадобится утилита, такая как arcGenerator, используемая в openlayers.org/en/latest/examples/flight-animation.html Если вы рисуете, вы можете стилизовать нарисованную линию, используя геометрию, рассчитанную с помощью arcGenerator stackoverflow.com/questions/56285745/
- person Mike   schedule 22.08.2020
Ответы (1)
Как показано в соответствующем вопросе: Нарисуйте большой круг линию на карте непосредственно в OpenLayers 5?, упомянутую в комментарии @Mike, вы можете стилизовать нарисованную линию так, чтобы она была геодезической, используя геометрию, рассчитанную с помощью arcGenerator (из arc.js):
new ol.style.Style({
geometry: function(feature) {
var projection = map.getView().getProjection();
var coordinates = feature.getGeometry().clone().transform(projection, 'EPSG:4326').getCoordinates();
var from = coordinates[0];
var to = coordinates[1];
var arcGenerator = new arc.GreatCircle({
x: from[0],
y: from[1]
}, {
x: to[0],
y: to[1]
});
var arcLine = arcGenerator.Arc(100, {
offset: 10
});
var coords = [];
arcLine.geometries.forEach(function(geom) {
coords.push(geom.coords);
});
var line = new ol.geom.MultiLineString(coords);
line.transform('EPSG:4326', projection);
return line;
},
stroke: new ol.style.Stroke({
width: 2,
color: 'blue'
})
});
// from https://stackoverflow.com/questions/56285745/draw-great-circle-line-on-the-map-directly-in-openlayers-5
var styleSimple2ptLine = new ol.style.Style({
geometry: function(feature) {
var projection = map.getView().getProjection();
var coordinates = feature.getGeometry().clone().transform(projection, 'EPSG:4326').getCoordinates();
var from = coordinates[0];
var to = coordinates[1];
var arcGenerator = new arc.GreatCircle({
x: from[0],
y: from[1]
}, {
x: to[0],
y: to[1]
});
var arcLine = arcGenerator.Arc(100, {
offset: 10
});
var coords = [];
arcLine.geometries.forEach(function(geom) {
coords.push(geom.coords);
});
var line = new ol.geom.MultiLineString(coords);
line.transform('EPSG:4326', projection);
return line;
},
stroke: new ol.style.Stroke({
width: 2,
color: 'blue'
})
});
var coordsSimple = [ol.proj.fromLonLat([121.74940748038463, 31.3038498266498]),
ol.proj.fromLonLat([139.793414, 35.599839])
];
const lineStr = new ol.Feature({
geometry: new ol.geom.LineString(coordsSimple)
});
const vectorSource = new ol.source.Vector({
features: [lineStr]
});
const vectorLayer = new ol.layer.Vector({
source: vectorSource,
style: styleSimple2ptLine
});
var raster = new ol.layer.Tile({
source: new ol.source.OSM()
});
var map = new ol.Map({
layers: [raster, vectorLayer],
target: 'map',
view: new ol.View({
center: [0, 0],
zoom: 2
})
});
map.getView().fit(vectorSource.getExtent(), {
padding: [50, 50, 50, 50]
});
html,
body {
height: 100%;
width: 100%;
padding: 0px;
margin: 0px;
}
.map {
height: 100%;
width: 100%;
}
<link rel="stylesheet" href="https://cdn.rawgit.com/openlayers/openlayers.github.io/master/en/v6.4.3/css/ol.css" type="text/css">
<script src="https://cdn.rawgit.com/openlayers/openlayers.github.io/master/en/v6.4.3/build/ol.js"></script>
<script src="https://api.mapbox.com/mapbox.js/plugins/arc.js/v0.1.0/arc.js"></script>
<div id="map" class="map"></div>
person
geocodezip
schedule
22.08.2020