Как я обобщил бы несколько смежных полигонов?

Если вы знаете, что размер вашего jac_sim не изменится, вы всегда будете знать, где находятся числа индивидов, поэтому вы можете сделать два разброса, используя разные срезы данных:

mds = MDS(n_components=2, dissimilarity='precomputed')
X_r = mds.fit(jac_sim).embedding_
plt.figure()
plt.scatter(X_r[:3:,0],X_r[:3:,1],c="red")
plt.scatter(X_r[3::,0],X_r[3::,1],c="blue")
plt.savefig((args.Directory + "/MDS2.svg"), format = "svg")
8
задан Community 8 February 2017 в 14:10
поделиться

3 ответа

Я не уверен, как Вы получили бы "общий" LineStrings от своих форм. Во-вторых, после того как Вы уменьшаете "подмножество" формы, так как Ваши конечные точки могут переместиться из оригинала, и Вы не сможете заставить их совпасть после сокращения.

Ореховая скорлупа того, что я сделал бы, в основном использовать логические операции для проигрывания с уменьшенными формами.

Во-первых, сделайте то, что Вы делаете, а именно, составьте временную таблицу уменьшенных форм (названный #ReducedShapes).

Затем я составил бы вторую временную таблицу и нашел бы области перекрытия (использование STIntersection) между всеми формами. В этой таблице у меня в основном были бы столбцы naam1, naam2 и intsec, причем последний имеет форму типа. Что-то как (непротестированный):

INSERT INTO #IntSecs(naam1, naam2, intsec)
SELECT s1.naam, s2.naam, s1.naam.STIntersection(s2.naam)
FROM #ReducedShapes s1, #ReducedShapes s2 
WHERE s1.naam.STIntersection(s2.naam) IS NOT NULL

Это получает Вас список того, где пары форм накладываются. На самом деле у Вас есть две строки для каждого перекрытия. Например, если бы A и B накладываются, Вы имели бы и. Я сделал бы передачу и удалил бы один из двух для каждого происшествия.

Наконец, для каждого перекрытия, я вычел бы (STDifference) пересечение от только одного из этих двух регионов в паре от #ReducedShapes таблица. Предположите, что у Вас есть два квадрата A и B, полунакладываясь. Операция включила бы A.STDifference (B) значение, что Вы сохраняете все B и половину A. Я вставил бы измененные формы в третью таблицу (сказать #ModifiedShapes).

Две проблемы: a) как Вы видите от своих "оранжевых" и "синих" форм, они не уменьшали точно так же, таким образом, Вы получите одно из двух возможных сокращений в зависимости от того, как Вы имеете дело с тем, кто "побеждает". b) более сложная форма проблемы - то, что, в зависимости от сложности начальных форм, можно получить перекрытие между тремя или больше регионами. Необходимо будет определить собственный способ установить, какая форма "побеждает" в том пересечении, на основе конкретных потребностей. Не ясно, существуют ли ограничения. Могло быть столь же простым как произвольно выбор победителя путем упорядочивания, или более сложный, так как точность важна.

Вышеупомянутое понятие, к сожалению, не решает проблему разрывов. Это немного более сложное и я не на 100% уверены, как разрешить его. Но, если Вы составляете третью таблицу, которая вычитает (STDifference снова) все измененные формы #ModifiedShapes от всех исходных форм в #Shapes (тестирующий на перекрытие перед фактическим вычитанием, конечно), Вас оставили бы с формами остатка в разрывах. Вы хотели бы агрегировать смежные формы и присвоить "цвет победы", возможно объединение его въезжает задним ходом со связанной формой.

Этот ответ длинен, и я оставлю его как это. Я могу рявкать неправильное дерево. На основе Вашей обратной связи/вопросов я добавил бы к сообщению.

3
ответ дан 5 December 2019 в 23:17
поделиться

Ничего себе, это - довольно прохладный набор функций.

При взгляде на некоторые из других доступных методов вот несколько идей, которые приходят на ум:

На неуменьшенных формах используйте.STIntersects (возвращает булевскую переменную), и.STIntersection (возвращает форму) узнать, если и где две формы пересекаются.

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

Затем можно уменьшить эти линейные сегменты и повторно собрать уменьшенные формы.

2
ответ дан 5 December 2019 в 23:17
поделиться

Айзек прав, что вы можете свести функции к линиям и использовать их как общие границы.

Но в программе, которую он упоминает - FME - есть трансформатор под названием Generalizer, который упростит их по вашему желанию, сохраняя их как полигоны. Опция, которую нужно использовать, называется 'Preserve Shared Boundaries'. Вы можете скачать FME по ссылке [здесь][1] и запросить 14-дневную ознакомительную лицензию, чтобы опробовать ее.

0
ответ дан 5 December 2019 в 23:17
поделиться
Другие вопросы по тегам:

Похожие вопросы: