绘制故障线而不将每条线连接在一起
Plotting fault lines without connecting every line together
我有两个纬度和经度列表,代表构成地质断层的一堆点。我正在尝试制作一张地图(通过底图)将这些断层显示为线,但是,使用 pyplot.plot 函数,这些点将连接相距数英里的断层,我不希望这样。
到目前为止,我一直在做的只是让点变得相当大,这样它们看起来就像一堆线,但当我放大时,它显然是点而不是线。
知道构成单个断层的这些点相隔 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
但遗憾的是,它只是给了我一个空白屏幕。无论如何我可以修改它以便它能满足我的要求吗?
你已经很接近了,你只需要同时通过当前点和上一个或下一个指向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)
您应该会看到所需的筛选。这是此方法与一些生成数据的结果:
对于大约 50 米的距离,您确实不需要很大的圆距离来获得良好的近似值。我假设 fault_lat
和 fault_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)
我有两个纬度和经度列表,代表构成地质断层的一堆点。我正在尝试制作一张地图(通过底图)将这些断层显示为线,但是,使用 pyplot.plot 函数,这些点将连接相距数英里的断层,我不希望这样。
知道构成单个断层的这些点相隔 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
但遗憾的是,它只是给了我一个空白屏幕。无论如何我可以修改它以便它能满足我的要求吗?
你已经很接近了,你只需要同时通过当前点和上一个或下一个指向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)
您应该会看到所需的筛选。这是此方法与一些生成数据的结果:
对于大约 50 米的距离,您确实不需要很大的圆距离来获得良好的近似值。我假设 fault_lat
和 fault_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)