Генерация случайно распределенных полигонов по полигону-образцу

Материал из GIS-Lab
Перейти к навигации Перейти к поиску
Эта страница опубликована в основном списке статей сайта
по адресу 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

Скачать расширение

Ссылки по теме