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库的方式)

请到我的另一篇文章查看:python中使用xlrd、xlwt库以及openpyxl库读写excel浅析

核心坐标转换代码参考自戳我
感谢wandergis

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

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

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值