Как мне сделать карту тепла или Choropleth, которая использует полигоны в QGis?

12

Я играл с плагином Heatmap для QGIS, и мне интересно, можно ли создать карту тепла с использованием аналогичного плагина / инструмента, который использует полигоны и точки?

Я хотел бы получить представление о плотности данных во многом так же, как это делает плагин heatmap с точками.

Следующее изображение - грубый набросок моего желаемого результата:

введите описание изображения здесь

СЗТ Адам
источник
3
Задумывались ли вы о создании центроидов для ваших полигонов и построении тепловой карты из них?
andytilia
1
Некоторые подробности о ваших данных помогут. Что представляют полигоны и как они распределяются? Можете ли вы опубликовать образец фото?
andytilia
@andytilia: Центроиды не точно представляют охват полигонов. Полигоны представляют собой использование ресурсов в пределах площади 1200 м2. Некоторые полигоны крошечные, представляющие собой хороший ягодный участок, а другие огромные, покрывающие места обитания карибу и лося. Я пытался разбить гексагональную сетку, а затем подсчитывал перекрытия ... но я в значительной степени новичок, поэтому я не смог найти хороший учебник, который я мог бы понять по этому вопросу.
СЗТ Адам
1
см QGIS Heatmap плагин qgis.spatialthoughts.com/2012/07/...
РКМ
Имеют ли числовые значения какое-то значение для вас, или вы просто ищете красивую / четкую визуализацию?
Подземье

Ответы:

5

Может быть, вы можете сгенерировать набор случайных точек в ваши полигоны, для этого есть инструмент QGIS ? Если у вас есть перекрывающиеся полигоны, то в этой области их плотность выше. Затем используйте тепловую карту для точек. Вам нужно будет провести несколько раундов, чтобы найти оптимальное количество очков, так как результат зависит от этого.

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

JaakL
источник
1
+1 Отличная идея. Единственное, что я хотел бы добавить, это присоединиться к местоположению с данными точек и гексагональными полисами, избавиться от любых несоответствующих объектов и затем создать точки в них, чтобы ваши отдельные точки не утонули среди всех остальных точек.
RomaH
Это, кажется, дает лучший результат. Спасибо всем людям, которые предложили решения. Я чувствую себя плохо из-за того, что отдаю награду только одному человеку, потому что, кажется, есть много хороших решений!
СЗТ Адам
6

Если я правильно понимаю ваш вопрос, я делал нечто подобное раньше; просто надо было вспомнить что я сделал.

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

Ключевой процесс, который нужно использовать, - это объединение атрибутов по местоположению в меню Вектор> Управление данными . Здесь укажите ваше шестиугольное поле в качестве целевого слоя и слой объединения в качестве одного из ваших полигонов. Назовите получившийся слой и установите флажок « Сохранить все записи» .

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

Ваш последний слой должен был унаследовать все поля атрибутов предыдущих слоев, и большая часть его может иметь значение NULL.

Именно здесь мы должны поиграть в некоторые из шейп-файлов, поэтому, если вы не сохранили слой как шейп-файл, сделайте это сейчас. И удалите слой из вашего рабочего пространства в QGIS.

Откройте файлы * .dbf файла формы в OpenOffice Calc, НЕ используйте Excel. Это будет искажать файл, и это бесполезно, узнал, что трудный путь. И не переупорядочивайте данные, они также очень специфичны для порядка строк в файле. Убедитесь, что NULL теперь являются нулями, если они не являются, замените их осторожно.

Теперь вставьте шейп-файл в QGIS и откройте таблицу атрибутов . Теперь он должен показывать нули вместо NULL. Воспользуйтесь Калькулятором полей и суммируйте поля, созданные для вашей работы, в новом столбце.

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

Если вы хотите избавиться от всех неиспользуемых полей в файле. Просто откройте файл dbf снова в Calc и удалите ненужные столбцы по желанию. Лично я бы посоветовал учиться, чтобы освоиться с шейп-файлом, как я это делаю часто.

