Я пытаюсь получить дорожную сеть в районе, ориентируясь на меньшие (1-2 полосы) дороги, используя osm и node. Используя OSM overpass API, я использовал следующий запрос:
const roadsOverpassQuery = `
[out:json];
(way[lanes=1](${bbox}); way[lanes=2](${bbox}); );
out;
`;
Я смог получить многие дороги в ограничивающей рамке. Я заметил, что эти дороги при преобразовании в объекты geojson имеют узлы
{
"_id": {
"$oid": "643c3fd883215e96ece3be0a"
{,
"type": "way",
"id": 5053100,
"nodes": [
33979706,
33979705
],
"tags": {
"adot_name": "Tucson-Benson Highway",
"bicycle": "yes",
"hgv": "designated",
"highway": "motorway",
"lanes": "2",
"maxspeed": "75 mph",
"old_ref": "US 80 (old AZ 86)",
"oneway": "yes",
"ref": "I 10"
}
Я передал их в overpass API, используя
const overpassQuery = `
[out:json];
(
${nodeIds.map(id => `node(${id})`).join(';')};
);
out;
`;
Они как geojson выглядят так:
"features": [
{
"type": "Feature",
"id": "node/33979705",
"properties": {
"highway": "motorway_junction",
"ref": "292",
"id": "node/33979705"
},
"geometry": {
"type": "Point",
"coordinates": [
-110.5123291,
31.9766748
]
}
},
{
"type": "Feature",
"id": "node/33979706",
"properties": {
"id": "node/33979706"
},
"geometry": {
"type": "Point",
"coordinates": [
-110.5141282,
31.9773252
]
}
}
]
Я заметил, что тип геометрии — точка. В других местах я видел дороги, состоящие из Linestrings:
{
"type": "Feature",
"geometry": {
"type": "LineString",
"coordinates": [
[-122.483696, 37.833818],
[-122.483482, 37.833174],
[-122.483396, 37.8327],
[-122.483568, 37.832056],
[-122.48404, 37.831141],
[-122.48404, 37.830497],
[-122.483482, 37.82992],
[-122.483568, 37.829548],
[-122.48507, 37.828802],
[-122.4861, 37.828387],
[-122.486958, 37.828138],
[-122.487001, 37.827885]
]
},
"properties": {
"name": "Example LineString"
}
}
Как получить координаты Linestring интересующих дорог?
Чем вы, это выглядит интересно. Не могли бы вы написать это как ответ?



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Согласно этому комментарию на справочном форуме OSM, вы можете использовать геометрический оператор в операторе преобразования вместе с geom выходным аргументом.
Используя идентификатор пути в вашем вопросе, запрос будет выглядеть так:
[out:json];
way(5053100);
convert item ::=::,::geom=geom(),_osm_type=type();
out geom;
Вот пример исполняемого фрагмента:
function fetchOverpassJson(query) {
return fetch("https://overpass-api.de/api/interpreter", {
body: new URLSearchParams([["data", query]]),
method: "POST",
}).then(res => res.json());
}
const query = `
[out:json];
way(5053100);
convert item ::=::,::geom=geom(),_osm_type=type();
out geom;
`;
fetchOverpassJson(query).then(console.info);А вот статический вывод кода выше на момент выполнения запроса:
{
"version": 0.6,
"generator": "Overpass API 0.7.60 f4c14d41",
"osm3s": {
"timestamp_osm_base": "2023-04-23T14:58:09Z",
"copyright": "The data included in this document is from www.openstreetmap.org. The data is made available under ODbL."
},
"elements": [
{
"type": "item",
"id": 1,
"geometry": {
"type": "LineString",
"coordinates": [
[
-110.5141282,
31.9773252
],
[
-110.5123291,
31.9766748
]
]
},
"tags": {
"adot_name": "Tucson-Benson Highway",
"bicycle": "yes",
"hgv": "designated",
"highway": "motorway",
"lanes": "2",
"maxspeed": "75 mph",
"old_ref": "US 80 (old AZ 86)",
"oneway": "yes",
"ref": "I 10",
"_osm_type": "way"
}
}
]
}
Согласно этого комментария , вы можете использовать оператор геометрии в операторе преобразования. Используя идентификатор пути в вашем вопросе, запрос будет выглядеть так:
[out:json]; way(5053100); convert item ::=::,::geom=geom(),_osm_type=type(); out geom;Вот пример. Это относится к вашему вопросу? Если да, я могу написать это как ответ — если нет, то что я упускаю?