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

——————————–正文结束了——————————–
生活小分享:
最近一直在看老版《三国》电视剧,大概看了十五六集吧,我以前听说过张飞无脑,没想到竟然如此无脑,冲动是魔鬼,克制才是王道。

最近换了桌面壁纸:
这里写图片描述

0 0