Генерация случайно распределенных полигонов по полигону-образцу
по адресу http://gis-lab.info/qa/random-polygons.html
Описание вспомогательного алгоритма и скрипта для статистической оценки объекта
В задачах проверки уникальности объекта по некоторым характеристикам (например рельеф, NDVI, плотность населения, климатические факторы) часто есть необходимость сгенерировать такой же объект в других местоположениях в некотором количестве. Как правило - такие местоположения являются случайными, но лежат в некоторой определенной области.
В качестве объекта может выступать точка, линия или полигон и если для случайного распределения точек существует множество готовых инструментов, то для репликации полигонов готового инструмента найдено не было.
Полученные таким способом множественные репликации дальше могут быть использованы для получения зональной статистики и статистического анализа. Разумеется, тем, кто использует данный подход необходимо будет учесть автокорреляцию.
Эта статья описывает инструмент для Arcview GIS 3.x
- Используется две исходные темы, первая - содержающую полигон, который надо реплицировать и вторую - представляющую собой границы в которых надо производить репликацию. Обе темы должны быть активны (выделены), должен строго соблюдаться порядок тем.
- Скрипт случайным образом генерирует такой же полигон в другом месте и поворачивается его на случайный угол относительно его центра.
- Осуществляется проверка попадания (полного) в границы, если полигон попадает, то он оставляется, если нет - отбраковывается
- Данная последовательность осуществляется столько раз, сколько реплик полигона нужно сгенерировать.
- Сгенерированные полигоны добавляются к теме содержащей исходный, реплицируемый полигон.
Особенно внимательно необходимо отнестись к выбору объектов и тем для генерации, иначе есть риск попасть в ситуацию, когда ни один из генерируемых полигонов не попадает в ограничивающую зону, что вызовет зависание программы.
На иллюстрации: слева - исходная картина, справа - 100 случайных полигонов сгенерированных по образцу.
Основная часть кода генерации случайных полигонов выглядит следующим образом:
while (i < numiter) xshift = Number.MakeRandom(-1000000000, 1000000000)/1000000000 yshift = Number.MakeRandom(-1000000000, 1000000000)/1000000000 newpoly = apoly.aspolygon newpoly = newpoly.Move(xshift, yshift) newpoly = newpoly.Transform(Transform2D.Make.Move(0@0 - newpoly.ReturnCenter).Rotate(Number.MakeRandom(0, 360000)/1000).Move(newpoly.ReturnCenter)) if (newpoly.IsContainedIn(abound)) then rec = aftab.addrecord aftab.setvalue(f_shape,rec,newpoly) i = i + 1 end end