前言与科普 最近在做户外相关的项目,需要详细记录经纬度,并且要求使用大地2000的经纬度标准。
不同标准、或者说参考系坐标,同一个经纬度在地图上的实际位置是不同的。
比如说,我们在高德地图上指定一下广州塔的地铁站:https://www.amap.com/?p=BV10015731,23.106483,113.323464
从链接就能看出来,经纬度为23.106483,113.323464。
然后上百度地图,直接搜索这个经纬度,会发现位置飘到了其他地方。
这是因为百度地图使用的经纬度坐标系与高德地图的不一样。
再用一下我安装的奥维地图,一样输入这个经纬度,指出来的又是另一个位置了。
因为项目要求使用大地2000,也就是CGCS2000来标注点位经纬度,因此才需要使用奥维地图这个一般人都没听过的软件来标注。
奥维地图可以修改地图使用的坐标系,不过奥维地图里要查看CGCS2000坐标系的经纬度只能通过导出的时候切换。
然而导出文本类文件需要付费:
但值得注意的是,导出ovkml格式的话,是免费的,这个格式的文件本质是用来导入地图标点的,与默认的ovobj格式一样。
但是有个不同的点在于ovkml是很简单的修改自kml格式,可以被文本编辑工具打开:
注:如果用记事本打开,会显示乱码,但只要把文件后缀从ovkml改成kml,就可以用记事本打开了。
眼尖的话,就能发现这一段内容里就是经纬度的值了。
1 <coordinates>113.31762046,23.10885035,0</coordinates>
解决方案 使用python遍历文件内的点位名称与经纬度,生成excel表格文档。
脚本内容 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 import xml.etree.ElementTree as ET import pandas as pd import os def extract_elements(file_path): try: # 解析XML文件 tree = ET.parse(file_path) root = tree.getroot() # 准备存储数据的列表 data = [] # 尝试不同的XPath来查找Placemark元素 placemarks = root.findall('.//Placemark') or root.findall('.//{*}Placemark') print(f"找到 {len(placemarks)} 个Placemark元素") for placemark in placemarks: name = placemark.find('name') or placemark.find('.//{*}name') coordinates = placemark.find('.//coordinates') or placemark.find('.//{*}coordinates') if name is not None and coordinates is not None: coords = coordinates.text.strip().split(',') if len(coords) >= 2: data.append({ 'Name': name.text, 'Longitude': coords[0], 'Latitude': coords[1] }) print(f"提取到点位: {name.text}") else: print(f"警告: 坐标格式不正确 - {coordinates.text}") else: print("警告: 未找到name或coordinates元素") # 创建DataFrame df = pd.DataFrame(data) # 生成与输入文件同名的Excel文件名 input_filename = os.path.splitext(os.path.basename(file_path))[0] output_filename = f"{input_filename}.xlsx" output_path = os.path.join(os.path.dirname(file_path), output_filename) # 保存为Excel文件 df.to_excel(output_path, index=False) print(f"数据已提取并保存到 {output_path}") print(f"共提取了 {len(data)} 条记录") except ET.ParseError as e: print(f"解析XML文件时出错: {e}") except Exception as e: print(f"发生错误: {e}") # 主程序 if __name__ == "__main__": file_path = input("请输入OVKML文件的路径: ") extract_elements(file_path)
使用方法
浏览器搜索python,去官网下载并安装python;
安装过程中选择”Add Python to PATH”选项。
打开CMD/power shell命令行窗口,输入以下命令安装所需的python插件:
python -m pip install -i https://pypi.tuna.tsinghua.edu.cn/simple lxml pandas openpyxl
自己选个位置新建一个文件,用文本编辑软件打开,粘贴上面的脚本代码,保存,修改文件名为extractor.py或其他以.py结尾的自定义名称。
输入python 文件所在目录\extractor.py,以运行脚本
例如:文件存放在D盘目录,则输入python D:\extractor.py
按回车运行脚本后,等待提示“请输入OVKML文件的路径:”再输入ovkml文件所在位置以及文件名。
例如:D:\magiku\Desktop\广州塔地铁.ovkml