繁体   English   中英

从纬度、经度、高程数据绘制 3d 表面图

[英]Plotly 3d surface plot from latitude, longitude, elevation Data

我有以下来自 azure 海拔 API 响应的 dict 格式的海拔数据,我正在尝试根据该数据绘制海拔剖面。

出于此查询的目的,我已将用于样本目的的大小减小到 4x4 纬度/长方形网格区域,实际区域是一个更大的样本。

我正在尝试根据此数据使用 Plotly 生成 3d 曲面图近似值。

我的理解是

1)首先需要将纬度/经度转换为 x,y 坐标? 这样做的最佳方法是什么? 2) 还需要将 Z/ 高程转换为二维数组吗? 基于 x,y 来自 1)?

import plotly.offline as py
import plotly.graph_objs as go
import pandas as pd

elevation = {'data': [{'coordinate': {'latitude': -33.88676483475523,
    'longitude': 150.84667222543544},
   'elevationInMeter': 59.76341},
  {'coordinate': {'latitude': -33.88676483475523,
    'longitude': 150.84689611369265},
   'elevationInMeter': 58.91294},
  {'coordinate': {'latitude': -33.88676483475523,
    'longitude': 150.8471200019499},
   'elevationInMeter': 58.2653},
  {'coordinate': {'latitude': -33.88676483475523,
    'longitude': 150.8473438902071},
   'elevationInMeter': 57.80102},
  {'coordinate': {'latitude': -33.88657811224419,
    'longitude': 150.84667222543544},
   'elevationInMeter': 60.25625},
  {'coordinate': {'latitude': -33.88657811224419,
    'longitude': 150.84689611369265},
   'elevationInMeter': 59.25375},
  {'coordinate': {'latitude': -33.88657811224419,
    'longitude': 150.8471200019499},
   'elevationInMeter': 58.59771},
  {'coordinate': {'latitude': -33.88657811224419,
    'longitude': 150.8473438902071},
   'elevationInMeter': 58.17687},
  {'coordinate': {'latitude': -33.88639138973315,
    'longitude': 150.84667222543544},
   'elevationInMeter': 60.63495},
  {'coordinate': {'latitude': -33.88639138973315,
    'longitude': 150.84689611369265},
   'elevationInMeter': 59.59782},
  {'coordinate': {'latitude': -33.88639138973315,
    'longitude': 150.8471200019499},
   'elevationInMeter': 58.97992},
  {'coordinate': {'latitude': -33.88639138973315,
    'longitude': 150.8473438902071},
   'elevationInMeter': 58.59934},
  {'coordinate': {'latitude': -33.8862046672221,
    'longitude': 150.84667222543544},
   'elevationInMeter': 61.03286},
  {'coordinate': {'latitude': -33.8862046672221,
    'longitude': 150.84689611369265},
   'elevationInMeter': 60.10513},
  {'coordinate': {'latitude': -33.8862046672221,
    'longitude': 150.8471200019499},
   'elevationInMeter': 59.54065},
  {'coordinate': {'latitude': -33.8862046672221,
    'longitude': 150.8473438902071},
   'elevationInMeter': 59.13883}]}


val_x = []
val_y = []
val_z = []

for entry in elevation['data']:
    x, y, zone, ut = utm.from_latlon(entry['coordinate']['latitude'], entry['coordinate']['longitude'])
    val_x.append(x)
    val_y.append(y)
    val_z.append(entry['elevationInMeter'])

    
fig = go.Figure(data=[go.Surface(x=val_x, y=val_y, z=val_z)])
  
fig.update_traces(contours_z=dict(
    show=True, usecolormap=True,
    highlightcolor="limegreen",
    project_z=True))
  
fig.show()

  • https://plotly.com/python/reference/surface/描述表面坐标的数据设置在z z数据应该是一个二维列表。 xy坐标可以是一维列表或 {2D 数组}(例如绘制参数曲面)
  • 这很容易通过使用熊猫塑造您的数据来实现
# load data into dataframe
df = pd.json_normalize(elevation["data"])
# reshape so we have 2D matrix of elevations
df = df.set_index(["coordinate.latitude", "coordinate.longitude"]).unstack(
    "coordinate.longitude"
)
fig = go.Figure(
    go.Surface(z=df.values, y=df.index.values, x=df.columns.get_level_values(1).values)
)
fig.update_traces(
    contours_z=dict(
        show=True, usecolormap=True, highlightcolor="limegreen", project_z=True
    )
).update_layout( margin={"l":0,"r":0,"t":0,"b":0})

在此处输入图片说明

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM