1. 程式人生 > >windows下python3.5安裝setuptools以及百度座標系(bd-09)、火星座標系(國測局座標系、gcj02)、WGS84座標系之間的座標互轉python實現以及python中exce

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程式所在的資料夾的路徑

即可,重啟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庫的方式)

核心座標轉換程式碼參考自戳我
感謝wandergis

——————————–正文結束了——————————–
生活小分享:
最近一直在看老版《三國》電視劇,大概看了十五六集吧,我以前聽說過張飛無腦,沒想到竟然如此無腦,衝動是魔鬼,剋制才是王道。

最近換了桌面桌布:
這裡寫圖片描述