2014-11-05 7 views
0

Я хочу запросить Overpass Api, чтобы узнать расстояние специальных связей (железных дорог). Запрос в порядке, и возвращает мне все relation, way и node объектов Я заинтересован в примере Гамбурга:.Сцепление железнодорожных путей

[out:json];(rel(53.55224324163863, 10.006766589408304, 53.55314275836137, 10.008081410591696)["route"="train"];>;);out body; 

В Путепроводе, каждый relation объекта имеет элементы, определяющие это отношение. Для объектов way вы можете разрешить lat/lon своих атрибутов node и рассчитать расстояние для этого пути. Если вы суммируете все расстояния, это кажется разумным.

Однако, есть члены из этого relation типа node (большая часть времени, они имеют role «стоп»), которые, кажется, представляют правильный порядок остановки от этого relation. Но вместо того, чтобы быть в между членами, они примерно в конце. Если я попытаюсь взглянуть на стопы внутри пути, они не все присутствуют. Как я должен рассчитать расстояние между двумя отдельными остановками?

ответ

1

Существует, по-видимому, неправильное представление об отношениях. Элементы отношений необязательно должны быть отсортированы. Следовательно, вам, возможно, придется сортировать участников самостоятельно, если это вообще необходимо.

Вы можете взглянуть на JOSM, который имеет аккуратный алгоритм сортировки для различных типов отношений. Но я не думаю, что он может разместить участников с остановкой роли в правильном положении. Это не всегда возможно, потому что путь не обязательно должен быть разделен на каждом узле с ролью остановки. Это также означает, что один способ может содержать более одного узла с ролью остановки, что делает невозможным правильное сортировку элементов отношений. Если вы не выполните некоторую предварительную обработку для разделения друг на друга соответственно.

Для расчета расстояния между каждой остановкой кажется ненужным сортировка элементов. Просто следуйте по пути, итерации по всем узлам и проверьте каждый узел, если он имеет роль остановки в соответствующем соотношении. По достижении конца пути продолжайте с тем, который разделяет один и тот же узел в начале или в конце и который также является членом отношения.

+0

если способы не упорядочены, будет очень сложно перебирать их. Как я должен найти первого участника для начала итерации? –

+0

Первый (или последний) способ - тот, чей первый (или последний) узел не используется другим способом. Также обратите внимание, что последовательные пути могут иметь разные направления, т. Е. Последний узел пути может быть либо первым, либо * последним узлом последующего пути. Если у вас возникли проблемы с пониманием модели данных, вы можете взглянуть на данные карты напрямую с помощью одного из [редакторов] (https://wiki.openstreetmap.org/wiki/Editors#Top_three_editors). – scai

+0

мои последние попытки показывают, что вы не правы, узнав первого участника. Я трачу как 3 часа на отладку своего кода, только чтобы узнать, что иногда есть недостающие ссылки, а это значит, что нет соответствующего начального или конечного узла более чем одним способом ... –