2013-09-09 4 views
3

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

enter image description here

Я написал код, чтобы интерполировать ЦМР из образцов глубины и иметь доказательство концепции в месте, где я хранить их в не-плиточных растрах в PostGIS (один растр на единицу воды), который работает достаточно хорошо.

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

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

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

Я хотел бы иметь какой-то умный ввод, как организовать этот стек. Некоторые идеи, которые я хочу, чтобы проветрить:

1. Растровые плитки только Высота DEM растры генерируются на основе классических 256x256 концепций Меркатора. Они динамически загружаются клиентским браузером и отображаются либо как-есть, либо отображены с использованием canvas/D3. Кроме того, я использую API холста для извлечения векторных контуров с использованием D3. Это было бы довольно чистое решение, но я подозреваю, что он будет замедляться (часть проверки изображения).

2. Растровые плитки в сочетании с векторной плитки Высота DEM растров по-прежнему генерируется, поскольку они представляют собой хороший способ представления и хранения интерполированных данных. Растровая плитка может по-прежнему составлять графическое наложение на карте, но по существу контуры высоты состоят из векторных плит, выбранных отдельно (на основе GeoJSON или TopoJSON). Эти плитки создаются на основе растровых изображений.

Поскольку я хочу иметь возможность равноудаления равномерно на лету, я должен иметь возможность унифицировать и комбинировать векторы, например, используя D3. Я посмотрел плагин d3.geom.contour, но он немного ограничен, например, кажется, что локальные пики не могут быть, а скорее пирамиды, такие как топология.

Последнее, но не менее важное: я хочу выполнить интерполирование боковой стороны клиента (или что-то подобное) для эстетики. То есть разрешение батиметрической карты может быть ниже (поскольку более высокое разрешение действительно не имеет значения), но при этом контуры разрешения обычно становятся неуклюжими. Возможно, это аргумент для TopoJSON и его возможности с упрощением? Вот пример, который я сделал с D3 (с использованием сборочных сборок на стороне сервера GeoJSON):

enter image description here Любые предложения приветствуются!

ответ

3

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

На начальном экране отображается «разумное значение по умолчанию», то есть что-то, что выглядит красиво и не требует загрузки слишком большого количества данных. Я сделал что-то по этим строкам here, хотя я бы, вероятно, использовал TopoJSON, если бы сделал это снова сегодня.

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

  • Пользовательский зум/сковородка, вы хотите показать что-то более подробно. Разрешение не должно быть проблемой, если вы используете векторы, но вы можете делать такие вещи, как отображение промежуточных контурных линий. Для этого вы можете просто загрузить дополнительные контурные линии из JSON.
  • Пользователь выбирает разные интервалы высоты/и т. Д. Снова для этого вы можете просто загрузить новые данные. Это означает, что вы не позволяете произвольно изменять эти вещи, но имеете только определенное количество дискретных уровней, для которых данные предварительно вычисляются. Делает это намного проще и в браузере, и в программировании.

Чтобы заставить его работать с векторами в общем, вы, вероятно, придется упростить геометрию для начальной загрузки - опять же, вы можете динамически загружать более подробные пути, как пользователь увеличивает масштаб

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

+0

Для ответа на трудный вопрос новичков, которые редко проверяют первый anwser, они получили: +1! – Hugolpz

+0

Отличный ответ и отличный пример! Я сделаю это и попытаюсь создать такую ​​модель, как вы описали. Следующий вопрос: вы представляете, что мои интерполированные данные, которые я храню в своих растрах сегодня, вместо этого будут способствовать прямой интерполяции в векторную рутину? Я полагаю, что векторы высоты, находящиеся в вашем собственном примере, происходят из растровых DEM (из NASA). Возможно, вы правы - промежуточный растровый шаг, возможно, лишний, - это просто, что легко сделать контурные полигоны из растров в PostGIS ... :) Итак - по существу Интерполяция -> Векторы (или векторные плитки). – averas

+0

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

Смежные вопросы