计算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" + "\n")
        # 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)) + ‘\n‘)

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)
时间: 2024-11-07 04:07:00

计算DEM上的Profile图的相关文章

C# 计算地图上某个坐标点的到多边形各边的距离

原文:C# 计算地图上某个坐标点的到多边形各边的距离 在判断了某个坐标点是否在多边形内后,还有另一个需求就是当我这个坐标点在多边形外部时,我需要计算这个坐标点到多边形的距离是否在一个允许的误差范围内 通过两个位置的经纬度坐标计算距离(C#版本) 转自:https://blog.csdn.net/jasonsong2008/article/details/78423496 经纬坐标系中求点到线段距离的方法 转自C语言版本: https://blog.csdn.net/ufoxiong21/arti

计算地球上两个坐标点(经度,纬度)之间距离sql函数

go --计算地球上两个坐标点(经度,纬度)之间距离sql函数 --作者:lordbaby --整理:www.aspbc.com CREATE FUNCTION [dbo].[fnGetDistance](@LatBegin REAL, @LngBegin REAL, @LatEnd REAL, @LngEnd REAL) RETURNS FLOAT AS BEGIN --距离(千米) DECLARE @Distance REAL DECLARE @EARTH_RADIUS REAL SET @

计算球面上经纬度坐标方法比较

计算球面上的两点(坐标为经纬度)之间的距离可以直接通过公式计算得到,也可以先将经纬度坐标转化为墨卡托投影坐标来,然后用平面中两点之间的距离公式来计算. 在网上找了一些代码,然后简单进行了测试,发现前者精度更高: 资料来源:http://0414.iteye.com/blog/2039199 http://blog.sina.com.cn/s/blog_8ab3b2cf0100xd69.html 1 package com.suncreate.spatialquery.web.utils; 2 3

帝国CMS7.2新增多图同时上传插件,上传多图效率更高

原来上传多图文件,需要挨个选择文件,然后再点批量上传,比较麻烦.所以帝国CMS7.2新增了多图上传插件:为采用FLASH方式实现同时选择多个图片一起上传,提高多图上传效率. 帝国CMS多图上传插件特性如下: 1.采用FLASH方式实现同时选择多个图片一起上传. 2.多图插件安装后,在以下3个地方可以使用: (1).信息上传图片时; (2).图集字段morepic上传图片时; (3).编辑器多图片上传时. 3.上传图片后显示格式采用单独模板文件,用户可自行修改返回格式模板文件,很个性化. 4.本插

C# 计算地图上某个坐标点的是否在多边形内

原文:C# 计算地图上某个坐标点的是否在多边形内 这个方法引用自群友的博客 https://www.xiaofengyu.com/?p=143 使用百度地图的时候,常常会用到判断一个点是否在一个多边形的范围内,该方法用到的是射线法, 通过修改Javascrpit的代码过来的,射线法的意思就是从点出发和任意的一边的交叉点数为奇数则为在改区域内, 参考文档http://erich.realtimerendering.com/ptinpoly/ public class location { publ

移动端上轮播图无缝滚动原理

和pc上的不同点是,在移动端,用户按下一张图我们不知道用户会往哪里划,往左往右都有可能 假设两组完全一样的图,每组三个 第一张图和张图有被拖出去风险 解决办法,当手指按到第一张图的时候,立马把它变成第四张图, 当手指按到第六张图的时候,立马把它变成第三张图 这样就不会有被拖出去的风向 再说一下querySelectorAll()选择器的问题 当下面的东西改了,这个选择器不会重新计算,多少个还是多少个 所以要用querySelectorAll一定是当整个dom都修改完了才用这个选择器

有效防止softmax计算时上溢出(overflow)和下溢出(underflow)的方法

<Deep Learning>(Ian Goodfellow & Yoshua Bengio & Aaron Courville)第四章「数值计算」中,谈到了上溢出(overflow)和下溢出(underflow)对数值计算的影响,并以softmax函数和log softmax函数为例进行了讲解.这里我再详细地把它总结一下. 『1』什么是下溢出(underflow)和上溢出(overflow) 实数在计算机内用二进制表示,所以不是一个精确值,当数值过小的时候,被四舍五入为0,这

【Android源码解析】--选择多张图片上传多图预览

最近做了选择多图并且上传服务器,在网上找了一些demo,适当的做了一下调整,用过了不能忘记,记下来以后还能多看看,本人觉得自己的博客有些渣渣,还希望大家不要介意啊,哪里有错误希望大家及时指正. 好了下面具体的分析一下:(想要做出功能,需求分析是必不可少的,需求.逻辑弄懂了再上手写代码,思路会很清晰的) 1.多图上传首先得选择图片(这里项目需求是既可以拍照上传也可以从相册中选择) 2.拍照上传很简单了网上也有很多例子,调用照相机,返回uri,获取图片 3.从相册中选择图片 3.1 获取手机中的所有

相机拍的图,电脑上画的图,word里的文字,电脑屏幕,手机屏幕,相机屏幕显示大小一切的一切都搞明白了!

先说图片X×dpi=点数dotX是图片实际尺寸,简单点,我们只算图片的高吧,比如说拍了张图片144×144 72dpi,那么它的实际高就是144÷72=2吋dpi是每吋点数,在相机拍出一张图片之后它的dpi就确定了(右键属性摘要里就能看),比如最常见的72dpi,还说上面提到的144×144 72dpi的图片,72dpi的意思是说如果也按照72dpi打印图片的话打印出来还是高2吋(X)的可是我们经常最到的情况是输入设备dpi和输出设备dpi不一致的情况,比如对这张144×144 72dpi的图片