jiexijie

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

处理osm数据

1.使用网站进行处理

获得地图数据

通过https://www.openstreetmap.org/ 搜寻想要的地图,选择想要的区域,导出osm格式文件

将导出的文件转化为csv格式

将导出的文件上传到MyGeodata Cloud - GIS Data Warehouse, Converter, Maps网站上面,将文件转换为csv格式

对数据进行处理

导出来的wkt文件,实际显示的是csv格式的文件,但是导出的文件中的数据,不满足我们对the One 模拟器导入地图数据的需求

我们实际需要的只有第一列数据(除第一行的数据),所有我们需要把所有数据给进行处理,并且为了满足使用需求,还需将POLYGON中的数据进行放大,放大到原来的100000倍

我个人对文件的是使用python脚本进行实现的,以下是实现的代码

import pandas as pd
import os
import re
import shutil

def process_files(directory):
    for filename in os.listdir(directory):
        if filename.endswith(".csv"):  # 只处理.csv文件
            with open(os.path.join(directory, filename), 'r+') as file:
                content = file.read()
                content = content.replace('"', '')  # 删除所有引号
                file.seek(0)  # 将文件指针移回文件开头
                file.write(content)  # 覆盖原文件
                file.truncate()  # 删除原文件中未覆盖的部分

def transori(directory):
    for filename in os.listdir(directory):
        if filename.endswith('.csv'):
            file_path = os.path.join(directory, filename)
            df = pd.read_csv(file_path, skiprows=[0])
            df = df[df.columns[0]].to_frame()
            df.to_csv(file_path, index=False, header=False)

def transwkt(directory):
    for dirpath, dirnames, filenames in os.walk(directory):
        for filename in filenames:
            if filename.endswith('.csv'):
                base = os.path.splitext(filename)[0]
                shutil.move(os.path.join(dirpath, filename), os.path.join(dirpath, base + '.wkt'))

def trans100000(directory):
    files = [f for f in os.listdir(directory) if f.endswith('.wkt')]
    for file in files:
        with open(os.path.join(directory, file), 'r') as f:
            data = f.read()
        coordinates = re.findall(r'(\d+\.\d+ \d+\.\d+)', data)
        mapping = {}
        for coordinate in coordinates:
            x, y = map(float, coordinate.split())
            mapping[coordinate] = f"{x * 100000} {y * 100000}"
        for original, new in mapping.items():
            data = data.replace(original, new)
        with open(os.path.join(directory, file), 'w') as f:
            f.write(data)

def out_put(directory):
    output_list = []
    for i, filename in enumerate(os.listdir(directory), start=1):
        if filename.endswith('.wkt'):
            filepath = os.path.join(directory, filename)
            output_str = f'MapBasedMovement.mapFile{i} = {filepath}'
            output_list.append(output_str)
    for line in output_list:
        print(line)

# 使用函数
#directory 设置为你存放数据文件的目录
directory = '../data/mygeodata'
transori(directory)
process_files(directory)

transwkt(directory)
trans100000(directory)
out_put(directory)

2.使用osm2wkt进行处理

利用osm2wkt对导出的osm进行处理

下载地址(https://github.com/julianofischer/osm2wkt)

用之前的方法可能处理完数据后会存在部分点未连通的情况,需要自己手动添加

但是用此软件可以对其数据的点进行,不连通的街道进行修复或删除,但是可能删除许多数据。

操作代码

java -jar ./osm2wkt.jar map.osm

把你的osm文件放在 工具的文件夹下

总结

以上两种方法均能处理数据,但是第二种方法对数据的处理只能得到一个wkt文件,对the one 中限制车辆等事务的运行路线不方便,不能很好的模拟真实情况,第一种可以得到公路这种数据,不同的文件包含不同的路线

posted on 2024-07-09 11:01  意贯一  阅读(3)  评论(0编辑  收藏  举报