首页 > 其他分享 >个人记录:TIF文件内部坐标系wgs84转gcj02

个人记录:TIF文件内部坐标系wgs84转gcj02

时间:2024-10-16 10:36:41浏览次数:1  
标签:dataset wgs84 gcj02 sin TIF pi tif math

第一步安装Anaconda 这里就不赘述了

第二步创建环境

创建python环境,指定版本号
conda create --name test python=3.12.3 test指的是环境名,python指的是当前python的系统版本
激活python环境
activate test
安装gdal
conda install -c conda-forge gdal

第三步复制代码

import math
from osgeo import gdal, osr

# GCJ-02 坐标系转换算法(由 WGS-84 转为 GCJ-02)
def wgs84_to_gcj02(lng, lat):
    a = 6378245.0
    ee = 0.00669342162296594323
    pi = math.pi

    def transform_lat(x, y):
        ret = -100.0 + 2.0 * x + 3.0 * y + 0.2 * y * y + 0.1 * x * y + 0.2 * math.sqrt(abs(x))
        ret += (20.0 * math.sin(6.0 * x * pi) + 20.0 * math.sin(2.0 * x * pi)) * 2.0 / 3.0
        ret += (20.0 * math.sin(y * pi) + 40.0 * math.sin(y / 3.0 * pi)) * 2.0 / 3.0
        ret += (160.0 * math.sin(y / 12.0 * pi) + 320 * math.sin(y * pi / 30.0)) * 2.0 / 3.0
        return ret

    def transform_lng(x, y):
        ret = 300.0 + x + 2.0 * y + 0.1 * x * x + 0.1 * x * y + 0.1 * math.sqrt(abs(x))
        ret += (20.0 * math.sin(6.0 * x * pi) + 20.0 * math.sin(2.0 * x * pi)) * 2.0 / 3.0
        ret += (20.0 * math.sin(x * pi) + 40.0 * math.sin(x / 3.0 * pi)) * 2.0 / 3.0
        ret += (150.0 * math.sin(x / 12.0 * pi) + 300.0 * math.sin(x / 30.0 * pi)) * 2.0 / 3.0
        return ret

    def out_of_china(lng, lat):
        return not (73.66 < lng < 135.05 and 3.86 < lat < 53.55)

    if out_of_china(lng, lat):
        return lng, lat

    dlat = transform_lat(lng - 105.0, lat - 35.0)
    dlng = transform_lng(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

# 使用 GDAL 读取和转换 GeoTIFF 坐标系
def convert_tif_to_gcj02(input_tif, output_tif):
    # 读取 .tif 文件
    dataset = gdal.Open(input_tif)
    if dataset is None:
        print("无法打开文件")
        return

    # 获取原始投影和地理变换
    proj_wkt = dataset.GetProjection()
    geotransform = dataset.GetGeoTransform()

    # 原始坐标系(假设为 WGS84)
    source = osr.SpatialReference()
    source.ImportFromWkt(proj_wkt)

    # 创建 GCJ-02 的自定义投影 (以 WGS-84 为基础)
    target = osr.SpatialReference()
    target.ImportFromEPSG(4326)  # EPSG 4326 为 WGS84

    # 获取图像的宽度、高度
    width = dataset.RasterXSize
    height = dataset.RasterYSize

    # 获取原始图像的地理范围
    minx = geotransform[0]
    maxy = geotransform[3]
    maxx = minx + width * geotransform[1]
    miny = maxy + height * geotransform[5]

    # 转换左上角和右下角的坐标
    min_gcj02 = wgs84_to_gcj02(minx, miny)
    max_gcj02 = wgs84_to_gcj02(maxx, maxy)

    # 设置新的地理变换信息
    new_geotransform = (min_gcj02[0], geotransform[1], geotransform[2], max_gcj02[1], geotransform[4], geotransform[5])

    # 创建新的 TIFF 文件
    driver = gdal.GetDriverByName('GTiff')
    new_dataset = driver.CreateCopy(output_tif, dataset)

    # 设置新的投影和地理变换
    new_dataset.SetGeoTransform(new_geotransform)
    new_dataset.SetProjection(target.ExportToWkt())

    # 关闭文件
    new_dataset.FlushCache()
    new_dataset = None
    dataset = None

    print("转换完成,保存为: " + output_tif)

# 示例:转换文件
input_tif = r'D:\BaiduNetdiskDownload\123.tif'
output_tif = r'D:\BaiduNetdiskDownload\123_gcj03.tif'
convert_tif_to_gcj02(input_tif, output_tif)

第四步执行代码

python D:\123\PYproject\84togcj02.py

标签:dataset,wgs84,gcj02,sin,TIF,pi,tif,math
From: https://www.cnblogs.com/pinwei/p/18469283

相关文章

  • No space left on device or exceeds fs.inotify.max_user_watches?
     sudosysctl-n-wfs.inotify.max_user_watches="99999999"fs.inotify.max_queued_events:表示调用inotify_init时分配给inotifyinstance中可排队的event的数目的最大值,超出这个值的事件被丢弃,但会触发IN_Q_OVERFLOW事件。fs.inotify.max_user_instances:表示每一个realuse......
  • OSCP(Offensive Security Certified Professional)考证全...
     一、OSCP认证是什么?首先介绍下OSCP认证,目前安全技术类的证书有很多,像是CEH,Security+,CISSP等等。除了众多侧重于笔试的安全认证,OSCP(OffensiveSecurityCertifiedProfessional)是为数不多得到国际认可的安全实战类认证。目前在国外受到广泛认可,在台湾、香港等地区也比较......
  • Spotify v8.10.9.722 安卓流媒体音乐播放APP解锁高级版
    SpotifyforAndroid安卓APP流媒体音乐播放软件高级版是一款流行的音乐串流服务软件,用户可以通过它免费或付费收听音乐、播客和电台。Spotify应用程序可以在计算机、手机、平板电脑、车载系统和游戏机等多种设备上使用。Spotify平台上有数百万首歌曲和播客可供用户选择,用户可......
  • scientifically practice DP
    Iunderstandyourfrustration,andit'sacommonfeelingwhentacklingcomplexproblemslikethis.Findingtheseinsightsoftencomesdowntoacombinationofexperience,practice,andasystematicapproachtoproblem-solving.Here'showyoucan......
  • 人工智能(Artificial Intelligence,简称AI)
    人工智能(ArtificialIntelligence,简称AI)是一种模拟人类智能的科学与技术,它通过模拟人类的思维和行为,实现智能化的计算机系统。人工智能在现代科技中的应用越来越广泛,涵盖了各个领域。在医疗领域,人工智能可以用于辅助诊断和治疗。通过分析大量的医疗数据和图像,人工智能可以提高......
  • Python爬虫快速入门(Requests+BeautifulSoup+Scrapy)
    目录1.为什么需要爬虫2.爬虫的方法2.1Requests2.2BeautifulSoup2.3Scrapy3.爬虫的注意事项1.为什么需要爬虫    爬虫是重要的数据获取方式,理论上任何网上公开可视的数据都是可以获取到的。在学术研究等场合中除了使用直接的数据集以及各种搜索引擎提......
  • [ABC222H] Beautiful Binary Tree 题解
    第一次写拉格朗日反演。思路考虑如何操作。发现出根节点外有\(n-1\)个点是一。由于我们只能操作\(n-1\)次,相当于每一次操作必须把两个一合并。一个点最多往上跳两层,所以要求它的父亲或者爷爷是一。考虑设\(f_i\)表示当前节点为一并且整个子树总和为\(i\)的方案数,\(g......
  • inotifywait监控文件夹内容变化,实时异地同步
    inotifywait监控文件夹内容变化,实时异地同步1.服务器规划2.实现效果演示3.服务器初始化3.1主机名修改3.2hosts配置3.3免密认证配置3.4inotify、rsync安装3.5验证是否安装完成4.脚本1.服务器规划主机名IP描述main172.16.32.3主服务器backup172.16.32.4数据......
  • RecyclerView notifyItemRemoved导致位置错乱的问题
    RecyclerView的刷新分为内容变化和结构变化,结构变化比如remove和insert等并不会导致viewholder的更新,所以有时候我们使用notifyItemRemoved(position);或者使用notifyItemInserted(position);item的位置并没有发生改变,或者位置发生错乱,很是奇怪诡异,需要重新调用notifyDa......
  • 解决ERROR ResizeObserver loop completed with undelivered notifications.
    https://www.cnblogs.com/luo9tian/p/18116299该报错虽然不影响项目运行,但是影响开发效率,总是弹出报错的黑框很烦人该报错原因:newResizeObserver包裹的方法,在布局发生变化时,不支持每帧都调用解决方法:用window.requestAnimationFrame包裹回调函数在App.vue/main.js中加......