windows下python3.5安装setuptools以及百度坐标系(bd-09)、火星坐标系(国测局坐标系、gcj02)、WGS84坐标系之间的坐标互转python实现以及python中exce
来源:互联网 发布:pe中如何查看mac地址 编辑:程序博客网 时间:2024/06/05 06:59
本文主要介绍三个内容:
1、windows下python3.5安装setuptools
2、百度坐标系(bd-09)、火星坐标系(国测局坐标系、gcj02)、WGS84坐标系之间的坐标互转python实现
3、
使用python中的xlrd以及xlwt进行excel(xls)的读写(有小问题)
使用python中的openpyxl库进行excel(xlsx)的读写
一、安装python以及安装setuptools
1
安装python就直接到官网下载对应所需的版本安装即可
2
装好了之后到cmd输入python可能遇到不是内部或外部命令报错的解决方法 这时候是没有添加环境变量,在系统变量下找到Path名的变量,编辑并添加python程序所在的文件夹的路径即可,重启cmd运行python就会发现成功了
3
为什么要装setuptools呢?因为python的运行依赖于很多的库,当你的代码中要引用的库不在默认库中时,就需要使用setuptools的easy_install来进行下载和安装。
如何安装setuptools?
比较简单的方法:
参考:
(1)官网:戳我
(2)中文解释:戳我
安装过程中可能会遇到IE浏览器打不开或者出问题的情况,这时候手动打开IE浏览器看看能不能加载正常的网页,可能是刚刚装IE所以初始配置没有完成所以IE有问题,这里只要IE可以正常打开都没有问题。
安装成功之后可能在cmd运行easy_install又会遇到不是内部或外部命令报错的解决方法,没错又是环境变量的问题,easy_install一般在\Python\Python35-32\Scripts即Scripts文件夹之下,添加到Path即可。
二、百度坐标系(bd-09)、火星坐标系(国测局坐标系、gcj02)、WGS84坐标系之间的坐标互转python实现
1、
使用easy_install安装requests(python代码中需要引用这个库)。
2、
到高德开放平台申请一个key,随便申请一个Javascript类型的API都可以,记得填入代码中**
3、
上代码:
使用xlrd和xlwt库读写excel(xls)的:
xlrd和xlwt库只支持xls的格式,因此如果要写的数据行数超过65535就会报错:ValueError: row index was 65536, not allowed by .xls format
所以如果数据量很大的话(超过65535行),建议使用我的第二种方式,openpyxl库的方式,虽然你也可以通过添加sheet来解决,但是我觉得太麻烦了哈哈。
# -*- coding: utf-8 -*-import xlrdimport xlwtimport jsonimport requestsimport mathfrom datetime import date,datetimekey = 'balala' # 这里填写你的高德api的keyx_pi = 3.14159265358979324 * 3000.0 / 180.0pi = 3.1415926535897932384626 # πa = 6378245.0 # 长半轴ee = 0.00669342162296594323 # 扁率def read_excel(): # 打开文件 readbook = xlrd.open_workbook(r'C:\Users\user\Desktop\coordTransform_py-master\test\zhusu.xlsx') writebook = xlwt.Workbook()#打开一个excel sheet = writebook.add_sheet('test')#在打开的excel中添加一个sheet table = readbook.sheets()[0]#获取读入的文件的第一个sheet nrows = table.nrows#获取sheet的行数 #print (nrows) for i in range(nrows): if i == 0:#我处理的数据第一行是属性名,所以去掉 continue lng = table.cell(i,3).value#获取i行3列的表格值 lat = table.cell(i,4).value#获取i行4列的表格值 result = gcj02towgs84(lng,lat)#引用转换函数 print(i) sheet.write(i,0,result[0])#写入excel sheet.write(i,1,result[1]) writebook.save('answer.xls')#一定要记得保存def gcj02towgs84(lng, lat): """ GCJ02(火星坐标系)转GPS84 :param lng:火星坐标系的经度 :param lat:火星坐标系纬度 :return: """ if out_of_china(lng, lat): return lng, lat dlat = transformlat(lng - 105.0, lat - 35.0) dlng = transformlng(lng - 105.0, lat - 35.0) radlat = lat / 180.0 * pi magic = math.sin(radlat) magic = 1 - ee * magic * magic sqrtmagic = math.sqrt(magic) dlat = (dlat * 180.0) / ((a * (1 - ee)) / (magic * sqrtmagic) * pi) dlng = (dlng * 180.0) / (a / sqrtmagic * math.cos(radlat) * pi) mglat = lat + dlat mglng = lng + dlng return [lng * 2 - mglng, lat * 2 - mglat]def transformlat(lng, lat): ret = -100.0 + 2.0 * lng + 3.0 * lat + 0.2 * lat * lat + \ 0.1 * lng * lat + 0.2 * math.sqrt(math.fabs(lng)) ret += (20.0 * math.sin(6.0 * lng * pi) + 20.0 * math.sin(2.0 * lng * pi)) * 2.0 / 3.0 ret += (20.0 * math.sin(lat * pi) + 40.0 * math.sin(lat / 3.0 * pi)) * 2.0 / 3.0 ret += (160.0 * math.sin(lat / 12.0 * pi) + 320 * math.sin(lat * pi / 30.0)) * 2.0 / 3.0 return retdef transformlng(lng, lat): ret = 300.0 + lng + 2.0 * lat + 0.1 * lng * lng + \ 0.1 * lng * lat + 0.1 * math.sqrt(math.fabs(lng)) ret += (20.0 * math.sin(6.0 * lng * pi) + 20.0 * math.sin(2.0 * lng * pi)) * 2.0 / 3.0 ret += (20.0 * math.sin(lng * pi) + 40.0 * math.sin(lng / 3.0 * pi)) * 2.0 / 3.0 ret += (150.0 * math.sin(lng / 12.0 * pi) + 300.0 * math.sin(lng / 30.0 * pi)) * 2.0 / 3.0 return retdef out_of_china(lng, lat): """ 判断是否在国内,不在国内不做偏移 :param lng: :param lat: :return: """ return not (lng > 73.66 and lng < 135.05 and lat > 3.86 and lat < 53.55)if __name__ == '__main__': read_excel()
使用openpyxl库读写excel(xlsx)的:
我也是因为遇到了:ValueError: row index was 65536, not allowed by .xls format才赶紧找其他办法的,然后就找到了openpyxl这个库,xlsx可以支持1048576这么多行,一般来说也够了。
# -*- coding: utf-8 -*-from openpyxl import Workbookfrom openpyxl import load_workbookimport jsonimport requestsimport mathfrom datetime import date,datetimekey = 'fc6832e6333cc9109d976287915d395a' # 这里填写你的高德api的keyx_pi = 3.14159265358979324 * 3000.0 / 180.0pi = 3.1415926535897932384626 # πa = 6378245.0 # 长半轴ee = 0.00669342162296594323 # 扁率def read_excel(): filename = r'C:\Users\user\Desktop\coordTransform_py-master\test\shenghuo.xlsx' inwb = load_workbook(filename)#读文件 outwb = Workbook()#打开一个将写的文件 outws = outwb.create_sheet(title="cool")#在将写的文件创建sheet sheetnames = inwb.get_sheet_names()#获取读文件中所有的sheet,通过名字的方式 ws = inwb.get_sheet_by_name(sheetnames[0])#获取第一个sheet内容 rows = ws.max_row#获取读取的excel的文件的行数 print(rows) for i in range(rows): lng = ws.cell(row = i+1 , column = 4).value#读文件 lat = ws.cell(row = i+1 , column = 5).value result = gcj02towgs84(lng,lat)#引用函数 print(i) outws.cell(row = i+1 , column = 1).value = result[0]#写文件 outws.cell(row = i+1 , column = 2).value = result[1] outwb.save('answer.xlsx')#一定要记得保存def gcj02towgs84(lng, lat): """ GCJ02(火星坐标系)转GPS84 :param lng:火星坐标系的经度 :param lat:火星坐标系纬度 :return: """ if out_of_china(lng, lat): return lng, lat dlat = transformlat(lng - 105.0, lat - 35.0) dlng = transformlng(lng - 105.0, lat - 35.0) radlat = lat / 180.0 * pi magic = math.sin(radlat) magic = 1 - ee * magic * magic sqrtmagic = math.sqrt(magic) dlat = (dlat * 180.0) / ((a * (1 - ee)) / (magic * sqrtmagic) * pi) dlng = (dlng * 180.0) / (a / sqrtmagic * math.cos(radlat) * pi) mglat = lat + dlat mglng = lng + dlng return [lng * 2 - mglng, lat * 2 - mglat]def transformlat(lng, lat): ret = -100.0 + 2.0 * lng + 3.0 * lat + 0.2 * lat * lat + \ 0.1 * lng * lat + 0.2 * math.sqrt(math.fabs(lng)) ret += (20.0 * math.sin(6.0 * lng * pi) + 20.0 * math.sin(2.0 * lng * pi)) * 2.0 / 3.0 ret += (20.0 * math.sin(lat * pi) + 40.0 * math.sin(lat / 3.0 * pi)) * 2.0 / 3.0 ret += (160.0 * math.sin(lat / 12.0 * pi) + 320 * math.sin(lat * pi / 30.0)) * 2.0 / 3.0 return retdef transformlng(lng, lat): ret = 300.0 + lng + 2.0 * lat + 0.1 * lng * lng + \ 0.1 * lng * lat + 0.1 * math.sqrt(math.fabs(lng)) ret += (20.0 * math.sin(6.0 * lng * pi) + 20.0 * math.sin(2.0 * lng * pi)) * 2.0 / 3.0 ret += (20.0 * math.sin(lng * pi) + 40.0 * math.sin(lng / 3.0 * pi)) * 2.0 / 3.0 ret += (150.0 * math.sin(lng / 12.0 * pi) + 300.0 * math.sin(lng / 30.0 * pi)) * 2.0 / 3.0 return retdef out_of_china(lng, lat): """ 判断是否在国内,不在国内不做偏移 :param lng: :param lat: :return: """ return not (lng > 73.66 and lng < 135.05 and lat > 3.86 and lat < 53.55)if __name__ == '__main__': read_excel()
其他的坐标转换的函数(直接替换上述代码即可):
def gcj02tobd09(lng, lat): """ 火星坐标系(GCJ-02)转百度坐标系(BD-09) 谷歌、高德——>百度 :param lng:火星坐标经度 :param lat:火星坐标纬度 :return: """ z = math.sqrt(lng * lng + lat * lat) + 0.00002 * math.sin(lat * x_pi) theta = math.atan2(lat, lng) + 0.000003 * math.cos(lng * x_pi) bd_lng = z * math.cos(theta) + 0.0065 bd_lat = z * math.sin(theta) + 0.006 return [bd_lng, bd_lat]def bd09togcj02(bd_lon, bd_lat): """ 百度坐标系(BD-09)转火星坐标系(GCJ-02) 百度——>谷歌、高德 :param bd_lat:百度坐标纬度 :param bd_lon:百度坐标经度 :return:转换后的坐标列表形式 """ x = bd_lon - 0.0065 y = bd_lat - 0.006 z = math.sqrt(x * x + y * y) - 0.00002 * math.sin(y * x_pi) theta = math.atan2(y, x) - 0.000003 * math.cos(x * x_pi) gg_lng = z * math.cos(theta) gg_lat = z * math.sin(theta) return [gg_lng, gg_lat]def wgs84togcj02(lng, lat): """ WGS84转GCJ02(火星坐标系) :param lng:WGS84坐标系的经度 :param lat:WGS84坐标系的纬度 :return: """ if out_of_china(lng, lat): # 判断是否在国内 return lng, lat dlat = transformlat(lng - 105.0, lat - 35.0) dlng = transformlng(lng - 105.0, lat - 35.0) radlat = lat / 180.0 * pi magic = math.sin(radlat) magic = 1 - ee * magic * magic sqrtmagic = math.sqrt(magic) dlat = (dlat * 180.0) / ((a * (1 - ee)) / (magic * sqrtmagic) * pi) dlng = (dlng * 180.0) / (a / sqrtmagic * math.cos(radlat) * pi) mglat = lat + dlat mglng = lng + dlng return [mglng, mglat]def gcj02towgs84(lng, lat): """ GCJ02(火星坐标系)转GPS84 :param lng:火星坐标系的经度 :param lat:火星坐标系纬度 :return: """ if out_of_china(lng, lat): return lng, lat dlat = transformlat(lng - 105.0, lat - 35.0) dlng = transformlng(lng - 105.0, lat - 35.0) radlat = lat / 180.0 * pi magic = math.sin(radlat) magic = 1 - ee * magic * magic sqrtmagic = math.sqrt(magic) dlat = (dlat * 180.0) / ((a * (1 - ee)) / (magic * sqrtmagic) * pi) dlng = (dlng * 180.0) / (a / sqrtmagic * math.cos(radlat) * pi) mglat = lat + dlat mglng = lng + dlng return [lng * 2 - mglng, lat * 2 - mglat]def transformlat(lng, lat): ret = -100.0 + 2.0 * lng + 3.0 * lat + 0.2 * lat * lat + \ 0.1 * lng * lat + 0.2 * math.sqrt(math.fabs(lng)) ret += (20.0 * math.sin(6.0 * lng * pi) + 20.0 * math.sin(2.0 * lng * pi)) * 2.0 / 3.0 ret += (20.0 * math.sin(lat * pi) + 40.0 * math.sin(lat / 3.0 * pi)) * 2.0 / 3.0 ret += (160.0 * math.sin(lat / 12.0 * pi) + 320 * math.sin(lat * pi / 30.0)) * 2.0 / 3.0 return retdef transformlng(lng, lat): ret = 300.0 + lng + 2.0 * lat + 0.1 * lng * lng + \ 0.1 * lng * lat + 0.1 * math.sqrt(math.fabs(lng)) ret += (20.0 * math.sin(6.0 * lng * pi) + 20.0 * math.sin(2.0 * lng * pi)) * 2.0 / 3.0 ret += (20.0 * math.sin(lng * pi) + 40.0 * math.sin(lng / 3.0 * pi)) * 2.0 / 3.0 ret += (150.0 * math.sin(lng / 12.0 * pi) + 300.0 * math.sin(lng / 30.0 * pi)) * 2.0 / 3.0 return ret
三、python中excel的读写问题(使用xlrd和xlwt库的方式以及使用openpyxl库的方式)
请到我的另一篇文章查看:python中使用xlrd、xlwt库以及openpyxl库读写excel浅析
核心坐标转换代码参考自戳我
感谢wandergis
——————————–正文结束了——————————–
生活小分享:
最近一直在看老版《三国》电视剧,大概看了十五六集吧,我以前听说过张飞无脑,没想到竟然如此无脑,冲动是魔鬼,克制才是王道。
最近换了桌面壁纸:
- windows下python3.5安装setuptools以及百度坐标系(bd-09)、火星坐标系(国测局坐标系、gcj02)、WGS84坐标系之间的坐标互转python实现以及python中exce
- 百度坐标(BD09)、国测局坐标(火星坐标,GCJ02)、和WGS84坐标系互转
- 百度坐标(BD09)、国测局坐标(火星坐标,GCJ02)、和WGS84坐标系之间的转换(JS版代码)
- 地球坐标系(WGS84),火星坐标系(GCJ02), 百度坐标系(BD09)坐标转换
- WGS84坐标系转火星坐标系
- 一个提供了百度坐标(BD09)、国测局坐标(火星坐标,GCJ02)、和WGS84坐标系之间的转换的工具模块。
- [JS] 百度坐标(BD09)、国测局坐标(火星坐标,GCJ02)、和WGS84坐标系之间的转换(JS版代码)
- 地球坐标系 (WGS-84) 到火星坐标系 (GCJ-02)百度坐标系 (BD-09) 的转换算法
- 地球坐标系 (WGS-84) 到火星坐标系 (GCJ-02)百度坐标系 (BD-09) 的转换算法 .
- PHP 不同地图坐标系经纬度转换 GCj02 WGS84 BD-09
- 各地图API坐标系统比较与转换(WGS84坐标系、火星坐标系、百度坐标系、搜狗坐标系、图吧坐标系)
- 火星坐标系,百度坐标系,wgs84坐标系转换算法
- 火星坐标系,百度坐标系,wgs84坐标系转换算法
- 各地图坐标系转换(WGS84坐标系,GCJ02坐标系,BD09坐标系)
- 火星坐标系 (GCJ-02) 与百度坐标系 (BD-09) 的转换算法
- 火星坐标系 (GCJ-02) 与百度坐标系 (BD-09) 的转换算法
- 火星坐标系 (GCJ-02) 与百度坐标系 (BD-09) 的转换算法
- 火星坐标系 (GCJ-02) 与百度坐标系 (BD-09) 的转换算法
- 一个版本Tomcat6多处使用,以及集成solr的配置
- 单一原则
- java实现二叉查找树
- zynq u-boot驱动串口打印乱码或者无打印
- DDR基础之Write_leveling简介
- windows下python3.5安装setuptools以及百度坐标系(bd-09)、火星坐标系(国测局坐标系、gcj02)、WGS84坐标系之间的坐标互转python实现以及python中exce
- Codeforces Round #381 (Div. 2) B. Alyona and flowers(思维题目)
- 解决浏览器记住密码输入框的问题
- Spring容器配置注入List集合对象属性
- Android--将Uri从file://改成content://
- Linux下which、whereis、locate、find 命令的区别
- mysql权限管理
- 新开始
- 专利查询网站(免费)