excel中坐标系转换

import urllib
import math
import openpyxl
from urllib.request import urlopen
import string


x_pi = 3.14159265358979324 * 3000.0 / 180.0
pi = 3.1415926535897932384626  # π
a = 6378245.0  # 长半轴
ee = 0.00669342162296594323  # 偏心率平方
coordinate = []
lng = []
lat = []
converted_lng = []
converted_lat = []


def gcj02_to_bd09(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 bd09_to_gcj02(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 wgs84_to_gcj02(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 gcj02_to_wgs84(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 bd09_to_wgs84(bd_lon, bd_lat):
    lon, lat = bd09_to_gcj02(bd_lon, bd_lat)
    return gcj02_to_wgs84(lon, lat)


def wgs84_to_bd09(lon, lat):
    lon, lat = wgs84_to_gcj02(lon, lat)
    return gcj02_to_bd09(lon, lat)


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__':
    # lng=123.789747059
    # lat=41.3125289250999
    # [dstlng, dstlat] = wgs84_to_bd09(lng, lat)
    # print(dstlng,dstlat)
    workbook = openpyxl.load_workbook(r"C:\Users\shangjp\**********************.xlsx")
    worksheet1 = workbook.worksheets[1]
    worksheet1.cell(1, 16, 'dstlat')
    worksheet1.cell(1, 15, 'dstlng')
    for i in range(1, 999999):
        lng = worksheet1.cell(i, 13).value
        lat = worksheet1.cell(i, 14).value
        if lng == None:
            print(i)
            exit()
        else:
            [dstlng, dstlat] = wgs84_to_bd09(lng, lat)
            worksheet1.cell(i, 15, dstlng)
            worksheet1.cell(i, 16, dstlat)
            print(i, dstlat, dstlng, lat, lng)
            s = i % 50
            if s == 0:
                print(i)
            workbook.save(filename=r'C:\Users\shangjp\Desktop\***********.xlsx')

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
Excel是一种广泛使用的电子表格软件,可以进行数据分析和处理。在Excel进行坐标转换是指将一种坐标系统的数据转换为另一种坐标系统的数据。 一种常见的坐标转换是将经纬度坐标转换为UTM(通用横麦卡托投影)坐标。经纬度是一种以地球上某一点为参考基准的坐标系统,其经度表示点的东西位置,纬度表示点的南北位置。而UTM是一种将地球划分为若干个区域,每个区域采用横麦卡托投影的坐标系统。 要在Excel进行经纬度与UTM坐标的转换,可以使用一些公式或者宏来实现。首先,需要明确经纬度与UTM坐标的转换公式,以及相关参数,比如UTM坐标的央经线和假北坐标。 然后,在Excel,可以创建一些自定义功能或者使用现有的功能来进行坐标转换。例如,使用VBA(Visual Basic for Applications)编写一个宏,通过输入经纬度坐标和相关参数,计算出对应的UTM坐标。或者使用一些内置的数学函数,比如SIN、COS和ATAN,来实现坐标转换的计算。 此外,也可以利用Excel的地理信息系统(GIS)插件或者第三方的坐标转换工具来完成坐标转换。这些工具通常提供了更为简单的用户界面,可以直接在Excel进行坐标转换操作。 无论使用哪种方法,坐标转换都需要具备一定的数学计算能力和相关知识。因此,在进行坐标转换之前,建议先了解相关的坐标系统和转换公式,以确保转换结果的准确性。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值