RoMaH
источник
К сожалению, у меня есть сотни полигонов, перекрывающихся в одном слое. Можете ли вы найти способ обойти это, не разделяя их на несколько сотен слоев?
СЗТ Адам
1
Вы можете создать наложение полигонов с помощью PostGIS (если вы его используете), который разбивает перекрывающиеся поля. gis.stackexchange.com/questions/83/… Возможно, кто-то с лучшим SQL-фу может помочь нам в этом, и как заставить полученные polys наследовать их значения, я не слишком хорош в этом.
RomaH
1
Другой вариант, который я бы настоятельно рекомендовал, - возможно, пришло время переосмыслить ваш точный подход к вашей проблеме. Какие данные вы пытаетесь отобразить? Есть ли основания предполагать, что значение будет однородным по всем полигонам? Будет ли перекрывающийся многоугольник действительно иметь накопительный эффект? Если у вас нет веских доказательств того, что эти вещи могут быть использованы в этой карте для любого прогнозирующего моделирования, то это может быть шатко. Просто подумайте, у вас может быть правильное решение, но вы можете найти лучший способ смоделировать или отобразить его.
RomaH
1
Спасибо за предложение PostGIS. Я посмотрю на это, но я только начинаю узнавать, как использовать PostGIS. Что касается переоценки вопроса ... Я понимаю, что вы имеете в виду, но я не уверен, как еще я мог бы визуализировать то, что мы пытаемся выразить. Наши данные представляют все области, которые старейшины сообщества и пользователи ресурсов считают продуктивными или важными с точки зрения культуры. Мы понимаем, что карта значений не должна быть однородной по всему многоугольнику, но она достаточно близка к точке, которую мы хотим выразить с помощью карты.
СЗТ Адам
1
В qgis все подробно, особенно когда вы начинаете работать с // тоннами // шейп-файлов, вы можете оказаться в действительно разочаровывающей позиции. Вы не пожалеете об использовании своего SQL-фу, будь то с плагином postGIS или плагином GRASS (см. Мой ответ ниже: gis.stackexchange.com/a/42188/7689 ).
egbutter
4

Это общий рабочий процесс с использованием растров. Я не знаю, как это сделать в QGIS.

  1. Используйте инструмент пересечения, чтобы создать новый векторный слой областей перекрытия полигонов
  2. Преобразуйте векторные слои, включая перекрывающийся, в растры
  3. Используйте растровую арифметику (возможно, дополнение), чтобы объединить растры
  4. Результат должен быть растром, который выглядит как тепловая карта

Альфа / нулевые значения и / или прозрачность слоя позволят вам наложить растр на любую базовую карту.


источник
После прохождения этого рабочего процесса у меня остался большой серый блок, покрывающий размеры нового растра. Как мне сделать так, чтобы это выглядело как тепловая карта?
СЗТ Адам
1
Существуют ли разные значения, назначенные пикселям в конечном растре? Несколько соображений: вам может потребоваться указать более точное разрешение (больше пикселей) при создании растров; растры должны быть одинакового размера и разрешения; вам может потребоваться растянуть или изменить цветовую карту результирующего растра, чтобы показать более яркие цвета для больших значений.
Хорошо, я настроил цветовую карту, но я получаю только два цвета: синий (значение 0) и значение красного (2), красное значение покрывает область моих векторных исходных слоев и моего перекрывающегося слоя. Я предполагаю, что каждый слой получил значение 1, а не каждый полигон, когда они были растеризованы. Затем, когда растры были добавлены, общее значение равнялось 2. Как получить значения, которые будут поддерживаться / добавляться на уровне многоугольника, а не на уровне слоя?
СЗТ Адам
должен помочь растр с более высоким разрешением
Как сделать растр с более высоким разрешением?
СЗТ Адам
4

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

Атрибуты объединения по местоположению с вашими гексагональными ячейками в качестве цели и данными о точках в качестве объединения. Выберите, чтобы сохранить все функции. Установите символы для ячеек с унаследованным значением желаемого цвета и установите прозрачность примерно на 50%.

Затем на вашем слое с полисами круга установите их символику того же цвета и прозрачности. Поместите круг poly перед ячейкой poly. Это создаст иллюзию увеличения насыщенности при увеличении значения.

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

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

RoMaH
источник
4

Я предлагаю вам использовать плагин GRASS - QGIS имеет довольно ограниченную функциональность (и зачем изобретать колесо в python, когда такое программное обеспечение, как GRASS уже существует?):

v.in.ogr.qgis

[следующие две строки могут быть необходимы, в зависимости от того, имеют ли ваши полигоны значение]

v.db.addcol 
v.db.update_const 

это где мы складываем перекрытие в полигонах, а затем делаем растр на основе этих столбцов

v.to.db ... qcolumns=sum(col_with_polygon_value)
v.to.rast.attr

v.out.ogr [r.out.ogr]
egbutter
источник
3

С простой QGIS это может быть сложно, вам может понадобиться пользовательский сценарий или использовать пространственную базу данных, такую ​​как PostGIS или Spatialite. Я бы создал обычную сетку точек с PostGIS или сгенерировал бы как текстовый файл CSV и импортировал бы это. Затем нарисуйте круг вокруг каждой точки с помощью st_buffer или прямоугольников с помощью ST_MakeEnvelope и подсчитайте все перекрывающиеся области каждого буфера. Тогда вы, вероятно, захотите удалить все 0 значений, если это означает «нет данных». Наконец, вы можете сделать тепловую карту для сетки, используя counter в качестве поля Weight.

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

JaakL
источник