【问题标题】:Plot a surface with lists of latitude, longitude and elevation data (hillshading)绘制带有纬度、经度和高程数据列表的表面(山体阴影)
【发布时间】:2017-03-31 02:03:12
【问题描述】:

我在 matplotlib 网站上找到了这个脚本:

"""
Demonstrates using custom hillshading in a 3D surface plot.
"""
from mpl_toolkits.mplot3d import Axes3D
from matplotlib import cbook
from matplotlib import cm
from matplotlib.colors import LightSource
import matplotlib.pyplot as plt
import numpy as np

filename = cbook.get_sample_data('jacksboro_fault_dem.npz', asfileobj=False)
with np.load(filename) as dem:
    z = dem['elevation']
    nrows, ncols = z.shape
    x = np.linspace(dem['xmin'], dem['xmax'], ncols)
    y = np.linspace(dem['ymin'], dem['ymax'], nrows)
    x, y = np.meshgrid(x, y)

region = np.s_[5:50, 5:50]
x, y, z = x[region], y[region], z[region]

fig, ax = plt.subplots(subplot_kw=dict(projection='3d'))

ls = LightSource(270, 45)
# To use a custom hillshading mode, override the built-in shading and pass
# in the rgb colors of the shaded surface calculated from "shade".
rgb = ls.shade(z, cmap=cm.gist_earth, vert_exag=0.1, blend_mode='soft')
surf = ax.plot_surface(x, y, z, rstride=1, cstride=1, facecolors=rgb,
                       linewidth=0, antialiased=False, shade=False)

plt.show()

他们使用文件jacksboro_fault_dem.npz 绘制高程数据并得到类似的结果:

感谢 Google 地球,我能够获得文本文件 maido_elevation_data.txt,其中包含以下区域(Maïdo,留尼汪岛)的纬度、经度和海拔数据:

我做了一个函数来从文本文件中为每个坐标获取 3 个列表:

from mpl_toolkits.mplot3d import Axes3D
import matplotlib.pyplot as plt

def get_LAT_LONG_ALT(text_file):
    ch=""
    LAT=[]
    LONG=[]
    ALT=[]
    with open(text_file,"r") as fich:
        for ligne in fich:
            for e in ligne:
                ch+=e
            liste=ch.replace("\n","").split("\t")
            LAT.append(float(liste[0]))
            LONG.append(float(liste[1]))
            ALT.append(float(liste[2]))
            ch=""
    return LAT,LONG,ALT

fig = plt.figure()
axes = fig.add_subplot(111, projection="3d")

X = get_LAT_LONG_ALT("maido_elevation_data.txt")[0]
Y = get_LAT_LONG_ALT("maido_elevation_data.txt")[1]
Z = get_LAT_LONG_ALT("maido_elevation_data.txt")[2]

axes.scatter(X,Y,Z, c="r", marker="o")

axes.set_xlabel("Latitude")
axes.set_ylabel("Longitude")
axes.set_zlabel("Altitude")

plt.show()

我应该如何修改脚本才能像他们一样使用我自己的数据获得良好的曲面图?

PS:我会给你cmets中文件的链接,因为我不能放超过2个链接......是的,我是新人:)

【问题讨论】:

标签: python google-maps matplotlib plot 3d


【解决方案1】:

您应该重塑您的数据,它是一个三列数据 x、y 和 z 您应该有一个文件,二维表中只有 z 值,列是 x,行是 y。 python中的Meshgrid功能应该会有所帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-18
    • 2019-02-08
    • 1970-01-01
    • 2012-07-09
    • 2012-03-29
    • 1970-01-01
    相关资源
    最近更新 更多