绘制断层线,无需将每条线连接在一起

2024-04-28 10:31:20 发布

您现在位置:Python中文网/ 问答频道 /正文

我有两张纬度和经度的列表,代表了构成地质断层的一堆点。我试图制作一个地图(通过Basemap)将这些断层显示为线,但是,使用pyplot.plot图功能,这些点将连接相距数英里的故障,我不希望这样。你知道吗

plot showing faults along a map connected by lines 到目前为止,我所做的只是把点做得很大,这样看起来就像是一堆线,但当我放大时,它显然是点而不是线。你知道吗

plot showing fault lines as many points, making it look like lines

知道构成单一断层的这些点之间相隔50米也可能有用。最初我有一个代码,我用大圆工具确定了这些点之间的距离,并创建了一个新的距离列表:

f_distance = []
c = 0
for i,j in zip(fault_lat,fault_lon):
    while c < (len(fault_lon)-1):
        location1 = (fault_lat[c],fault_lon[c])
        location2 = (fault_lat[c+1],fault_lon[c+1])
        distance = great_circle(location1,location2).meters
        f_distance.append(distance)
        c+=1

如果这个距离小于或等于50,它将绘制它们,并且(希望)绘制它们之间的线,否则它将跳过它。你知道吗

c = 0
for i,j,k in zip(map_q_fault_lon,map_q_fault_lat,q_fault_distance):
    if k <= 50:
         map.plot(i,j,linestyle = '-',linewidth = 1.00,color = 'black')
    c+=1

但遗憾的是,它只是给了我一个空白屏幕。有没有什么我可以重做,这样它将做什么我要求的?你知道吗


Tags: in距离map列表forplot绘制zip
2条回答

对于50米的距离,你真的不需要一个很好的近似圆距离。我假设fault_latfault_lon是以弧度表示的numpy数组。如果不是,请将其转换为:

fault_lat = np.radians(fault_lat)
fault_lon = np.radians(fault_lon)

现在你可以用一个简单的公式计算距离,这个公式包括地球的半径和适当的纬度比例:

 r = 6378000
 dist = r * np.sqrt(np.diff(fault_lat)**2 + (np.diff(fault_lon) * np.cos(0.5 * (fault_lat[1:] + fault_lat[:-1])))**2)

这将创建连续点之间(近似)距离的索引。可以在距离超过某个阈值(如50米)的位置拆分结果:

threshold = 50
indices = np.flatnonzero(dist > threshold) + 1
lat_segments = np.split(fault_lat, indices)
lon_segments = np.split(fault_lon, indices)

您可以使用以下公式绘制结果:

for lat, lon in zip(lat_segments, lon_segments):
    map.plot(lon, lat)

你离得很近,你只需要把当前的点和上一个或下一个点传递到plot()。如果你把过滤循环改成

for ii in range(len(map_q_fault_lon)):
    if q_fault_distance[ii] <= 50 and ii > 0:
        map.plot(map_q_fault_lon[ii-1:ii+1], map_q_fault_lat[ii-1:ii+1], 'k-', lw=1.0)

您应该看到所需的过滤。以下是此方法的结果和一些生成的数据:

enter image description here

相关问题 更多 >