Создать весовые полигоны Тиссена?

17

У меня есть точечный шейп-файл, и я создаю полигоны Тиссена (Вороного) программно, используя этот синтаксис сценариев:

CreateThiessenPolygons_analysis (in_features, out_feature_class, fields_to_copy) 

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

Это возможно и как?

Есть ли соответствующий код в VBA?

Димитрис
источник

Ответы:

15

Существует много способов взвешивания расстояний для построения многоугольников Тиссена. Основная идея их построения основана на сравнении расстояния между произвольной точкой x и двумя неподвижными точками p и q ; вам нужно решить, является ли x «ближе» к p, чем к q или нет. Для этого - по крайней мере, концептуально - мы рассматриваем расстояния dp = d ( x , p ) и dq = d ( x , q ). Взвешивание обычно происходит двумя способами: точкам могут быть заданы положительные числовые веса wp и wq, а сами расстояния могут быть преобразованы.

Чтобы иметь смысл, преобразование (которое я напишу как f ) должно увеличиваться с увеличением расстояний; то есть f (d ')> f (d) всякий раз, когда d'> d> = 0. Примерами таких преобразований являются f (d) = d + 1, f (d) = d ^ 2 (закон розничной гравитации Рейли ), f (d) = 1 - 1 / d (при условии, что все расстояния меньше 1), f (d) = log (d), f (d) = exp (d) -1.

Тогда мы бы сказали, что x «ближе» к p, чем к q , когда

f (d ( x , p )) / wp <f (d ( x , q )) / wq.

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

Вот прекрасная вещь и весь смысл этого несколько абстрактного изложения: хотя получающиеся области Тиссена могут иметь сложные, чрезвычайно трудные для вычисления границы, их относительно легко вычислить, используя представление на основе сетки. Вот рецепт:

  1. Для каждой входной точки p вычислите ее евклидову сетку расстояний [d (p)].

  2. Используйте Алгебру карт, чтобы применить f и веса, таким образом повторно выражая каждую сетку расстояний как

    [fp] = f ([d (p)]) / wp.

    Вот пример использования f (d) = 100 + d ^ (3/2); масштаб 400 на 600.

    фигура 1

    По мере увеличения f (d) значение становится темнее. Очевидно, что расстояние в этом примере соответствует центральной красной точке; остальные четыре точки получают свои расчеты расстояния отдельно (не показаны). Площади точек пропорциональны их весам, которые составляют 2, 10, 3, 4 и 5.

  3. Вычислите локальный минимум всех этих сеток [fp]. Назовите это [f]. Вот пример.

    фигура 2

  4. Сравнивая [f] с каждым [fp], каждой ячейке сетки назначают идентификатор первого p, для которого [f]> = [fp]. (Это может быть сделано, например, за один шаг с самой низкой позицией .)

    Рисунок 3

    (Я сомневаюсь, что где-нибудь существует алгоритм, который вычислит решение векторного формата для этой весовой функции f.)

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

Другой пример, показывающий полигоны Тиссена на эллипсоиде, можно найти по адресу /gis//a/17377/ .

Whuber
источник
3
+1 Я никогда не понимал, насколько легче становится эта проблема, если использовать растровый подход.
Кирк Кайкендалл
Уубер: Очень сложный процесс! Однако, чтобы сосредоточиться на моем приложении, каждая точка моего входного файла представляет приблизительный центоид земельного участка. Я создаю с помощью этой строки сценария, отмеченной выше, файл векторного полигона Тиссена. Каждому многоугольнику присваивается пространство, то есть размер, основанный на принципе многоугольников Тиссена о равном расстоянии границ. С другой стороны, у каждого сухопутного паре есть предопределенный размер, который предоставляется в поле области; и это фактор, который я хочу принять во внимание, так как полигоны будут пропорционально этому фактору. Любая идея, пожалуйста?
Димитрис
Я не понимаю ваших замечаний, Деметрис. Они звучат так, будто вы действительно хотите получить картографию местности, а не коллекцию полигонов Тиссена. Это поможет объяснить, почему вы вычисляете эти многоугольники. Какую проблему они собираются решить? Как они будут интерпретироваться?
whuber
Whuber: Каждый из моих точек, введенных в процесс многоугольника Тиссена, представляет приблизительный центр тяжести нового набора земельных участков. Таким образом, я создаю полигоны Тиссена на основе этих точек, представляющих форму земельных участков (один участок один участок земли). Я могу произвести множество наборов случайных форм земельных участков, перемещая эти точки, чтобы обеспечить мой генетический алгоритм. Проблема заключается в том, что эти сгенерированные формы участков (то есть полигоны Тиссена) должны иметь заранее определенную область, и мне интересно, возможно ли принять это во внимание при использовании операции полигонов Тиссена. Я надеюсь, что это имеет смысл.
Деметрис
Что пытается сделать ваш генетический алгоритм? По-прежнему звучит так, будто вам не нужны взвешенные полигоны Тиссена: я считаю, что не существует никакого возможного взвешивания, которое обеспечило бы полигонам достижение заданных областей или даже заранее определенных относительных областей.
whuber
10

Вам нужна взвешенная диаграмма Вороного: http://en.wikipedia.org/wiki/Weighted_Voronoi_diagram также известна как круговая тесселяция Дирихле, когда она выполняется с мультипликативными весами в 2-мерной плоскости. Кто-то, кажется, создал расширение Arcgis 9 для их создания: http://arcscripts.esri.com/details.asp?dbid=15481 С руководством пользователя доступно здесь http://geography.unt.edu/~pdong/software .htm и статья, опубликованная в Dong, P., 2008. Создание и обновление мультипликативно взвешенных диаграмм Вороного для точечных, линейных и многоугольных объектов в ГИС. Компьютеры и науки о Земле, том 34, выпуск 4, страницы 411-421.

Для этого есть недавняя статья о векторном алгоритме (я предполагаю, что алгоритм П Донга основан на растре). http://www.sciencedirect.com/science/article/pii/S0098300411003037 Аннотация говорит, что код C # включен.

blord-Castillo
источник
1
Blord-castillo: Большое спасибо за всю эту информацию. Это очень полезно, и я приму это как исчерпывающий ответ. Однако моя новая проблема заключается в том, что я хочу запускать этот инструмент в своем коде несколько раз, предоставляя входные данные, например, приведенную выше строку сценария. Это возможно?
Димитрис