经纬度转换 | 基于Python的经纬度与xy坐标(屏幕坐标)相互转换(可批量),并在平面坐标系上以特定点为坐标原点重新建立坐标系,输出各点新坐标

这篇具有很好参考价值的文章主要介绍了经纬度转换 | 基于Python的经纬度与xy坐标(屏幕坐标)相互转换(可批量),并在平面坐标系上以特定点为坐标原点重新建立坐标系,输出各点新坐标。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1. 背景——为什么要转换

用的更多的场景是把经纬度转化为xy平面坐标,因为经纬度是方便我们确定地理位置的,我们可以很容易的从地图数据(可利用高德开放平台)上获取某一个地址它的经纬度,但是我们看到的地图是平面的,所以要利用各种投影把经纬度转换为平面坐标便于我们自己分析~

xy平面坐标转化为经纬度的使用场景不多,但我们可以作为一个验证来运用。

关于如何从一串地址,如“重庆市沙坪坝区沙正街174号”这样的一个文本地址得出它的经纬度,我在之前发在微信的文章里有过介绍,可见:https://mp.weixin.qq.com/s/Z2I2ufb-AB_gQcfTBD6vmg 也可点此跳转

2. 我的操作环境

python3.8
我习惯在jupyter里运行python,大家的pycharm、vs code都可

3. 经纬度和xy平面坐标相互转换----实战

import math
import pandas as pd

#定义经纬度转换为米勒坐标的方法
def millerToXY(lon, lat):
    xy_coordinate = []
    L = 6381372 * math.pi * 2  #地球周长
    W = L  #平面展开,将周长视为X轴
    H = L / 2  #Y轴约等于周长一半
    mill = 2.3  #米勒投影中的一个常数,范围大约在正负2.3之间
    #循环,因为要批量转换
    for x, y in zip(lon, lat):
        x = x * math.pi / 180  # 将经度从度数转换为弧度
        y = y * math.pi / 180  # 将纬度从度数转换为弧度
        y = 1.25 * math.log(math.tan(0.25 * math.pi + 0.4 * y))  # #这里是米勒投影的转换
        x = (W / 2) + (W / (2 * math.pi)) * x  #这里将弧度转为实际距离 ,转换结果的单位是km
        y = (H / 2) - (H / (2 * mill)) * y  # 这里将弧度转为实际距离 ,转换结果的单位是km
        xy_coordinate.append((int(round(x)), int(round(y))))
    
    return xy_coordinate

#xy坐标转换成经纬度的方法(该方法未定义循环,仅能单个坐标转换
def xy_to_coor(x, y):
    lonlat_coordinate = []
    L = 6381372 * math.pi*2
    W = L
    H = L/2
    mill = 2.3
    lat = ((H/2-y)*2*mill)/(1.25*H)
    lat = ((math.atan(math.exp(lat))-0.25*math.pi)*180)/(0.4*math.pi)
    lon = (x-W/2)*360/W
    # TODO 最终需要确认经纬度保留小数点后几位
    lonlat_coordinate.append((round(lon,8),round(lat,8)))
    return lonlat_coordinate

#读取数据文件
df=pd.read_csv('village.DAT',header=None,encoding='utf-8',delimiter=' ') #delimiter=' '代表分隔符是空格
df.to_csv('village.DAT',header=None,encoding='utf-8',sep=' ')

#取一下经纬度的数据
x_data=df.iloc[:,2] #对应第3列数据,即经度数据
y_data=df.iloc[:,3] #对应第4列数据,即纬度数据

#调用经纬度转化为xy坐标方法,直接输出转换后的xy坐标
xy_data=millerToXY(x_data,y_data)
xy_data #直接输出

#调用xy坐标转化为经纬度方法,输出经纬度
print(xy_to_coor(31327850,8251850)) #这里直接随机给了一个xy坐标参数

问题:把经纬度坐标转换为xy平面坐标后,我们会发现新坐标的数值变得非常大,比如(31327850,8251850),这非常不利于我们的可视化过程,比如把各点在一个坐标系上标注出来,那怎么解决呢?
常见的解决方案:我们可以根据原来的经纬度,找一个和所有点靠的比较近,能在一张图上的点,以这个点作为原点,重新建立一个平面的直角坐标系,这样所有点的坐标都会比较好看,不会那么大,也不至于离原点太远。同时需注意这个新坐标原点的选择,可以尽量选在所有点的左下方,这样可以确保咱的坐标都是正数,方便后面分析~文章来源地址https://www.toymoban.com/news/detail-724244.html

4. 在xy平面坐标上,以一个新点为原点,重新建立坐标系,输出各点新坐标

import math
import pandas as pd

#方法:以一个新点为原点,重新建立坐标系,输出各点新坐标
def xyToNew(lon, lat):
    xy_coordinate = []
    #这里给下坐标原点,我是随机选的,使得所有点的坐标都为正,且尽量大于1
    x0=31327850
    y0=8251850
    
    for x, y in zip(lon, lat):
        x = x-x0
        y = y-y0
        xy_coordinate.append((int(round(x)), int(round(y))))
        
    return xy_coordinate

#读取转换成平面坐标后的坐标文件
df=pd.read_csv('xymile.txt',header=None,encoding='utf-8',delimiter=' ')
df.to_csv('xymile.txt',header=None,encoding='utf-8',sep=' ')
#df #可以打印下看看这个df数据有啥

#取一下xy平面坐标系上xy的数据
x_data=df.iloc[:,0] #对应第1列,即x
y_data=df.iloc[:,1] #对应第2列,即y

#调用转换坐标的方法
xy_data=xyToNew(x_data,y_data)
xy_data #直接输出坐标

到了这里,关于经纬度转换 | 基于Python的经纬度与xy坐标(屏幕坐标)相互转换(可批量),并在平面坐标系上以特定点为坐标原点重新建立坐标系,输出各点新坐标的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Unity中实现世界坐标到GPS经纬度的转换解决方案

    在Unity3D中,将世界坐标转换为GPS经纬度是一个常见的需求,特别是在开发基于地理位置的应用程序时。本文将提供一种详细的解决方案,包括相应的源代码,以帮助您实现这一转换。 步骤1:获取参考点的GPS经纬度 首先,您需要获取一个已知GPS经纬度坐标和对应的Unity世界坐

    2024年02月03日
    浏览(45)
  • GPS学习(一):在ROS2中将GPS经纬度数据转换为机器人ENU坐标系,在RVIZ中显示坐标轨迹

    本文记录在Ubuntu22.04-Humbel中使用NMEA协议GPS模块的过程,使用国产ROS开发板鲁班猫(LubanCat )进行调试。 在淘宝找了款性价比较高的轮趣科技GPS北斗双模定位模块作为入门学习使用,支持GNSS系统(北斗、GPS、GLONASS、日本的QZSS以及卫星增强系统SBAS),定位精度在2.5m左右,属于民用

    2024年02月03日
    浏览(68)
  • opendrive-经纬度投影坐标转横轴墨卡托投影坐标

    经纬度投影 xodr文件+proj=latlong,说明需要使用经纬度投影代表x,y xodr文件+proj=tmerc,说明需要使用横轴墨卡托投影(将经纬度投影转为墨卡托投影)代表x,y,z 将经纬度转为墨卡托(UTM)

    2024年01月23日
    浏览(65)
  • Java根据坐标经纬度计算两点距离(5种方法)、校验经纬度是否在圆/多边形区域内的算法推荐

    目录 前言 一、根据坐标经纬度计算两点距离(5种方法) 1.方法一 2.方法二 3.方法三 4.方法四 5.方法五 5.1 POM引入第三方依赖 5.2 代码 6.测试结果对比 二、校验经纬度是否在制定区域内 1.判断一个坐标是否在圆形区域内 2.判断一个坐标是否在一个多边形区域内 3.结果 总结   

    2024年02月10日
    浏览(84)
  • 空间直角坐标系(XYZ)转经纬度(BLH)

    本章首先介绍空间直角坐标系与大地坐标系,然后列出XYZ转换BLH的公式,最后基于C语言完成该部分代码设计。   参考书籍: 董大男,陈俊平,王解先等,GNSS高精度定位原理,科学出版社 黄丁发,熊永良,周乐韬等,GPS卫星导航定位技术与方法,科学出版社。   空间直角坐

    2023年04月15日
    浏览(40)
  • Unity解决:GIS(GPS的经纬度坐标)定位系统坐标转unity坐标(世界坐标)

    目录 一、前言 二、功能实现 三、测试 四、备注  如果要实现该效果的demo,请联系作者 最近项目中用到了第三方的定位系统,有的是使用GPS定位、有的是使用UWB定位。第三方的定位系统把他们的定位信息通过网络发送给Unity,在Unity内实时显示人/设备的移动。因为第三方可

    2024年02月11日
    浏览(120)
  • Arcgis之Python的Arcpy的点线面对象的创建处理和通过pandas读取txt中的经纬度坐标创建几何对象

    前言 本节将介绍点线面对象的创建和处理。创建 点 对象有三个类,分别是 Point 、 Multipoint 、 PointGeometry ,创建 线 对象的类为 Polyline ,创建 面 对象的类为 Polygon 。 一、点对象的创建——Point 点对象经常与光标配合使用。点要素将返回单个点对象而不是点对象数组。而其他

    2024年02月12日
    浏览(52)
  • 【Python&GIS】基于高德Api实现批量地址查询经纬度

            之前因为同事需要几千个小区的经纬度信息,所以就帮同事写了一段Python代码,通过调取高德地图的api实现地址查询经纬度这个功能。对于如何使用经纬度查询地址的方法,我之前分享过博文:【Python入门教程】获取图片可视化精准定位(逆地理编码),如果大家感

    2024年02月03日
    浏览(53)
  • 高德百度腾讯之间经纬度的转换

    提示:这里可以添加本文要记录的大概内容: 提示:以下是本篇文章正文内容,下面案例可供参考 百度地图: 高德地图: 腾讯地图 最后转换结果 可知,高德和腾讯使用的编码方式是一样的,所以最后转换的经纬度基本一样

    2024年02月13日
    浏览(48)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包