windows下python3.5安裝setuptools以及百度座標系(bd-09)、火星座標系(國測局座標系、gcj02)、WGS84座標系之間的座標互轉python實現以及python中exce
本文主要介紹三個內容:
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程式所在的資料夾的路徑
3
為什麼要裝setuptools呢?因為python的執行依賴於很多的庫,當你的程式碼中要引用的庫不在預設庫中時,就需要使用setuptools的easy_install來進行下載和安裝。
如何安裝setuptools?
比較簡單的方法:
參考:
(1)官網:戳我
(2)中文解釋:戳我
安裝過程中可能會遇到IE瀏覽器打不開或者出問題的情況,這時候手動開啟IE瀏覽器看看能不能載入正常的網頁,可能是剛剛裝IE所以初始配置沒有完成所以IE有問題,這裡只要IE可以正常開啟都沒有問題。
安裝成功之後可能在cmd執行easy_install又會遇到不是內部或外部命令報錯的解決方法
二、百度座標系(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庫的方式)
核心座標轉換程式碼參考自戳我
感謝wandergis
——————————–正文結束了——————————–
生活小分享:
最近一直在看老版《三國》電視劇,大概看了十五六集吧,我以前聽說過張飛無腦,沒想到竟然如此無腦,衝動是魔鬼,剋制才是王道。
最近換了桌面桌布: