Wie konvertiere ich eine Reihe von Polygonen in eine Bitmap
-
09-06-2019 - |
Frage
Wie kann ich einen Satz von Polygonen, die beliebigen Werte enthalten und eine entsprechende Bitmap erstellen, in dem jedes Pixel den Wert des Polygons an dieser Stelle enthält?
die Frage in einem Kontext zu setzen, mein Polygone enthält Informationen über die durchschnittliche Anzahl der Personen pro Quadratkilometer innerhalb des Polygons. Ich brauche ein Raster / Bitmap zu erstellen, die die Pixel darstellen, die Bevölkerung in 200 Metern Bins enthält.
Ich habe etwas ähnliches in der Vergangenheit getan, wo ich ein Polygon verwendet haben, um eine Maske zu erstellen, indem Sie in eine Bitmap zeichnen und Werte füllen, dann Umwandeln der Bitmap in ein Array, das ich manipulieren kann. Ich bin sicher, es gibt eine bessere Methode, dies zu tun!
Ich bin Klärung der Frage ein bisschen mehr wie gewünscht geplant.
- Es gibt mehrere Polygone, jedes Polygon ist ein Satz von Vektoren
- Jedes Polygon wird einen einzigen eindeutigen Wert haben
- Die Polygone nicht überlappen
Danke
Nick
Lösung
@ Nick R
Ich war ursprünglich ArcGIS 9.2 verwenden, aber das funktioniert nicht gut mit C # und 64 Bit, so dass ich bin jetzt mit GDAL ( gdal_rasterize genau das tun, was Sie wollen?
Andere Tipps
Welche GIS-Software verwenden Sie? ArcGIS bietet das Polygon in Raster-Werkzeug in ArcGIS 9.2 oder höher, die als PolygonToRaster_conversion Funktion skriptfähig ist.
PolygonToRaster_conversion (in_features, value_field, out_raster_dataset, cell_assignment, priority_field, cellsize)
Dies ist wahrscheinlich nicht das, was Sie brauchen, aber wenn Sie ein Polygon zeichnen möchten (oder umgekehrt ein Polygon Bild der Pixel auf einem Polygon Basis gelesen), dann eine Lösung ist Ihre eigene Polygonfüllprozedur Werkzeug . Ganz ehrlich, das ist eine Menge Spaß, und wirklich ordentlich zu lernen.
Aber Ihre Frage ist mir nicht ganz klar. Können Sie eine bessere Beschreibung geben?
- Ist Ihr Satz von beliebigen Polygonen tatsächliche Bilder oder Vektor (dh Liste der Punkte) Punkte oder ???
- Ist jedes Polygon einen Wert hat, oder hat jedes Polygon hat eine Reihe von Werten, die Sie zeichnen wollen?
- So jedes Polygon hat eine zugehörige Reihe von Bevölkerungs Werte, die Sie wollen Textur im Wesentlichen das Polygon mit?
-Adam
Es ist ein Spaß-Projekt. Hier ist, was ich tun würde, vorausgesetzt, die Polygone konvex ist:
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
Dies ist ein wenig komplizierter, als es klingt, weil Sie die mentale Disziplin müssen von Raster denken Koordinaten nicht als Pixel markiert werden, sondern als die unsichtbaren Linien zwischen ihnen. Andernfalls Sie alle verwirrt durch Grenzfragen erhalten.
Ein guter Test dafür ist, wenn Sie einen Polygon von Null Bereich haben, wie es von Kanten von Punkt A nach Punkt B besteht und zu A zurück, sollte es keine Pixel leuchten. Ein weiterer Test ist, wenn man ein Parallelogramm haben, die 2 Einheiten hoch ist, und es ist oberen und unteren Kanten sind 2 Einheiten breit, sollte es genau 4 Pixel leuchten.
Wenn die Polygone nicht konvex ist, ist es ein wenig anders. Überall dort, wo eine Kante einer Rasterlinie kreuzt, schalten alle Pixel von dort bis zu einem gewissen willkürlich gewählte X, wie beispielsweise die linke Kante des „Screen“ koordinieren. Wenn Sie alle Kanten abgeschlossen haben, werden nur die Innenpixel eine ungerade Anzahl von Malen umgeschaltet worden sind.
ImageMagick von SVG nach PNG umwandeln kann, vielleicht können Sie einen Blick auf den Code nehmen oder einfach svg erstellen und IM verwenden für die Konvertierung? Scruffy das tut.