Pergunta

Como faço para fazer um conjunto de polígonos que contêm valores arbitrários e criar um mapa de bits correspondente, onde cada pixel contém o valor do polígono em que local?

Para colocar a questão no seu contexto, meu polígonos conter informações sobre o número médio de pessoas por quilómetro quadrado dentro do polígono.Eu preciso criar um raster/bitmap que contém pixels representando a população em 200 metros de posições.

Eu fiz algo semelhante no passado, onde eu usei um polígono para criar uma máscara de desenho em um bitmap e enchimento de valores e, em seguida, converter o bitmap em uma matriz que posso manipular.Tenho certeza de que há um método melhor para fazer isso!

Eu vou clarificar a questão um pouco mais, conforme solicitado.

  1. Existem vários polígonos, cada polígono é um conjunto de vetores
  2. Cada polígono terá um único valor exclusivo
  3. Os polígonos não se sobreponham

Obrigado

Nick

Foi útil?

Solução

@Nick R

Eu estava originalmente usando o ArcGIS 9.2, mas que não funciona bem com C# e 64 bits, então eu agora estou usando o GDAL (http://www.gdal.org).

Não gdal_rasterize faça exatamente o que você quer?

Outras dicas

O que SIG software você está usando?ArcGIS oferece o Polígono de Varredura ferramenta ArcGIS 9.2 ou posterior, que é programável por scripts como o PolygonToRaster_conversion função.

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

Isso provavelmente não é o que você precisa, mas se você quiser desenhar um polígono (ou, inversamente, ler um polígono da imagem em pixels em um polígono de base), em seguida, uma solução é reverter seu próprio preenchimento de polígonos ferramenta.Francamente, isso é uma tonelada de diversão, e muito legal de aprender.

Mas a sua pergunta não está muito clara para mim.Você pode dar uma descrição melhor?

  • É o conjunto de polígonos arbitrários imagens reais, ou vetor (ou seja, lista de pontos) pontos, ou ???
  • Cada polígono tem um valor, ou não cada polígono tem uma matriz de valores que você está tentando desenhar?
  • Assim, cada polígono tem associada uma matriz de valores da população que pretende, essencialmente, a textura polígono com?

-Adam

É um projeto divertido.Aqui está o que eu faria, supondo que os polígonos convexos:

 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

Este é um pouco mais complicado do que parece, porque você precisa de disciplina mental para pensar em quadrícula de coordenadas NÃO como os pixels de ser rotulado, mas como as linhas invisíveis ENTRE eles.Caso contrário, você obterá todos confusos por limite problemas.

Um bom meio de testar isso é se você tiver um polígono de área de zero, como ele consiste em bordas do ponto a para o ponto B e de volta a Um, ele deve acender nenhuma pixels.Outro teste é se você tiver um paralelogramo que é de 2 unidades de altura, e bordas superior e inferior são 2 unidades de largura, ela deve acender exatamente 4 pixels.

Se os polígonos NÃO convexos, é um pouco diferente.Sempre que uma borda atravessa uma varredura de linha, ligue todos os pixels a partir daí, para alguns, arbitrariamente escolhido coordenada X, tais como a borda esquerda da "tela".Quando você tiver concluído todas as bordas, apenas o interior pixels terá sido alternado um número ímpar de vezes.

ImageMagick pode converter de svg para png, talvez você possa dar uma olhada no código, ou simplesmente criar svg e uso de MI para a conversão? Desalinhado faz isso.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top