![](/img/trans.png)
[英]Plot a surface with lists of latitude, longitude and elevation data (hillshading)
[英]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()
z
。 z
数据应该是一个二维列表。 x
和y
坐标可以是一维列表或 {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.