将经纬度坐标批量导入Google Earth的方法
来源:互联网 发布:thumbnails java 编辑:程序博客网 时间:2024/05/21 09:08
看了昨晚的数模题,发现B题与经纬度定位及定价有关,容易想到订单价格和执行情况可能和它的位置分布有关,如果能把所有坐标都导入地图,就可以直观地看出它们的特点了,试了一晚上,终于实现了。
Google Earth中地标等信息主要是用XML/XMZ文件存储的,我们可以把路径或地标导出为XML文件,也可以将自己的XML在Google Earth中打开。题目里给的信息,包含了大量订单的位置坐标,将这些坐标生成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”),步骤如下:
- 直接读取”度”:205
- (205.395583333332-205)*60=23.734999999920 得到”分”:23
- (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文件,可以发现所有坐标都可以标记出来,之后调整一下标签和图标,就可以发现失败订单的分布:
同理添加成功订单的坐标,调整标签和图标,可以观察两者的分布特点:
除了按订单执行情况分类,还可以按价格分类查看分布:
最后坐标格式转换的完整代码如下:
#按执行情况分类,执行成功写入success,否则写入flaseimport openpyxl #处理Excel的包f = openpyxl.load_workbook('GPS.xlsx') #打开原文件,即附件一out_f = openpyxl.Workbook() #创建输出Exceltable1 = out_f.activetable1.title = 'false' #分别创建执行成功和失败的sheettable2 = 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_rowf = s = 2for 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 += 1out_f.save('GPS2.xlsx') #保存文件
#按定价分类,区间为65-70,70-75,75-80,80+import openpyxlf = openpyxl.load_workbook('GPS.xlsx')out_f = openpyxl.Workbook()table1 = out_f.activetable1.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_rowk = l = m = n = 2for 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 += 1out_f.save('GPS3.xlsx')
- 将经纬度坐标批量导入Google Earth的方法
- Google Earth中点的经纬度坐标如何批量导出...
- 经纬度坐标(google earth)导入到ArcMap
- 将mapinfo路测、话统图层导入google earth的方法
- GOOGLE EARTH的详细坐标
- Google Earth的一些相关坐标
- Google Earth有趣的坐标收集
- 一些Google Earth坐标
- 【百度地图API】如何将Google的经纬度批量转换为百度经纬度
- google Map经纬度坐标取得方法
- google Map经纬度坐标取得方法
- 将GPS坐标转换成百度地图坐标,将baidu 经纬度 转换为google经纬度
- 经纬度坐标转换的方法
- 经纬度坐标导入到ArcMap的技巧
- Google Earth坐标集(转贴)
- 朝鲜核试验Google Earth坐标
- Google Earth 经典坐标 #1
- Google Earth 经典坐标 #2
- android ndk开发编译生成so文件
- memset函数
- sublime编辑器 3143 license
- Shell中实现字符串反转方法
- PWR电源板调试日志
- 将经纬度坐标批量导入Google Earth的方法
- iptables防火墙详解(一)
- 多么痛的领悟---关于RMB数据类型导致的元转分分转元的bug
- iptables防火墙详解(二)
- 进程间通信(二)有名管道
- Unity3D开发之3D按钮的声音播放
- Mybatis组件与其生命周期
- iptables防火墙详解(三)
- 数组和遍历