用Python实现探险家GPS和Google earth 的兴趣点转换

所属栏目:电子技术论文 发布日期:2011-09-07 17:06 热度:

  探险家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匹配字符。

文章标题:用Python实现探险家GPS和Google earth 的兴趣点转换

转载请注明来自:http://www.sofabiao.com/fblw/dianxin/dianzijishu/10145.html

相关问题解答

SCI服务

搜论文知识网的海量职称论文范文仅供广大读者免费阅读使用! 冀ICP备15021333号-3