Как преобразовать набор полигонов в растровое изображение - PullRequest
3 голосов
/ 12 сентября 2008

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

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

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

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

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

Спасибо

Ник

Ответы [ 5 ]

2 голосов
/ 28 апреля 2009

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

 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, такой как левый край «экрана». После завершения всех краев только внутренние пиксели будут переключаться нечетное количество раз.

2 голосов
/ 12 сентября 2008

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

PolygonToRaster_conversion (in_features, value_field, out_raster_dataset, cell_assignment, priority_field, cellsize)
2 голосов
/ 12 сентября 2008

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

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

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

-Adam

1 голос
/ 12 сентября 2008

@ Ник R

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

Разве gdal_rasterize не делает именно то, что вы хотите?

1 голос
/ 12 сентября 2008

ImageMagick может конвертировать из SVG в PNG, может быть, вы можете взглянуть на код, или просто создать SVG и использовать IM для преобразования? Скраффи делает это.

...