zoukankan      html  css  js  c++  java
  • 计算DEM上的Profile图

    #!/usr/bin/env python
    # -*- coding: utf-8 -*-
    import sys, gdal, os
    from gdalconst import GA_ReadOnly
    from os.path import realpath
    from shapely.geometry import LineString
    
    #根据坐标点计算该点所在栅格上的值
    def get_elevation(x_coord, y_coord, raster, bands, geo_trans):
        """
        get the elevation value of each pixel under
        location x, y
        :param x_coord: x coordinate
        :param y_coord: y coordinate
        :param raster: gdal raster open object
        :param bands: number of bands in image
        :param gt: raster limits
        :return: elevation value of raster at point x,y
        """
        elev_list = []
        x_origin = geo_trans[0]
        y_origin = geo_trans[3]
        pix_width = geo_trans[1]
        pix_height = geo_trans[5]
        #计算栅格点的位置
         x_pt = int((x_coord - x_origin) / pix_width)
        y_pt = int((y_coord - y_origin) / pix_height)
        for band_num in range(bands):
            ras_band = raster.GetRasterBand(band_num + 1)
            #计算栅格点的值
             ras_data = ras_band.ReadAsArray(x_pt, y_pt, 1, 1)
            elev_list.append(ras_data[0][0])
        return elev_list
    
    
    def write_to_csv(csv_out, profil_x_z):
        # check if output file exists on disk if yes delete it
        if os.path.isfile(csv_out):
            os.remove(csv_out)
    
        # create new CSV file containing X (distance) and Z value pairs
        with open(csv_out, 'a') as outfile:
            # write first row column names into CSV
            outfile.write("distance,elevation" + "
    ")
            # loop through each pair and write to CSV
            for x, z in profil_x_z:
                outfile.write(str(round(x, 2)) + ',' + str(round(z, 2)) + '
    ')
    
    
    if __name__ == '__main__':
        # set directory
        in_dem = realpath("../geodata/dem_3857.dem")
    
        # open the image
        ds = gdal.Open(in_dem, GA_ReadOnly)
    
        if ds is None:
            print('Could not open image')
            sys.exit(1)
    
        # get raster bands
        bands = ds.RasterCount
    
        # get georeference info
        transform = ds.GetGeoTransform()
    
        # line defining the the profile
        line = LineString([(-13659328.8483806, 6450545.73152317), (-13651422.7820022, 6466228.25663444)])
        # length in meters of profile line
        length_m = line.length
    
        # lists of coords and elevations
        x = []
        y = []
        z = []
        # distance of the topographic profile
        distance = []
        #每隔20取一个点
        for curent_dist in range(0, int(length_m), 20):
            #利用线性分段计算点的坐标
             # creation of the point on the line
            point = line.interpolate(curent_dist)
            xp, yp = point.x, point.y
            x.append(xp)
            y.append(yp)
            #获取该点的高程值
            # extraction of the elevation value from the MNT
            z.append(get_elevation(xp, yp, ds, bands, transform)[0])
            distance.append(curent_dist)
    
        print (x)
        print (y)
        print (z)
        print (distance)
    
        # combine distance and elevation vales as pairs
        profile_x_z = zip(distance, z)
    
        csv_file = os.path.realpath('../geodata/output_profile.csv')
        # output final csv data
        write_to_csv(csv_file, profile_x_z)
  • 相关阅读:
    Spring AOP 实现原理
    Spring Aop实现方式总结
    Spring Aop重要概念介绍及应用实例结合分析
    Spring Aop
    常见的排序算法
    MINA2.0原理
    Java和Tomcat类加载机制
    Java 8 新特性概述
    Java类加载机制深度分析
    jetty之建立多Connector
  • 原文地址:https://www.cnblogs.com/gispathfinder/p/5790096.html
Copyright © 2011-2022 走看看