Использование функции ProportionOverlap в MapInfo Pro

 

 

В одной из прошлых статей мы рассматривали Зоны транспортной доступности, инструмент появившийся в MapInfo Pro 17, позволяющий строить изохроны. С его помощью, например, можно провести анализ местоположения магазина, построив зону 10 минутной пешеходной доступности.

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

 

 

Принцип пропорции

 

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

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

Эта функция может сказать нам, какая часть верхнего левого прямоугольника «перекрыта» зеленым эллипсом в процентах. Допустим, это около 9%.

Зная, что 9% района находится в пределах нашей изохроны, мы также можем сказать, что примерно 9% людей живут в этой зоне.

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

 

 

 

Функция ProportionOverlap

 

Функция ProportionOverlap возвращает число, указывающее, какой процент одного объекта перекрыт другим объектом. Её можно вызвать из окна MapBasic в MapInfo Pro и использовать ее в операторах SQL.

ProporationOverlap() работает только с замкнутыми контурами. Если оба объекта не являются замкнутыми (например, точки или линии), то MapInfo выдаст сообщение об ошибке. 

 

Синтаксис:

ProportionOverlap (object1, object2)

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

object1 - нижний объект
object2 - верхний объект

 

Возвращаемое значение:
Функция возвращает значение с плавающей запятой, равное AreaOvelap (object1, object2)/Area(object1).

 

 

Использование в MapInfo Pro

 

Ниже вы можете увидеть более реалистичный пример. Красно-белые линии представляют собой почтовые округа Великобритании, хранящиеся в таблице «Population». Синий многоугольник представляет собой 10-минутную изохрону магазина, хранящуюся в таблице «Drivetime».

 

 

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

 

Select dt.Name, pop.Postsect, pop.UKURP001
, ProportionOverlap(pop.Obj, dt.Obj) "PropOverlap"
From Population As "pop", drivetime As "dt"
Where dt.Obj Intersects pop.Obj
Into Selection

 

Результат запроса выглядит так:

 

 

Как видно, значение пропорционального перекрытия представляет собой десятичное значение, в пределах от нуля до единицы. Чем ближе значение к 1, тем больше перекрытие.

Чтобы рассчитать численность населения в перекрываемой области, остается только умножить значение численности населения на пропорциональное значение перекрытия:

 

Select dt.Name, pop.Postsect, pop.UKURP001
 , ProportionOverlap(pop.Obj, dt.Obj) "PropOverlap"
 , pop.UKURP001 * ProportionOverlap(pop.Obj, dt.Obj) "UKURP001_Overlap"
From Population As "pop", drivetime As "dt"
Where dt.Obj Intersects pop.Obj
Into Selection

 

 

 

По умолчанию запрос возвращает полный почтовый округ, но с помощью нового ключевого слова Object, которое было добавлено в MapInfo Pro v2019, можно ограничить результат, чтобы вернуть фактическую перекрытую часть, создав производный пространственный объект:

 

Select dt.Name, pop.Postsect, pop.UKURP001
 , ProportionOverlap(pop.Obj, dt.Obj) "PropOverlap"
 , pop.UKURP001 * ProportionOverlap(pop.Obj, dt.Obj) "UKURP001_Overlap"
 , Overlap(pop.Obj, dt.Obj) Object
From Population As "pop", drivetime As "dt"
Where dt.Obj Intersects pop.Obj
Into Selection

 

На карте ниже выделен один из полигонов, созданных запросом. Видно, что теперь он повторяет контур синего полигона - изохроны. И что он также ограничен красно-белыми линиями границ почтовых округов.

 

 

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

 

Select dt.Name, Sum(pop.UKURP001) "UKURP001"
 , Sum(pop.UKURP001 * ProportionOverlap(pop.Obj, dt.Obj)) "UKURP001_Overlap"
From Population As "pop", drivetime As "dt"
Where dt.Obj Intersects pop.Obj
Group By dt.Name
Into Selection

 

Поскольку мы суммируем все значения, больше нет смысла хранить какие-либо данные, относящиеся к одному почтовому сектору.

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

 

 


 

Другие полезные статьи:

 

Создание тематических карт на основе данных Covid-19 в MapInfo Pro
Быстрый рендеринг символов в Mapinfo Pro
Построение зон видимости в MapInfo Pro Advanced