【问题标题】:How to classify the points by a specific polylline如何通过特定的折线对点进行分类
【发布时间】:2019-02-27 17:34:25
【问题描述】:

中国境内有一条分界线,将地区划分为南北。我已将此边界绘制为折线格式 shapefile Download link

我想将下图中的这些点分为“北”和“南”。 Python中是否有任何有用的功能可以实现这一点。

fiona 具有 point.within 函数来测试多边形内/外的点,但我还没有搜索到合适的函数来通过折线划分多个点。

任何建议或提示将不胜感激!

更新

根据Prune提出的宝贵建议,我解决了。提供的代码如下:

from shapely.geometry import shape
from shapely.geometry import LineString
# loading the boundary layer
import fiona
fname = './N-S_boundary.shp'
line1 = fiona.open(fname)
line1 = shape(line1.next()['geometry']) 
# set a end point which is the southernmost for all stations. 
end_point  = (dy[dy['lat']==dy['lat'].min()]['lon'].values[0],dy[dy['lat']==dy['lat'].min()]['lat'].values[0])
# loop all monitoring stations for classification
dy['NS']= np.nan
for i in range(0,len(dy),1):
    start_point = (dy['lon'].iloc[i],dy['lat'].iloc[i])
    line2       = LineString([start_point, end_point])
    if line1.intersection(line2).is_empty:
        dy["NS"].iloc[i]='S'
    else:
        dy["NS"].iloc[i]='N'     
color_dict= {'N':'steelblue','S':'r'}
dy['site_color']=dy['NS'].map(color_dict)   

【问题讨论】:

    标签: python gis shapefile shapely fiona


    【解决方案1】:

    您可以应用拓扑中的简单属性。

    首先,确保您的边界划分了宇宙(您正在处理的所有可用点)。您可能需要将边界延伸到海洋中才能完成。

    现在,选择任何标记为区域的参考点——要定义“北”和“南”,您必须至少有一个这样的点。 w.l.o.g.假设它是一个名为Z 的“南”点。

    现在,对于您要分类的每个点A,绘制一条从AZ 的连续路径(直线通常最简单,但不是必需的)。找到这条路径与边界的交点。如果您有偶数个交叉点,则AZ 属于同一类(“南”);否则,它属于另一个类(“North”)。

    请注意,这需要“分区”的拓扑属性 - 边界线没有切线:如果您的路径接触边界,它必须完全交叉。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-10-21
      • 1970-01-01
      • 2021-07-01
      • 1970-01-01
      • 2018-01-19
      • 2018-12-06
      • 2016-09-12
      相关资源
      最近更新 更多