本文主要介绍三个内容:
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 xlrd
import xlwt
import json
import requests
import math
from datetime import date,datetime
key = 'balala' # 这里填写你的高德api的key
x_pi = 3.14159265358979324 * 3000.0 / 180.0
pi = 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 ret
def 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
def 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 Workbook
from openpyxl import load_workbook
import json
import requests
import math
from datetime import date,datetime
key = 'fc6832e6333cc9109d976287915d395a' # 这里填写你的高德api的key
x_pi = 3.14159265358979324 * 3000.0 / 180.0
pi = 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 ret
def 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
def 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 ret
def 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
——————————–正文结束了——————————–
生活小分享:
最近一直在看老版《三国》电视剧,大概看了十五六集吧,我以前听说过张飞无脑,没想到竟然如此无脑,冲动是魔鬼,克制才是王道。
最近换了桌面壁纸: