python实现 经纬度的 各GIS坐标系转换

火星坐标系、WGS84坐标系、百度坐标系和Web墨卡托坐标系相互转换(基于Python实现 主流被使用的地理坐标系并不统一,导致在处理多源数据时往往会出现对不齐的情况,如何在火星坐标系、WGS84坐标系、百度坐标系和Web墨卡托坐标系进行坐标转换非常关键,本文介绍了基于python实现坐标系转换代码。 阅读详情

这里是gis坐标的单点转换.

下面是利用python反射机制实现的gis坐标转换类.精度不是很完美但一般也够用啦.

 

# coding=utf-8
import math, re


class GisTransform(object):
    """gis坐标转换类"""

    def __init__(self, old_gis_name, new_gis_name):
        """
        经纬度(谷歌高德):'wgs84'/  墨卡托:'webMercator'/ 火星坐标系(国测局):'gcj02'
        """
        self.pi = 3.1415926535897932384626  # π   精度比math.pi 还高一些
        self.ee = 0.00669342162296594323  # 偏心率平方
        self.a = 6378245.0  # 长半轴

        func_name = old_gis_name + '_to_' + new_gis_name
        if hasattr(self, func_name):
            self.transform_func = getattr(self, func_name)

    def _out_of_china(self, lng, lat):
        """
        判断是否在国内,不在国内不做偏移
        :param lng:
        :param lat:
        :return:
        """
        return not (lng > 73.66 and lng < 135.05 and lat > 3.86 and lat < 53.55)

    def _transformlat(self, 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 * self.pi) + 20.0 *
                math.sin(2.0 * lng * self.pi)) * 2.0 / 3.0
        ret += (20.0 * math.sin(lat * self.pi) + 40.0 *
                math.sin(lat / 3.0 * self.pi)) * 2.0 / 3.0
        ret += (160.0 * math.sin(lat / 12.0 * self.pi) + 320 *
                math.sin(lat * self.pi / 30.0)) * 2.0 / 3.0
        return ret

    def _transformlng(self, 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 * self.pi) + 20.0 *
                math.sin(2.0 * lng * self.pi)) * 2.0 / 3.0
        ret += (20.0 * math.sin(lng * self.pi) + 40.0 *
                math.sin(lng / 3.0 * self.pi)) * 2.0 / 3.0
        ret += (150.0 * math.sin(lng / 12.0 * self.pi) + 300.0 *
                math.sin(lng / 30.0 * self.pi)) * 2.0 / 3.0
        return ret

    def wgs84_to_webMercator(self, lon, lat):
        """wgs84坐标 转 墨卡托坐标"""
        x = lon * 20037508.342789 / 180
        y = math.log(math.tan((90 + lat) * self.pi / 360)) / (self.pi / 180)
        y = y * 20037508.34789 / 180
        return x, y

    def gcj02_to_webMercator(self, x, y):
        """火星转墨卡托"""
        wgs84_x, wgs84_y = self.gcj02_to_wgs84(x, y)
        webMercator_x, webMercator_y = self.wgs84_to_webMercator(wgs84_x, wgs84_y)
        return webMercator_x, webMercator_y

    def webMercator_to_webMercator(self, x, y):
        return x, y

    def webMercator_to_wgs84(self, x, y):
        """墨卡托坐标 转 wgs84坐标"""
        lon = x / 20037508.34 * 180
        lat = y / 20037508.34 * 180
        lat = 180 / self.pi * (2 * math.atan(math.exp(lat * self.pi / 180)) - self.pi / 2)
        return lon, lat

    def gcj02_to_wgs84(self, lng, lat):
        """
        GCJ02(火星坐标系)转GPS84
        :param lng:火星坐标系的经度
        :param lat:火星坐标系纬度
        :return:
        """
        if self._out_of_china(lng, lat):
            return lng, lat
        dlat = self._transformlat(lng - 105.0, lat - 35.0)
        dlng = self._transformlng(lng - 105.0, lat - 35.0)
        radlat = lat / 180.0 * self.pi
        magic = math.sin(radlat)
        magic = 1 - self.ee * magic * magic
        sqrtmagic = math.sqrt(magic)
        dlat = (dlat * 180.0) / ((self.a * (1 - self.ee)) / (magic * sqrtmagic) * self.pi)
        dlng = (dlng * 180.0) / (self.a / sqrtmagic * math.cos(radlat) * self.pi)
        mglat = lat + dlat
        mglng = lng + dlng
        new_x = lng * 2 - mglng
        new_y = lat * 2 - mglat
        return new_x, new_y

    def wgs84_to_gcj02(self, lng, lat):
        """
        WGS84转GCJ02(火星坐标系)
        :param lng:WGS84坐标系的经度
        :param lat:WGS84坐标系的纬度
        :return:
        """
        if self._out_of_china(lng, lat):  # 判断是否在国内
            return lng, lat
        dlat = self._transformlat(lng - 105.0, lat - 35.0)
        dlng = self._transformlng(lng - 105.0, lat - 35.0)
        radlat = lat / 180.0 * self.pi
        magic = math.sin(radlat)
        magic = 1 - self.ee * magic * magic
        sqrtmagic = math.sqrt(magic)
        dlat = (dlat * 180.0) / ((self.a * (1 - self.ee)) / (magic * sqrtmagic) * self.pi)
        dlng = (dlng * 180.0) / (self.a / sqrtmagic * math.cos(radlat) * self.pi)
        mglat = lat + dlat
        mglng = lng + dlng
        return mglng, mglat

    def webMercator_to_gcj02(self, x, y):
        """墨卡托转火星"""
        wgs84_x, wgs84_y = self.webMercator_to_wgs84(x, y)
        gcj02_x, gcj02_y = self.wgs84_to_gcj02(wgs84_x, wgs84_y)
        return gcj02_x, gcj02_y


if __name__ == '__main__':
    gis = GisTransform('wgs84', 'webMercator')  # 经纬度: wgs84 墨卡托: webMercator 国测局: gcj02
    print(gis.transform_func(114.09538, 22.62663))

 

【WGS84坐标系】从经纬度到空间直角坐标:两种高效转换方法详解 本文详细解析了WGS84坐标系经纬度与空间直角坐标的两种高效转换方法。通过手动公式计算与调用GeographicLib第三方库的实战对比,帮助开发者根据项目需求(如嵌入式开发、快速原型或高精度应用)选择合适方案,并提供了关键参数、代码实现及常见问题排查指南,是处理GPS数据、地图应用及三维空间计算的核心技能。 阅读详情

相关推荐

Python实战:用米勒投影把高德地图经纬度批量转成平面坐标(附完整代码)

本文详细介绍了如何使用Python将高德地图的经纬度坐标通过米勒投影批量转换为平面坐标,包含完整的代码实现和优化技巧。从高德API调用、米勒投影原理到批量处理与可视化适配,帮助开发者高效完成坐标转换任务,适用于GIS开发、数据可视化等场景。

weixin_29045585的博客 127

WGS84,GCJ-02,BD-09坐标系间的经纬度坐标转换代码(Python版)

WGS84,GCJ-02,BD-09坐标系间的经纬度坐标转换代码,对不同地图坐标系间的经纬度坐标进行转换从而实现坐标系的统一。

地图坐标系转换实战:从原理到代码实现

本文深入解析了地图坐标系转换的核心原理与实战方法。针对开发中常见的位置不准问题,详细对比了WGS84、GCJ02、BD09三大主流坐标系的特点与差异,并提供了完整的Python与JavaScript代码实现方案。通过使用coord-convert、gcoord等高效工具,开发者可以轻松实现坐标系间的精准转换,确保地理数据在不同地图服务间的准确流转与集成。

weixin_29214199的博客 384

python实现百度坐标和世界经纬度坐标之间的转换

python实现百度墨卡托坐标,百度经纬度坐标,火星坐标,WGS84坐标之间的相互转换

互联网常见坐标之间的转换Python

场景描述 随着互联网的兴趣,在企业应用系统的开发过程中,几乎每一个APP(CS、BS、移动端)都会搜集用户或设备的位置数据,然后在相关地图(来自互联网电子地图或自建地图服务)上进行标注展示,如果对空间坐标系不是很了解的话,不管你Coding能力有多强都会被各种位置匹配问题(错误、偏离、飞出等)折磨的晕头转向,不知所措。首先针对几种常见的互联网坐标我们对其做一简单场景梳理 常见的互联网坐标: 地球坐标:WGS84,国际标准、从GPS设备获取的坐标的参考坐标系、国际地图提供商使用的坐标系。OSM、谷..

技术改变世界 1390

地图坐标系转换简介

地图坐标系转换简介及问题分享 背景介绍 从android系统定位获取到的经纬度,到谷歌地图查询,发现定位偏移很大,以为是定位误差或者定位策略问题导致,实际上并非如此,详情以下分解。 各坐标系简介 WGS84坐标系 即地球坐标系,国际上通用的坐标系。 设备一般包含GPS芯片或者北斗芯片获取的经纬度为WGS84地理坐标系。谷歌地图采用的是WGS84地理坐标系(中国范围内谷歌中国地图采用的是GCJ02地理坐标系),android手机定位使用 GCJ02坐标系 即火星坐标系,WGS84坐标系经加

leokingszx的博客 1858

基于Python经纬度与xy坐标系相互转换

基于Python经纬度与xy坐标系相互转换

m0_58625397的博客 6072

cad 坐标 与 经纬度坐标的转换

cad 坐标 与 经纬度坐标的转换

牛牛博士博客 3772

地理坐标系转换与联系 编程

WGS84坐标系是GPS设备和在线地图常用的坐标系,而Web墨卡托坐标系是在Web地图中广泛使用的坐标系,也称为Web Mercator投影。通过以上的代码示例,你可以在自己的程序中实现地理坐标系之间的转换和联系。在地理信息系统(GIS)和地理定位应用中,经常需要进行地理坐标系之间的转换和联系。本文将介绍如何使用编程来进行地理坐标系转换和联系,并提供相应的源代码。经纬度是地球上常用的坐标表示方式,而UTM(通用横轴墨卡托投影)坐标系则是一种在大范围地图上常用的坐标表示方式。地理坐标系转换与联系 编程。

CodeRoarX的博客 188

表格中经纬度转换支持高德谷歌百度平面坐标相互转换 python实现

本文介绍了一个基于Python的坐标转换工具tablegis,支持WGS84、Web Mercator、CGCS2000、GCJ02和BD09等坐标系之间的相互转换。通过pip安装后,用户只需输入包含经纬度的表格,指定源坐标系和目标坐标系,即可输出转换后的坐标数据。示例代码演示了如何将WGS84坐标转换为Web Mercator坐标,结果表格会自动添加新列存储转换值。该工具适用于地理信息处理、地图开发等场景,源代码已在GitHub开源。

Non-existent987 320

用快马AI一键生成XY坐标转经纬度工具,GIS开发效率提升90%!

传统方法需要手动编写复杂的转换算法,或者依赖专业软件,不仅耗时耗力,而且灵活性较差。首先需要明确工具的核心功能:支持UTM、高斯-克吕格等常见平面坐标系的输入,能够根据用户提供的参数(如UTM带号、椭球体类型)进行转换,并实时显示结果和地图预览。此外,批量转换和结果导出也是刚需。实际体验中,从零开始到功能完备的工具,用快马AI只需不到1小时。尤其是算法部分,传统开发可能需要查文档、调试公式,而AI直接生成准确代码,省去大量试错时间。开发完成后,通过快马的一键部署功能直接上线工具,生成可公开访问的链接。

