分享

将经纬度坐标批量导入Google Earth的方法

 昵称14945998 2021-10-14

  看了昨晚的数模题,发现B题与经纬度定位及定价有关,容易想到订单价格和执行情况可能和它的位置分布有一定关系,如果能把所有坐标都导入地图,就可以直观地看出它们的特点了。 
  Google Earth中地标等信息主要是用XML/XMZ文件存储的,我们可以将Google Earth里的路径或地标导出为XML文件,也可以将自己的XML在Google Earth中打开。该方法的主要途径就是把自己的坐标信息转换成XML文件,再在Google Earth中打开。根据CSV文件生成XML文件需要借助GlobalMapper软件,它可以读取包含坐标信息的CSV文件并导出为XML,网上版本很多,因为我英语比较渣为了节省时间找了一款汉化版的(Global Mapper V14.1 http://www.pc6.com/softview/SoftView_102125.html)。 
  Google Earth采用的是 ddd°mm’ss”格式的坐标,而数据提供的是ddd.ddddd °格式的,直接导入原格式总是定位失败,所以需要先把原数据转换成度分秒格式的,方法很简单,例如要把(205.395583333332,57.9323888888888)转换成(205°23’44.1”,57°55’56.6”),步骤如下:

  1. 直接读取“度”:205

  2. (205.395583333332-205)*60=23.734999999920 得到“分”:23

  3. (23.734999999920-23)*60=44.099999995200 得到“秒”:44.1

同理可以得到纬度坐标:57°55’56.6” 
根据以上原理,可以通过软件或编程把所有坐标转换成度分秒格式,因为XML文件坐标尾还含有一个表示经纬度的字符'E、W、N、S’,为了一次性写入,这里用Python实现,核心语句如下:

tempE = str(int(E)) +"°"+ str(int((E - int(E))*60)) +"'" + str((((E - int(E))*60) -int((E - int(E))*60))*60) + "''"+' '+ 'E'

其中E为从原表中读到的经纬度数据,tempE为转换得到度分秒坐标。为了区分执行情况,可以加一些判断语句,将成功订单和失败订单分开,最终结果如下图所示:

之后将表格另存为CSV格式,用GlobalMapper打开 

文件格式选择CSV,并打开对应文件 

选择只有点 

下一个页面用默认选项,之后会得到坐标示意图 

再选择输出为矢量格式 

注意选择KML/KMZ选项 

这里写图片描述

最后去掉“创建压缩KMZ”前面的勾 

点完成即可生成KML文件了。

其中在导入CSV时可能会导入失败,出现如下错误: 

这里写图片描述

一直没找出错误原因,可能是EXCEL生成的CSV编码和它要求的不符,我的解决方法是用GlobalMapper打开一个Google Earth导出的XML,再将其输出为CSV文件,然后把自己的文件内容复制到这个CSV中就能顺利导入了。

之后用Google Earth打开生成XML文件,可以发现所有坐标都可以标记出来,之后调整一下标签和图标,就可以发现失败订单的分布: 

这里写图片描述

同理添加成功订单的坐标,调整标签和图标,可以观察两者的分布特点: 

这里写图片描述

除了按订单执行情况分类,还可以按价格分类查看分布: 

这里写图片描述

用Google Earth打开XML文件后会发现所有坐标点只是小黑点,这时在左边侧栏里选中要编辑的XML文件,右击“属性”,在名称框后面有设置图标的选项,在“样式/颜色”栏可以调标签和图标的大小和颜色,同时打开多个XML,调成不同的样式就可以比较明显的对比。

最后坐标格式转换的完整代码如下:

#按执行情况分类,执行成功写入success,否则写入flase
import openpyxl       #处理Excel的包

f = openpyxl.load_workbook('GPS.xlsx')    #打开原文件,即附件一
out_f = openpyxl.Workbook()     #创建输出Excel
table1 = out_f.active
table1.title = 'false'          #分别创建执行成功和失败的sheet
table2 = out_f.create_sheet('success')

#写入表头
title = ['LONGITUDE','LATITUDE','LABEL']
for i in range(3):
    table1.cell(row = 1,column = i+1,value = title[i])
    table2.cell(row = 1,column = i+1,value = title[i])

sheet1 = f['t']
ncols = sheet1.max_row
f = s = 2
for i in range(2,ncols+1):
    N = sheet1.cell(row = i,column = 2).value       #获取原坐标
    E = sheet1.cell(row = i, column = 3).value
    tempN = str(int(N)) +"°"+ str(int((N - int(N))*60)) +"'" + str((((N - int(N))*60) -int((N - int(N))*60))*60) + "''"+' ' +'N'          #坐标转换
    tempE = str(int(E)) +"°"+ str(int((E - int(E))*60)) +"'" + str((((E - int(E))*60) -int((E - int(E))*60))*60) + "''"+' '+ 'E'
    label = sheet1.cell(row = i,column = 1).value

    if(sheet1.cell(row = i,column = 5).value == 0):     #如果执行失败,写入flase sheet
        table1.cell(row = f,column = 2,value = tempN)
        table1.cell(row = f,column = 1,value = tempE)
        table1.cell(row = f,column = 3,value = label)
        f += 1  
    else:                                               #否则写入success sheet
        table2.cell(row = s,column = 2,value = tempN)
        table2.cell(row = s,column = 1,value = tempE)
        table2.cell(row = s,column = 3,value = label)
        s += 1

out_f.save('GPS2.xlsx')                                 #保存文件
#按定价分类,区间为65-70,70-75,75-80,80+

import openpyxl

f = openpyxl.load_workbook('GPS.xlsx')
out_f = openpyxl.Workbook()
table1 = out_f.active
table1.title = '65-70'
table2 = out_f.create_sheet('70-75')
table3 = out_f.create_sheet('75-80')
table4 = out_f.create_sheet('80-')

title = ['LONGITUDE','LATITUDE','LABEL']
for i in range(3):
    table1.cell(row = 1,column = i+1,value = title[i])
    table2.cell(row = 1,column = i+1,value = title[i])
    table3.cell(row = 1,column = i+1,value = title[i])
    table4.cell(row = 1,column = i+1,value = title[i])

sheet1 = f['t']
ncols = sheet1.max_row
k = l = m = n = 2
for i in range(2,ncols+1):
    N = sheet1.cell(row = i,column = 2).value
    E = sheet1.cell(row = i, column = 3).value
    tempN = str(int(N)) +"°"+ str(int((N - int(N))*60)) +"'" + str((((N - int(N))*60) -int((N - int(N))*60))*60) + "''"+' ' +'N'
    tempE = str(int(E)) +"°"+ str(int((E - int(E))*60)) +"'" + str((((E - int(E))*60) -int((E - int(E))*60))*60) + "''"+' '+ 'E'
    label = sheet1.cell(row = i,column = 1).value

    if(sheet1.cell(row = i,column = 4).value <70):
        table1.cell(row = k,column = 2,value = tempN)
        table1.cell(row = k,column = 1,value = tempE)
        table1.cell(row = k,column = 3,value = label)
        k += 1  
    elif(sheet1.cell(row = i,column = 4).value <75):
        table2.cell(row = l,column = 2,value = tempN)
        table2.cell(row = l,column = 1,value = tempE)
        table2.cell(row = l,column = 3,value = label)
        l += 1
    elif(sheet1.cell(row = i,column = 4).value <80):
        table3.cell(row = m,column = 2,value = tempN)
        table3.cell(row = m,column = 1,value = tempE)
        table3.cell(row = m,column = 3,value = label)
        m += 1
    else:
        table4.cell(row = n,column = 2,value = tempN)
        table4.cell(row = n,column = 1,value = tempE)
        table4.cell(row = n,column = 3,value = label)
        n += 1

out_f.save('GPS3.xlsx')

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多