Создание теней зданий с помощью ArcGIS Desktop?

20

Как бы вы генерировали тени здания от следов здания?
У меня есть значения атрибутов для высоты зданий.
Поэтому желательно, чтобы размеры теней варьировались в зависимости от этого.
Лучшее предложение, которое я нашел с помощью ArcGIS - это тени от теней: http://blogs.esri.com/Support/blogs/mappingcenter/archive/2008/10/21/3d-effect-for-a-building-footprints.aspx

EightyTwenty
источник
2
Код ArcMap / Python для решения приведен в продолжении по адресу gis.stackexchange.com/questions/19935/… .
whuber
Можете ли вы предоставить сценарий, использующий python для первого примера, так как мне нужно определить оттенок некоторых устройств затенения. Ваш ответ высоко ценится

Ответы:

23

Быстрый и грязный метод состоит в том, чтобы нарисовать тени только крыш зданий, сделать их темно-серыми (желательно полупрозрачными, если есть нижележащие слои грунта) и нарисовать полигоны зданий над ними. Тени крыши получают путем перевода полигонов здания на расстояния, определяемые высотой здания, в направлении, определяемом азимутом и высотой источника света (считается бесконечно далеко). (Формула суммы перевода приведена ниже.)

Грубые тени

Это работает нормально, за исключением небольших высот или высоких зданий (таких как небоскребы): посмотрите, как тени от более высоких изолированных зданий на правой стороне отделены от самих зданий.

Чтобы правильно соединить тени со зданиями, необходимо включить тени от стен здания . Это не сложно сделать. Тень стены, проходящей между точкой, расположенной в точке P, и другой точкой, расположенной в точке Q, будет четырехугольником, обозначенным {P, Q, Q ', P'}, где Q '- тень Q, а P' - тень P. Многоугольное здание будет набором связанных многоугольников, представленных замкнутыми последовательностями точек (P (1), P (2), ..., P (n)). Для каждого такого многоугольника сформируйте объединение теней ребер (P (1), P (2)), (P (2), P (3)), ..., (P (n), P ( 1)). Это легко сделать с помощью петли по краям.

Для света при азимуте через градусы ( к востоку от севера) и высоты ы градусов (от горизонта), тени в точке Р с прогнозируемыми координатами (х, у) и высот ч (всего выражается в тех же единицах , например, метры) находится в P '= (x - h sin (a) / tan (s), y - h cos (a) / tan (s)). Вы должны только вычислить sin (a) / tan (s) и cos (a) / tan (s) один раз для всего слоя, и для каждого полигона вам нужно только умножить эти факторы на высоту один раз, чтобы получить смещения для каждая точка тени в многоугольнике. (Реальная вычислительная нагрузка переносится ГИС, а не вашим кодом, так как она образует объединения всех этих четырехугольников.)

Вот пример эффекта. (Азимут и высота немного изменились по сравнению с первым рисунком, но полигоны и высоты здания - которые различаются - такие же, как и раньше.)

Хорошие тени

аппендикс

В ответ на запрос вот код, использованный для создания второго примера. Хотя почти никто больше не использует этот язык (Avenue), он вполне может служить псевдокодом для создания решения в вашей любимой ГИС. (Однако, в отличие от большинства псевдокодов, он был протестирован путем его запуска. :-) Это настолько просто, что объяснение не требуется; просто знайте, что индексирование начинается с 0, а не с 1, и что кольца многоугольников явно замкнуты (последняя точка в списке совпадает с первой точкой).

' S
' Return the shadow of a shape.

' Field calculator example:
' av.run("S", {[shape], [height], 200, 35})
'======================================================================'
theShape = SELF.Get(0) ' A projected polygon
xHeight = SELF.Get(1)  ' Expressed in the projected units
xAzimuth = SELF.Get(2).AsRadians  ' Any angle (in degrees) east of north
xAltitude = SELF.Get(3).AsRadians ' Angle between 0 and 90 (vertical)
'
' Compute the shadow offsets.
'
xSpread = 1/xAltitude.Tan
x = -xHeight * xSpread * xAzimuth.Sin
y = -xHeight * xSpread * xAzimuth.Cos
xy = x@y
'
' Begin with the original shape.
'
p = theShape.Clone
'
' Adjoin the wall shadows.
'
for each lPts in theShape.AsList   ' Loop over the rings
  for each i in 1..(lPts.Count-1)  ' Loop over edges in this ring
    l = {lPts.Get(i-1), lPts.Get(i), lPts.Get(i)+xy, lPts.Get(i-1)+xy}
    p = p.ReturnUnion(Polygon.Make({l}))
  end
end
return p
' end of script
Whuber
источник
1
Как выглядят здания с отверстиями для пончиков с этим алгоритмом? Позволяет ли он, чтобы, например, во дворе существовала не затененная область, учитывая значения азимута и высоты, которые могли бы вызвать это в реальной жизни?
blah238
2
@ Бла Да. В моих примерах вы можете увидеть некоторые частичные дворы, такие как группы зданий в левом нижнем углу.
whuber
Спасибо за помощь. Я просто собираю это прямо сейчас. Есть ли примеры того, как это реализовать?
Восемьдесят два
5
@ Восемь, я признаюсь, что выполнил эту работу с вычислением поля в ArcView 3: это просто, можно написать скрипт быстрее, чем требуется для запуска ArcMap :-), и он выполняется почти за короткое время. Если хотите, выходной шейп-файл может быть прочитан ArcMap для рендеринга.
whuber
2
Я с нетерпением жду возможности увидеть скрипт Python, который кто-то соберет, чтобы сделать эту работу в ArcMap!
RyanKDalton-OffTheGridMaps
3

Я не думаю, что то, о чем вы говорите (ищите), будет возможностью в arcmap (версия?).
Посмотрите на этот вопрос, возможно, для ограничения, которое вам не нужно.
Используя расширение 3d Analyst и arcscene, вы можете добавить свет, но есть некоторые ограничения.
Есть некоторое движение esri по этому вопросу с cityengine .
Прокрутите вниз до раздела точности тени.
Ранее я был связан с lightcape (который был удален, и я уверен, что живет внутри 3dsmax).
Теперь путь, вероятно, будет через линейку продуктов технической визуализации ...
3ds Max

Брэд Несом
источник
Спасибо за набросок моих вариантов, Брэд. Я использую Arc 10. Я не думаю, что мне обязательно нужен свет, мне просто нужны двухмерные фигуры, чтобы след тени соединял фигуру тени с углами здания, а не результат, создаваемый тенью.
Восемьдесят два
Я, должно быть, неправильно прочитал. Я думал, что для получения тени по высоте вам понадобится та, которая генерируется источником света.
Брэд Несом
2
Я думаю, что я могу изменить размер теневых фигур, просто используя значения атрибутов, которые у меня есть для высоты зданий? Кажется, моя проблема заключается в создании тени, которая является не тенью, а тенью, которая на самом деле связана с углами контура здания.
Восемьдесят два
1

Расширение 3D Analyst имеет несколько инструментов ( Skyline и Skyline Barrier ) для создания силуэтов и теней, но оно находится в контексте проецирования на вертикальную плоскость, как на горизонте, поэтому я не уверен, как или можно ли его легко адаптировать. к этому случаю (проецирование против горизонтальной плоскости, земли).

blah238
источник