Как преобразовать набор полигонов в растровое изображение?

StackOverflow https://stackoverflow.com/questions/58638

Вопрос

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

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

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

Я уточняю вопрос немного больше, как просили.

  1. Существует несколько полигонов, каждый полигон представляет собой набор векторов.
  2. Каждый многоугольник будет иметь одно уникальное значение.
  3. Полигоны не перекрываются

Спасибо

Ник

Это было полезно?

Решение

@Ник Р.

Изначально я использовал ArcGIS 9.2, но он не очень хорошо работает с C# и 64-разрядной версией, поэтому теперь я использую GDAL (http://www.gdal.org).

Не gdal_rasterize делать именно то, что хочешь?

Другие советы

Какое программное обеспечение ГИС вы используете?ArcGIS предлагает инструмент Polygon to Raster в ArcGIS 9.2 или новее, который можно использовать в качестве функции PolygonToRaster_conversion.

PolygonToRaster_conversion (in_features, value_field, out_raster_dataset, cell_assignment, priority_field, cellsize)

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

Но ваш вопрос мне не очень ясен.Можете ли вы дать лучшее описание?

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

-Адам

Это веселый проект.Вот что бы я сделал, предполагая, что многоугольники выпуклые:

 have a NY * 2 array of x positions: int x[NY][2]
foreach polygon
  clear the array to -1
  for each edge line
    foreach horizontal raster line iy intersecting the line
      generate ix, the x position where the raster intersects the line
      if x[iy][0] == -1, set it to ix, else set x[iy][1] to ix
    end foreach iy
  end foreach edge
  foreach iy
    fill the pixels between x[iy][0] and x[iy][1] with the polygons label
  end foreach iy
end foreach polygon

Это немного сложнее, чем кажется, потому что вам нужна умственная дисциплина, чтобы думать о растровых координатах НЕ как о пикселях, которые нужно пометить, а как о невидимых линиях МЕЖДУ ними.В противном случае вы запутаетесь в вопросах границ.

Хорошей проверкой этого является то, что если у вас есть многоугольник нулевой площади, например, состоящий из ребер от точки A до точки B и обратно в A, то пиксели не должны светиться.Другой тест: если у вас есть параллелограмм высотой 2 единицы, а его верхний и нижний края имеют ширину 2 единицы, он должен светиться ровно на 4 пикселя.

Если многоугольники НЕ выпуклые, это немного другое.Везде, где край пересекает линию растра, переключите все пиксели оттуда на некоторую произвольно выбранную координату X, например левый край «экрана».Когда вы завершите все края, только внутренние пиксели будут переключаться нечетное количество раз.

ImageMagick может конвертировать из svg в png, может быть, вы посмотрите на код или просто создадите svg и используете IM для конвертации? Неряшливый делает это.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top