Как классифицировать точки по определенной полилинии - PullRequest
0 голосов
/ 27 февраля 2019

Внутри Китая есть граница, которая делит регион на Север-Юг.Я нарисовал эту границу как шейп-файл в формате полилинии Ссылка для скачивания .

Я хочу разделить эти точки на следующих рисунках на «Север» и «Юг».Есть ли полезная функция в Python, чтобы достичь этого

fiona имеет функцию point.within для проверки точек в / из многоугольника, но я не искал подходящую функцию для разделения нескольких точек по полилинии.

Буду признателен за любые советы или подсказки!

enter image description here

обновлено

В соответствии с ценным предложением, сделанным 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)   

enter image description here

1 Ответ

0 голосов
/ 27 февраля 2019

Вы можете применить простое свойство из топологии.

Сначала убедитесь, что ваша граница разделяет юниверс (все доступные точки, с которыми вы имеете дело).Возможно, вам придется расширить границу через океан, чтобы закончить это.

Теперь, выберите любую контрольную точку, которая помечена как для региона - чтобы определить «Север» и «Юг», вы должны иметь по крайней мереодин такой момент.wlog предположим, что это «южная» точка с именем Z.

Теперь для каждой точки A, которую вы хотите классифицировать, нарисуйте непрерывный путь (прямой обычно проще, но не обязателен) из *От 1009 * до Z.Найти пересечения этого пути с границей.Если у вас четное количество пересечений, то A относится к тому же классу («Юг»), что и Z;с другой стороны, он находится в другом классе («Север»).

Обратите внимание, что для этого требуется топологическое свойство «разбиение» - нет касательных к граничной линии: если ваш путь касается границы, ондолжен полностью пересечь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...