#!/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))