解析高程数据asc文件

本文主要针对通过python获取高程数据asc文件中的经纬度信息
实现思路,通过解析asc将其转换为tif,处理tif最终获取最大最小经纬度,用于获取地图边界。
asc文件
在这里插入图片描述
python代码

# coding UTF-8
# author:ablue
import json
import sys
import os
# 支持中文
from pylab import *
from osgeo import osr, gdal

ascInfo = []


# ascdir asc文件目录
# parseFile 需要解析的文件
def ascii2tif(
        ascdir: str,
        parseFile: str
) -> None:
    # (1) 创建输出文件夹
    outpath = ascdir + '\TiffFile'

    # (2) 格式转换
    ascii_file_folder, ascii_file_name = os.path.split(parseFile)
    # 输出文件
    tif_file_path = outpath + '\\' + ascii_file_name.replace('.asc', '.tif')
    with open(parseFile, 'r') as f:
        lines = f.readlines()
        count = 0
        for line in lines:
            if count <= 4:
                ascInfo.append(re.findall("\d+\.?\d*", line))
            count += 1
    # 打开ascii文件
    ds_in = gdal.Open(parseFile)
    gtiff_driver = gdal.GetDriverByName('GTiff')  # 启动Gtiff驱动
    ds_out = gtiff_driver.CreateCopy(tif_file_path, ds_in)

    srs = osr.SpatialReference()
    srs.ImportFromEPSG(4326)
    ds_out.SetProjection(srs.ExportToWkt())

    ds_in = None
    ds_out = None
    gtiff_driver = None  # 关闭驱动

    return tif_file_path


def saveAreaJson(tif_path):
    dataset = gdal.Open(tif_path)  # 打开tif

    # 获取行数列数和地理信息
    # geo_information(0) :左上像素左上角的x坐标。
    # geo_information(1):w - e像素分辨率 / 像素宽度。
    # geo_information(2):行旋转(通常为零)。
    # geo_information(3):左上像素左上角的y坐标。
    # geo_information(4):列旋转(通常为零)。
    # geo_information(5):n - s像素分辨率 / 像素高度(北半球上图像为负值)
    geo_information = dataset.GetGeoTransform()
    col = dataset.RasterXSize  # 438
    row = dataset.RasterYSize  # 671
    band = dataset.RasterCount
    dem = dataset.GetRasterBand(1).ReadAsArray()
    # 获取行列数,对应其经纬度,j对于x坐标
    cols = []
    maxLon = 0
    maxLat = 0
    for y in range(row):  # 行
        for x in range(col):  # 列
            # 有效高程
            if dem[y][x] > 0:
                # 输出经纬度
                lon = geo_information[0] + x * geo_information[1] + y * geo_information[2]
                lat = geo_information[3] + x * geo_information[4] + y * geo_information[5]
                if lon != None:
                    child = [lon, lat]
                    cols.append(child)

                    if lon > maxLon:
                        maxLon = lon
                    if lat > maxLat:
                        maxLat = lat

    minLon = cols[0][0]
    minLat = cols[0][1]

    for col in cols:
        lon = col[0]
        lat = col[1]

        if lon < minLon:
            minLon = lon
        if lat < minLat:
            minLat = lat

    areaJson = {
        "centerLon": ascInfo[2][0],
        "centerLat": ascInfo[3][0],
        "minLon": str(minLon),
        "minLat": str(minLat),
        "maxLon": str(maxLon),
        "maxLat": str(maxLat)
    }
    print("_end", areaJson)

    # 输出的json文件与tif同目录
    with open(tif_path + '.json', 'w', encoding='utf-8') as outfile:
        json.dump(areaJson, outfile, ensure_ascii=False)


if __name__ == "__main__":
    # 将asc转换成tif文件  1.目录 2.文件
    tif_path = ascii2tif(r"E:\project\ASC", r"E:\project\ASC\xx.asc")
    # 通过外部参数传递
    # tifPath = ascii2tif(sys.argv[1], sys.argv[2])
    # 解析tif文件并输出json
    saveAreaJson(tif_path)


  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Python是一种广泛应用于数据分析和科学计算的编程语言,它提供了丰富的库和工具来解析ASC文件。 首先,我们可以使用Python中的内置库`open`函数打开ASC文件,读取其中的内容。例如,假设我们要解析一个名为`data.asc`的ASC文件,可以使用以下代码: ```python with open('data.asc', 'r') as file: content = file.read() ``` 然后,我们需要解析ASC文件的具体内容。ASC文件通常包含了网格数据或者点云数据。对于网格数据,可以使用`numpy`库来处理和分析数据。假设ASC文件包含了一个2D网格,并且每个数据点位于不同的行和列中,可以使用以下代码将其解析为一个`numpy`数组: ```python import numpy as np data = [] for line in content.splitlines(): row = line.split() data.append(row) grid = np.array(data, dtype=float) ``` 对于点云数据,我们可以使用`pandas`库来解析和处理。假设ASC文件包含了x、y和z三个坐标,并且以空格或者制表符分隔,可以使用以下代码将其解析为一个`pandas`数据框: ```python import pandas as pd data = [] for line in content.splitlines(): row = line.split() data.append(row) df = pd.DataFrame(data, columns=['x', 'y', 'z']) ``` 最后,我们可以使用解析好的数据进行进一步的分析、可视化或其他操作。例如,对于网格数据,我们可以使用`pyplot`库绘制热力图: ```python import matplotlib.pyplot as plt plt.imshow(grid, cmap='hot') plt.colorbar() plt.show() ``` 总之,使用Python解析ASC文件相对简单。我们只需使用内置库或第三方库对ASC文件进行读取和解析,然后根据需要进行进一步处理和分析。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值