SilverMoon18的博客 630

图像坐标、地理坐标和投影坐标的相互转化(Python版)

    “轻拢慢捻抹复挑,初为霓裳后六幺”,有时候想想一个天涯沦落人的歌女能把技艺练到炉火纯青也是不容易。不管干什么事情都得努力才行呀!本想着以后都跟Java和Android打交道了,但世事难料呀,想想自己的任务,C、C++、Python等十八般武艺都得懂一些才行。今天就转发一篇有关坐标转化的博客吧,也没什么好说的,直接上代码! from osgeo import gdal from osge...

猛龙过江ing 9530

ArcGIS实战:如何批量导出多个shp文件的经纬度坐标到txt(含Python脚本)

本文详细介绍了使用Python脚本在ArcGIS环境中批量提取多个shp文件经纬度坐标并导出为txt文件的自动化解决方案。文章深入解析了shp文件结构、坐标提取原理,并提供了完整的脚本实现,涵盖单线程与多线程处理、错误处理、数据质量检查及性能优化等高级技巧,旨在帮助GIS技术人员高效处理空间数据。

weixin_29216049的博客 444

地址转坐标:利用高德API进行批量地理编码

我们把它放到GIS里看一下,导入GIS里时要注意一下文件格式是.csv或者.xls,打开arcgis10.8——>添加数据——>右键显示xy数据——>选择x,y字段,arcgisPro的话是支持.xlsx的,流程一样;我们会遇到一些需要批量把地址数据转换成坐标的问题,一个个查的话通常会比较麻烦,那有没有比较方便的方法呢,我们可以利用高德的地理编码/逆地理编码API功能,通过HTTP/HTTPS协议访问远程服务的接口,文章仅用于分享个人学习成果与个人存档之用,分享知识,如有侵权,请联系作者进行删除。

2509_94006108的博客 379

经纬度格式转换全解析:DMS、DD、DDM互转原理与Python实践

地理坐标是定位地球表面位置的基础,其核心原理基于角度度量系统。经纬度主要有三种表示格式:十进制度(DD)适合计算机存储计算,度分秒(DMS)符合人类阅读习惯,度分(DDM)则是GPS设备的常用折中格式。理解它们之间的数学转换关系(1°=60‘,1’=60“)是处理任何空间数据的基本功。在GIS、测绘、导航和物联网等应用场景中,坐标格式不匹配是导致数据错误、可视化偏差的常见根源。本文针对**数据导入**和**格式转换**中的实际问题,系统梳理了从手动计算到编程实现的完整解决方案,并提供了处理混乱数据、避免精度

weixin_31240035的博客 286

UTM坐标转换实战:从经纬度到精准地图定位

本文详细解析了UTM坐标转换技术,从经纬度到精准地图定位的实战应用。通过UTM系统解决经纬度不均匀性问题,适用于工程测量、无人机测绘等场景,提升定位精度至0.1%以内。文章包含核心算法实现、常见问题解决方案及性能优化技巧,助力开发者高效处理地理坐标数据。

weixin_26934905的博客 338

Python实战:从地理坐标到屏幕可视化的批量坐标转换与原点重置

本文详细介绍了使用Python进行批量坐标转换与原点重置的实战方法。通过米勒投影法将地理坐标(经纬度转换为平面坐标,并利用原点重置技术将坐标值调整至适合屏幕可视化的范围。文章提供了完整的代码示例,涵盖数据读取、批量转换、原点重置及可视化全流程,并针对常见问题给出了解决方案,帮助数据分析师和GIS开发者高效处理地理空间数据。

weixin_29053073的博客 212
上一篇: Mysql 在 linux(ubuntu)下的安装与远程登录
下一篇: python 面向对象 实现 单链表。# 注释即文档
晚橙
博客等级 码龄9年 8粉丝 14原创
评论 4
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值