Является ли LineString в OpenLayers 6 нарисованной геодезической?

Я рисую несколько линий (LineString) длиной 400 км. Средняя точка, кажется, не совсем там, где должна быть, но она близка (скажем, в 3 км). Похоже, LineString не рисуется геодезическим. Не могу найти ничего в документации, чтобы сказать в любом случае. Итак, вопрос: является ли линия LineString геодезической, и если нет, то как мне это сделать?


person Marc Hillman    schedule 22.08.2020    source источник
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