Генерация геопривязанных изображений в C # - PullRequest
3 голосов
/ 10 марта 2009

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

Используются следующие технологии: C #, OpenLayers, SQL Server 2008 и GeoServer.

Мой вопрос, в основном, относится к общему подходу, я не совсем уверен, куда поставить этот наконечник долота.

Моя конечная цель состоит в том, чтобы иметь возможность взять любой произвольный ограничивающий прямоугольник, рассчитать x-милю по сетке x-mile, которая вписывается в этот ограничивающий прямоугольник, перебрать коллекцию отдельных точек и назначить их одному квадрату сетки другой, чтобы я мог рассчитать плотность точек на квадрат сетки, затем раскрасить сетку в соответствии с плотностями, а затем наложить ее на базовую карту CloudMade, используя открытые слои.

Любая помощь была бы очень признательна, в целом или любой ее части.

Ответы [ 3 ]

4 голосов
/ 10 марта 2009

Если ваша ограничительная рамка выровнена по оси, это довольно просто. Просто создайте свое изображение и создайте для него файл мира вручную. Файл мира состоит всего из 6 строк текста, и вы уже знаете все необходимое (размер пикселя x & y, координата левого верхнего угла).

Просто убедитесь, что вы используете ЦЕНТР левого верхнего углового пикселя, а не угол поля.

------ Вот как вы создадите файл мира -------

Скажем, верхний левый угол вашей ограничительной рамки находится в 203732x598374, и вам нужно изображение с прямоугольниками шириной 200 м на восток <-> запад и 300 м на север <-> юг.

Вы должны сделать изображение с соответствующим количеством пикселей, а затем файл мира, который будет иметь следующие 6 строк:

200
0
0
-300
203632
598524

Это соответствует:

200 == size of one pixel in X
0 == shear1
0 == shear2
-300 == size of one pixel in Y (from top down)
203632 == left edge - 1/2 pixel size (to center on pixel instead of edge of box)
598524 == top edge - 1/2 pixel size (to center on pixel instead of edge of box)

Если вы используете изображение в формате .png, вам нужно сохранить его под тем же именем, но в формате .pgw. Если вы используете .jpg, это будет .jgw и т. Д.

Для получения полной информации см .: Wiki on World Files

2 голосов
/ 12 марта 2009

«Разделение некоторого ограничивающего прямоугольника на сетку и отображение каждого квадрата сетки с использованием другого цвета в зависимости от того, сколько точек образца попадают в этот квадрат сетки». Это растр , и в GeoServer есть функции для отображения их с оттенками цвета, легендами и так далее. Я думаю, что будет более гибко использовать эти функции, чем создавать плитки изображений в C #.

Из документации GeoServer:

Растровые данные - это не просто картинка, скорее это можно рассматривать как сетку информации с географической привязкой, много как графика это сетка визуального информация (с сочетанием красных, зелень и блюз). В отличие от графики, которые содержат только визуальные данные, каждый точка / пиксель в растровой сетке может иметь много разных атрибутов, с возможно, никто из них не имеет по своей сути визуальный компонент.

Это также называется тематическим отображением или контурными или тепловыми картами или 2.5D-графиками в других пакетах ГИС.

Вы можете использовать бесплатную ГИС, такую ​​как Трава до Создание растровых сеток, но из вашего описания вам не нужно интерполировать (поскольку каждая ячейка содержит хотя бы одну точку) так что это может быть так же легко свернуть свой собственный код.

EDIT: есть библиотека с открытым исходным кодом GDAL , которую вы можете использовать для записи растровых файлов в различных форматах . Есть привязки C #.

0 голосов
/ 24 апреля 2009

Я думаю, что формулы для вычисления центра верхнего левого пикселя неверны. В этом примере центр верхнего левого пикселя будет вниз и справа от (203732, 598374). Так не должно ли быть следующее?

203832 == left edge + 1/2 pixel size (to center on pixel instead of edge of box)
598224 == top edge - 1/2 pixel size (to center on pixel instead of edge of box)
...