探险家GPS是麦哲伦公司出品的一款GPS,它具有记录航迹、兴趣点、计算面积等多种功能。Googleearth是目前最流行的全球地理信息共享软件。我们在使用中,经常会需要将探险家GPS里面记录的兴趣点导入到Googleearth里进行标注。而两者的兴趣点文件格式不兼容。开始的时候我们只能手工输入经纬度坐标,效率很低。后来经过分析两者文件格式之后,找到一些规律。
将两者格式进行转换,主要涉及到字符串操作。我们采用了当前国外比较流行的python脚本语言。该语言是开源软件,完全免费下载(http://www.python.org)。它有强大的正则表达式功能,对字符串处理能力很强。
探险家GPS兴趣点格式如下:
$PMGNWPL,4145.189,N,12328.002,E,0000049,M,富民桥,,a*66
$PMGNCMD,END*3D
可以看出,这个格式相对比较简单。我们主要是提取出经纬度、高程和名称,其他信息可以忽略。
Googleearth兴趣点格式如下,它是一种XML语言格式:
<?xmlversion="1.0"encoding="UTF-8"?>
<kmlxmlns="http://earth.google.com/kml/2.2">
<Document>
<Placemark><name>富民桥</name>
<Point><coordinates>123.4667,41.75315,28.002</coordinates></Point></Placemark>
</Document>
</kml>
我们看出来,两者除了一些额外信息,最大的区别是,经纬度表示方法不同(斜体表示)。探险家GPS里的格式为“纬度度数纬度分数”“经度度数经度分数”并且分数用十进制小数点表示。Googleearth里表示为“经度”“纬度”直接用度数十进制小数点表示,这个是我们转换的重点。
#导入相应库
importre
#打开探险家GPS文件,这里假设文件名为c:xinqudian.upt
inf=open('c:\xinqudian.upt','r')
#创建Googleearth兴趣点文件,这里假设文件名为c:xinqudian.kml
outf=open('c:\xinqudian.kml','w')
#设置探险家格式正则表达式
#可能由于排版变化,下面语句应为一整行,
p=re.compile(r'$PMGNWPL,(dd)(dd.ddd),(N),(ddd)(dd.ddd),(E),(ddddddd),(M),(.*?),(.*?),.*')
#写入Goolge兴趣点文件头信息
s="""<?xmlversion="1.0"encoding="UTF-8"?>
<kmlxmlns="http://earth.google.com/kml/2.2">
<Document>n<name>"""+"mypoi"+"""</name>n"""
#循环取得探险家GPS每个兴趣点坐标。注意Python循环语句里,循环体要求缩进,空白不能省略。
forlineininf:
m=p.match(line)
ifm:
#获得纬度,并将分转换为十进制度
lat=float(m.group(1))+float(m.group(2))/60
#获得经度,并将分转换为十进制度
longt=float(m.group(4))+float(m.group(5))/60
#获得高程信息
height=float(m.group(7))
poi_name=m.group(9)
#下面将经纬度重新组合为Googleearth格式。
#这里的一个重点是中文内码转换decode('cp936').encode('utf8'),否则导入后中文会显示为乱码。
#可能由于排版变化,下面语句应为一整行
s=s+"""<Placemark><name>"""+poi_name.decode('cp936').encode('utf8')+
"""</name><Point><coordinates>"""+str(longt)+','+str(lat)+','+str(height)+
"""</coordinates></Point></Placemark>n"""
#循环结束,写入尾部信息
s=s+"""</Document>n</kml>"""
#写入并关闭文件
outf.write(s)
inf.close()
outf.close()
以“#”开头的说明文字非程序代码,输入时忽略即可。
将程序用记事本输入编辑后,保存为名为poi.py(名称任意,扩展名不能变)的文件。将兴趣点文件命名为xinqudian.upt,并放入“C:”目录下。双击运行poi.py,就会在同一目录下产生出Googleearth文件xinqudian.kml,直接双击即可在Googleearth中显示出来。
一些限制:我们的工作地点为国内,所以在程序里默认假设坐标点为东经和北纬。如果超出这个范围,需要修改E和N匹配字符。