2008-09-12 12 views
3

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

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

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

Я уточняю вопрос немного по запросу.

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

Благодарности

Ник

+0

Некоторые из ответов на этот вопрос могут представлять интерес: http://stackoverflow.com/questions/1341399 – ideasman42

ответ

1

@Nick R

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

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

1

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

2

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

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

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

2

Это, вероятно, не то, что вам нужно, но если вы хотите, чтобы нарисовать многоугольник (или наоборот прочитать пиксели многоугольника, IMAGE на многоугольнике основе), то одно решение свернуть свой собственный polygon fill tool. Совершенно откровенно, это тонна веселья и очень аккуратная.

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

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

-Adam

+0

Я добавил некоторые разъяснения к вопросу - надеюсь, это облегчит ответ! –

2

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

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

+0

Реализовано что-то вроде этого, с поддержкой самопересечений и избегает циклирования по всем краям для каждой растровой линии - http://stackoverflow.com/a/31768384/432509 – ideasman42