#xml #openstreetmap #sumo
Вопрос:
У меня есть файл osm.net.xml
, который взят с реальной карты. Файл содержит форму (координаты X/Y) как для краев, так и для полос. Я выполнил приведенную ниже команду для преобразования/создания файлов, включающих географические координаты:
netconvert --sumo-net-file osm.net.xml --plain-output-prefix plain --proj.plain-geo
Входной файл выглядит следующим образом (он включает координаты x/y как для edges
и lanes
):
Я получаю выходные файлы в виде:
Я не вижу никакого выходного файла, содержащего географические координаты полос движения. В plain.edg.xml
, есть только информация о форме для краев, но не для полос:
Может ли кто-нибудь сказать мне, как также получить географические координаты lane
s???
Ответ №1:
В настоящее время это невозможно сделать. Вы могли бы только попытаться проанализировать сеть с помощью скрипта python и выполнить гео-преобразование самостоятельно, см. Примеры здесь: https://sumo.dlr.de/docs/Tools/Sumolib.html#import_a_network_and_retrieve_nodes_and_edges Вероятно, это сведется к чему-то вроде:
import sumolib
net = sumolib.net.readNet('myNet.net.xml')
laneShape = net.getLane('myLaneID').getShape()
for x, y in laneShape:
lon, lat = net.convertXY2LonLat(x,y)
Комментарии:
1. Спасибо @Micheal . Это полезно. Это здорово. Такое преобразование занимает много времени. Я спрашиваю, является ли это хорошим/эффективным способом преобразования X/Y в lon/lat на работающем сервере приложений python. Или лучше преобразовать x/y в lon/lat все сразу до подготовки приложения?
2. Я не уверен, но это не должно быть слишком медленно, и я бы просто попробовал. Вы все еще можете оптимизировать позже.
Ответ №2:
Я сделал что — то подобное, чтобы прочитать весь XML
файл целиком. Преобразовал каждое из значений пары x,y в долготы, широты следующим образом:
# Read the XML file
tree = et.parse(PATH_TO_XML_FILE)
file = tree.getroot()
geoCoordinatesString = ""
# Iterate edge nodes in the file
for edge in file.iter('edge'):
# Iterate lanes of the current edge-node
for lane in edge.iter('lane'):
laneID = lane.get("id")
laneShape = lane.get("shape")
laneCoordinates = laneShape.split()
geoCoordinatesString = ""
# Iterate each coordinate in the shape of lane
for coordinate in laneCoordinates:
geoCoordinates = np.array(coordinate.split(","))
geoCoordinates = geoCoordinates.astype(float)
geoCoordinateLon, geoCoordinateLat = net.convertXY2LonLat(geoCoordinates[0],geoCoordinates[1])
geoCoordinatesString = "{:}{:},{:} ".format(
geoCoordinatesString, str(geoCoordinateLon), str(geoCoordinateLat)
)
# Display each lane's shape geo-coordinates
geoCoordinatesString = geoCoordinatesString.strip()
print ("- {:}".format(geoCoordinatesString))
Этот вывод позволил мне сохранить информацию о полосе движения, связанную с идентификатором полосы движения.