С точки зрения плотности населения "городская территория" должна в целом удовлетворять лишь нескольким аксиоматическим критериям :
Его граница не должна включать какие-либо точки (относительно) высокой плотности по сравнению с максимальной плотностью внутри.
Надо просто подключить (без «дырок»).
Его средняя плотность населения должна превышать некоторый заранее заданный порог.
Аксиома (1) является наиболее естественной: если бы граничная точка имела высокую плотность, мы бы просто переместили границу наружу, чтобы включить эту точку в городской местности. Я хотел бы предложить, чтобы «относительный» означал как пропорцию максимума , такую как одна десятая или одна сотая или что-то еще. Аксиома (2) избегает исключения парков и других регионов с низкой плотностью, которые естественным образом встречаются в городах. Аксиома (3) , которая, поскольку она зависит от порога, является несколько произвольной, устраняет небольшие компактные деревни.
На самом деле существует по крайней мере еще один элемент произвольности: любая сеточная карта плотности населения неявно усредняет популяции по локальным окрестностям (в некоторых случаях равная одной ячейке и равная радиусу ядра для оценок плотности ядра). Давайте примем этот неявный размер окрестности (который может быть изменен при первом запуске фокусного средства или другого сглаживания ядра по исходной карте плотности), этот порог населенности и ощущение «относительно высокого» в аксиоме 1 как устанавливаемые пользователем параметры, которые управляют результат.
Эти аксиомы естественным образом приводят к довольно простому алгоритму : нужно найти локальные максимумы, смотреть в их окрестностях до тех пор, пока не будет найдена граница, удовлетворяющая аксиоме (1), заполнить любые отверстия, чтобы удовлетворить аксиому (2), а затем просканировать все такие области-кандидаты. согласно (3). Это делается следующим образом:
При желании сгладить карту плотности.
Выполните алгоритм «заполнения» на карте, связанной с плотностью (см. Ниже).
RegionGroup результат.
Удалите дыры из полигонов RegionGroup.
Выполните зональные суммы плотности населения по заполненным многоугольникам.
Удалите все полигоны, имеющие суммы (или средние плотности) ниже порога населения (плотности).
То, что осталось, это ваше решение.
Позвольте мне сказать немного больше о шаге (1), который является ключевым. Алгоритм заполнения идентифицирует «приемники» и «заполняет» их до постоянной величины выше их отметок. Это именно то , что Аксиома (1) просит нас сделать, при условии, что (а) мы можем заставить «сток» играть роль «локального максимума» и (б) заставить «постоянное количество выше» играть роль «постоянной доли» . " Способ сделать это, заполнив отрицательный логарифм плотностиа не сама плотность. (Сначала добавьте к плотности крошечную константу, скажем, около 0,1 человека на квадратный километр, прежде чем брать журнал, чтобы любые ячейки, содержащие нули, не вызывали проблем.) «Озёра» в отрицательной плотности журнала идентифицируют кандидата городские районы. У вас все еще есть три независимых параметра для игры (ввод на шагах 0, 1 и 5); установка их потребует некоторых размышлений о том, что вы на самом деле подразумеваете под «городской зоной», а также некоторых экспериментов.