zoukankan      html  css  js  c++  java
  • 计算高程与距离

    #!/usr/bin/env python
    # -*- coding: utf-8 -*-
    import math
    import os
    from shapely.geometry import shape, Point
    import json
    
    def pairs(lst):
        """
        yield iterator of two coordinates of linestring
        :param lst: list object
        :return: yield iterator of two coordinates
        """
        for i in range(1, len(lst)):
            yield lst[i - 1], lst[i]
    
        '''
        (lst[0], lst[1])、(lst[1], lst[2])、(lst[2], lst[3])......
        '''
    
    #计算三维空间距离
    def calc_3d_distance_2pts(x1, y1, z1, x2, y2, z2):
        """
        :input two point coordinates (x1,y1,z1),(x2,y2,2)
        :param x1: x coordinate first segment
        :param y1: y coordiante first segment
        :param z1: z height value first coordinate
        :param x2: x coordinate second segment
        :param y2: y coordinate second segment
        :param z2: z height value seconc coordinate
        :return: 3D distance between two input 3D coordinates
        """
        d = math.sqrt((x2 - x1) ** 2 + (y2 - y1) ** 2 + (z2 - z1) ** 2)
        return d
    
    #读取GeoJSON文件
    def readin_json(jsonfile):
        """
        input: geojson or json file
        """
        with open(jsonfile) as json_data:
            d = json.load(json_data)
            return d
    
    
    geoj_27563_file = os.path.realpath("../geodata/velowire_stage_16_27563_utf8.geojson")
    print (geoj_27563_file)
    # create python dict type from geojson file object
    json_load = readin_json(geoj_27563_file)
    
    # set start lengths
    length_3d = 0.0
    length_2d = 0.0
    
    # go through each geometry in our linestring
    for f in json_load['features']:
    
        #将GeoJSON中的Geometry转化成shapely(Geos)中的Geometry
        # create shapely shape from geojson
        s = shape(f['geometry'])
    
        #计算二维空间距离
        # calculate 2D total length
        length_2d = s.length
    
        # set start elevation
        elevation_gain = 0
    
        # go through each coordinate pair
        for vert_start, vert_end in pairs(s.coords):
            line_start = Point(vert_start)
            line_end = Point(vert_end)
    
            # create input coordinates
            x1 = line_start.coords[0][0]
            y1 = line_start.coords[0][1]
            z1 = line_start.coords[0][2]
            x2 = line_end.coords[0][0]
            y2 = line_end.coords[0][1]
            z2 = line_end.coords[0][2]
    
            # calculate 3d distance
            distance = calc_3d_distance_2pts(x1, y1, z1, x2, y2, z2)
    
            # sum distances from vertex to vertex
            length_3d += distance
    
            # calculate total elevation gain
            if z1 > z2:
                elevation_gain = ((z1 - z2) + elevation_gain )
                z2 = z1
            else:
                elevation_gain = elevation_gain  # no height change
                z2 = z1
    
    
    print ("total elevation gain is: {gain} meters".format(gain=str(elevation_gain)))
    
    # print coord_pair
    distance_3d = str(length_3d / 1000)
    distance_2d = str(length_2d / 1000)
    dist_diff = str(length_3d - length_2d)
    
    print ("3D line distance is: {dist3d} meters".format(dist3d=distance_3d))
    print ("2D line distance is: {dist2d} meters".format(dist2d=distance_2d))
    print ("3D-2D length difference: {diff} meters".format(diff=dist_diff))
  • 相关阅读:
    Windows 7 SP1无人值守自动应答文件制作
    Ubuntu GNOME单击任务栏图标最小化设置
    NOIP2017题解
    NOIP2017游记
    大模拟1.0
    奇袭
    礼物
    找硬币
    Fiolki
    SQLserver Delete from where 与Oracle delete from where 的差异
  • 原文地址:https://www.cnblogs.com/gispathfinder/p/5789982.html
Copyright © 2011-2022 走看看