Domanda

Come posso prendere una serie di poligoni che contengono valori arbitrari e creare una bitmap corrispondente in cui ogni pixel contiene il valore del poligono in quella posizione?

Per contestualizzare la domanda, i miei poligoni contengono informazioni sul numero medio di persone per chilometro quadrato all’interno del poligono.Devo creare un raster/bitmap che contenga pixel che rappresentano la popolazione in contenitori da 200 metri.

Ho fatto qualcosa di simile in passato in cui ho utilizzato un poligono per creare una maschera disegnando in una bitmap e riempiendo i valori, quindi convertendo la bitmap in un array che posso manipolare.Sono sicuro che esiste un metodo migliore per farlo!

Sto chiarendo un po' di più la questione come richiesto.

  1. Esistono più poligoni, ogni poligono è un insieme di vettori
  2. Ogni poligono avrà un singolo valore univoco
  3. I poligoni non si sovrappongono

Grazie

Nick

È stato utile?

Soluzione

@Nick R

Inizialmente utilizzavo ArcGIS 9.2, ma non funziona bene con C# e 64 bit, quindi ora sto utilizzando GDAL (http://www.gdal.org).

No gdal_rasterize fai esattamente quello che vuoi?

Altri suggerimenti

Quale software GIS stai utilizzando?ArcGIS offre lo strumento Polygon to Raster in ArcGIS 9.2 o versioni successive, che è scrivibile come funzione PolygonToRaster_conversion.

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

Questo probabilmente non è ciò di cui hai bisogno, ma se vuoi disegnare un poligono (o al contrario leggere i pixel di un'immagine poligonale su base poligonale) allora una soluzione è creare il tuo strumento di riempimento poligonale.Francamente, è molto divertente e davvero interessante da imparare.

Ma la tua domanda non mi è molto chiara.Puoi dare una descrizione migliore?

  • Il tuo insieme di poligoni arbitrari è immagini reali o punti vettoriali (cioè elenco di punti) o ???
  • Ogni poligono ha un valore o ogni poligono ha una serie di valori che stai tentando di disegnare?
  • Quindi a ogni poligono è associato un array di valori di popolazione con cui vuoi essenzialmente strutturare il poligono?

-Adamo

È un progetto divertente.Ecco cosa farei, supponendo che i poligoni siano convessi:

 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

Questo è un po' più complicato di quanto sembri, perché è necessaria la disciplina mentale per pensare alle coordinate raster NON come ai pixel da etichettare, ma come alle linee invisibili TRA di loro.Altrimenti rimarrai confuso dai problemi di confine.

Un buon test è che se hai un poligono con area zero, come se fosse costituito da bordi dal punto A al punto B e di nuovo ad A, non dovrebbe illuminarsi alcun pixel.Un altro test è che se hai un parallelogramma alto 2 unità e i suoi bordi superiore e inferiore sono larghi 2 unità, dovrebbe illuminarsi esattamente di 4 pixel.

Se i poligoni NON sono convessi, la situazione è leggermente diversa.Ogni volta che un bordo attraversa una linea raster, sposta tutti i pixel da lì su una coordinata X scelta arbitrariamente, come il bordo sinistro dello "schermo".Una volta completati tutti i bordi, solo i pixel interni saranno stati attivati/disattivati ​​un numero dispari di volte.

ImageMagick può convertire da SVG a PNG, forse puoi dare un'occhiata al codice o semplicemente creare SVG e utilizzare IM per la conversione? Trasandato lo fa.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top