Нарисуйте свою линию, затем сериализуйте линию нарисованной линии в GeoJSON (используя ol.format.GeoJSON
, затем используйте библиотеку Turf along
, функцию и затем повторно используйте точку, возвращенную из этой функции Turf, чтобы добавить ее в OpenLayers
// GeoJSON sample line
var geojson = {
"type": "Feature",
"properties": {},
"geometry": {
"type": "LineString",
"coordinates": [
[
0.142822265625,
48.03769224746972
],
[
-0.230712890625,
47.73562905149295
],
[
-0.3131103515625,
47.55428670127958
],
[
-0.98876953125,
47.42065432071318
],
[
-1.6149902343749998,
47.21956811231547
],
[
-1.1370849609375,
46.558860303117164
],
[
-0.340576171875,
46.34692761055676
],
[
-0.6756591796875,
45.78284835197676
],
[
-0.494384765625,
45.10454630976873
],
[
-0.5877685546875,
44.78183504339988
]
]
}
};
// Convert GeoJSON feature line to OpenLayers feature
var lineFeature = (new ol.format.GeoJSON()).readFeature(geojson);
// Convert OpenLayers line feature to GeoJSON feature, you may want later
// to change reproject coordinates to display it on the map
var geojsonFromLineFeature = (new ol.format.GeoJSON()).writeFeature(lineFeature);
// Calculate point position 85 miles away from the point
// coordinates beginning along the line
var pointFrom85Miles = turf.along(line1, 85, {units: 'miles'});
// Convert GeoJSON point to OpenLayers point feature
var pointFrom85MilesFeature = (new ol.format.GeoJSON()).write(pointFrom85Miles);
Я пытался использовать OpenLayers getCoordinateAtM
, но результат действительно не соответствовал Turf.
Ниже я сделал расчет длины для линии GeoJSON, и они слишком разные, поэтому интерполяция с getCoordinateAtM
не лучше ... (возможно, потому что она работает на проецируемой плоскости)
// Units are in degrees
feature.getGeometry().getLength()
// Return 5.359842138525585
// Units are in degrees
turf.length(geojson, {units: 'degrees'});
// Return 4.477214098875635