Mehr

Wie kann man die Größe von Raster-GIS-Bildern auf eine bestimmte Pixelbreite richtig ändern?

Wie kann man die Größe von Raster-GIS-Bildern auf eine bestimmte Pixelbreite richtig ändern?


Ich arbeite an ETOPO1, einer 466-MB-Datei, und möchte zu SRTM (~20 GB Earth) wechseln. Mein Workflow beinhaltet mehrere zeitaufwändige Verarbeitungsschritte, daher möchte ich unbedingt mit einem minimalen Raster arbeiten. Normalerweise werden 10.000 bis 100.000 Pixel breite GIS-Raster benötigt, um sie auf ~ 1000 Pixel Breite zu verkleinern, wie meine endgültige Karte.

Wie kann die Größe einer Raster-GIS-Datei über das Terminal auf eine bestimmte Breite angepasst werden? (gdal bevorzugt)

Es sollte negative und positive Z-Werte mit Genauigkeit beibehalten.


Hinweis: Folgendes habe ich schon probiert…

  • Ernte: um meinen Interessenbereich zu beschneiden mitgdal_translate -projwin $(WEST) $(NORTH) $(OST) $(SOUTH) ETOPO1_Ice_g_geotiff.tif crop.tmp.tif, es gibt mir immer noch Dateien, die 50-mal zu groß für eine 50-mal langsamere Verarbeitung sind.
  • Frühe Größenanpassung: eine frühzeitige Größenänderung mit Imagemagick + erneutes Einfügen der GIS-Metadaten für die folgenden Verarbeitungen zerstört die negativen Werte (Höhen unter dem Meeresspiegel werden 0m).

Für einen Bereich wie WEST=-5.0 NORTH=51.0 EAST=10 SOUTH=41, gewünschte Breite 1000px, Höhe unbekannt, verwenden Sie:

gdalwarp -te -5 41 10 51 -ts 1000 0 input.tif output.tif

oder :

gdalwarp -of GTiff -s_srs epsg:4326 -t_srs epsg:4326 -te -5 41 10 51 -ts 1000 0 input.tif output.tif

Beschneiden Sie das Bild anstelle von gdal_translate mit gdalwarp -ts Möglichkeit :

-ts Breite Höhe: Legen Sie die Größe der Ausgabedatei in Pixel und Zeilen fest. Wenn Breite oder Höhe auf 0 gesetzt ist, wird diese Dimension aus der berechneten Auflösung erraten. Beachten Sie, dass -ts nicht mit -tr verwendet werden kann.

-te xmin ymin xmax ymax: Legen Sie georeferenzierte Ausdehnungen der zu erstellenden Ausgabedatei fest (in Ziel-SRS [normalerweise Dezimalgrad]).

Mit-ts 1000 0Sie können die Breite der Ausgabe auf die gewünschten 1000 Pixel einstellen und gdalwarp berechnet die Höhe automatisch.


Identifizieren Sie die Position eines Klicks auf ein Raster in der Broschüre, in R

Ich zeichne ein großes Lat-Lon-NetCDF-Raster über einer R-Broschürenkarte mit Shinydashboard . Wenn ich auf die Karte klicke, erscheint ein Popup und zeigt Zeile, Spalte, Lat-Lon-Position und den Wert des angeklickten Rasterpunktes an. (Siehe reproduzierbaren Code unten)

Das Problem ist, dass ich eine Verschiebung im Raster erlebe, wenn das Raster groß genug ist. Hier habe ich zum Beispiel auf einen Punkt geklickt, der einen Wert haben sollte, aber das Ergebnis ist, dass der identifizierte Punkt der oben genannte ist.

Ich glaube, dies hat mit der Tatsache zu tun, dass das von Leaflet verwendete Raster projiziert wird, während die Rohdaten, die ich zur Identifizierung der Punkte verwende, Lat-Lon sind, da der angeklickte Punkt als Lat-Lon von Leaf zurückgegeben wird. Ich kann die projizierte Datei (Tiefe) nicht verwenden, da ihre Einheiten in Metern und nicht in Grad angegeben sind! Selbst wenn ich versuchte, diese Meter in Grad umzuprojizieren, bekam ich eine Verschiebung.

Hier ist ein einfaches ausführbares Beispiel des Codes:

Wie kann ich die Punkte richtig identifizieren, wenn das Raster groß ist?

BEARBEITEN: Ich wollte auch einige zusätzliche Links zu (möglicherweise) verwandter Dokumentation oder Fragen bereitstellen:


In Java können Sie mit javax.imageio Folgendes tun:

Sie müssten die Farbtabelle konvertieren, um die RGB-Werte zu extrahieren. Diese sehen aus wie 8-Bit-RGB-Werte pro Kanal ohne Alpha. So könnte die Methode aussehen

Außerdem müssten Sie Methoden zum Decodieren und Dekomprimieren der Daten implementieren sowie eine Methode zum Abrufen eines Werts (Farbindex) an einer bestimmten Position aus den unkomprimierten Daten.

Wenn Sie keine Dokumentation haben, erfordert insbesondere die Dekomprimierungsmethode ein gewisses Reverse Engineering. Wenn man sich die decodierten Daten aus diesen beiden Beispielen ansieht, handelt es sich wahrscheinlich um einen lauflängencodierten Wert, der die byteWidth verwendet. Es gibt mehrere RLE-Varianten, ich konnte keine mir sinnvoll erscheinenden Bilddaten ableiten, aber ich habe keine Kenntnis über die Absicht der Bilddaten, daher kann ich unkomprimierte Daten möglicherweise nicht richtig erkennen.

Beim ersten Beispiel habe ich festgestellt, dass die Daten 1600 Bit lang sind. Bei einer Bildbreite und -höhe von jeweils 40 und einer Farbtiefe von 1 Bit könnte dies auch unkomprimiert sein, obwohl es laut XML komprimiert wäre.


Sie können auch background-size: round verwenden, die in Kombination mit Repeat eine Bedeutung haben:

Dadurch wird die Bildbreite so angepasst, dass sie eine ganze Reihe von Malen in den Hintergrundpositionierungsbereich passt.

Zusätzliche Anmerkung
Wenn die benötigte Größe eine statische Pixelgröße ist, ist es immer noch ratsam, die Größe des tatsächlichen Bildes physisch zu ändern. Dies dient sowohl zur Verbesserung der Qualität der Größenänderung (vorausgesetzt, dass Ihre Bildsoftware bessere Arbeit leistet als die Browser) und um Bandbreite zu sparen, wenn das Originalbild größer ist als das anzuzeigende Bild.


Sie können das Bild zuschneiden mit dem folgenden Code verwenden, der Ihr Problem lösen kann.

Die obige Methode führt das PostScalling des Bildes vor dem Zuschneiden durch, sodass Sie mit dem zugeschnittenen Bild das beste Ergebnis erzielen können, ohne einen OOM-Fehler zu erhalten.

Für weitere Details können Sie diesen Blog verweisen

Mein Kollege hat mich gerade auf diese Android-API aufmerksam gemacht. siehe ThumbnailUtils.

Es übernimmt die Größenänderung und das Zuschneiden für Sie.

Wenn Ihr Code vom Beispiel abweicht, müssen Sie ihn posten, um genaue Hilfe zu erhalten. Ansonsten nur anhand des Logs - hier eine Antwort:

In dem von Ihnen verwendeten Beispiel beschneidet der Entwickler ein Bild im Ressourcenordner seiner App (der zu Beginn relativ klein sein könnte) auf ein 300 x 300-Bitmap-Bild. Versuchen Sie zunächst, ein kleineres Bild in Ihrer eigenen App auf eine kleinere Ausgabegröße zuzuschneiden, um festzustellen, ob ein Problem mit dem Code vorliegt oder Sie ein Bild verwenden, das für Ihren Code oder Ihr Gerät zu groß ist.

Da Sie sagen, dass das endgültige Bild, das Sie beschneiden, größer als der Bildschirm ist, ist dies wahrscheinlich das Problem, und Sie stoßen bei der Verwendung von Bitmaps in Android auf eine grundlegende Herausforderung. Die Größe der Bitmap-Datei ist eine Funktion von Pixelbreite mal Höhe - sie werden schnell größer.

Sie können das Problem lösen, indem Sie andere Teile Ihres Protokolls googeln, z. B. "Bitmap-Größe überschreitet VM-Budget" und Sie werden mehrere Threads zu Stackoverflow finden, die helfen, wie dieser.

Sie können es lösen, indem Sie Bitmap-Optionen und inSampleSize und andere Techniken verwenden.


Diese Option hält die Kartenausdehnung konstant. Die geografischen Grenzen der Karte – die oberen, unteren, linken und rechten Koordinaten – sind speziell definiert. Diese Werte sollten in Karteneinheiten angegeben werden.

Es gibt sechs Möglichkeiten, eine feste Ausdehnung festzulegen:

  • Der aktuelle Umfang des Datenrahmens
  • Die kombinierte Ausdehnung aller Features in einem bestimmten Layer
  • Die kombinierte Ausdehnung aller Features in einem bestimmten Layer, die in der aktuellen Kartenausdehnung sichtbar sind
  • Die kombinierte Ausdehnung aller ausgewählten Features in einem bestimmten Layer
  • Die kombinierte Ausdehnung aller oder beliebiger ausgewählter Grafikformen, die Sie innerhalb des Datenrahmens zeichnen (d. h. in der Datenansicht oder in einem fokussierten Datenrahmen) (Die Grafik oder Grafiken, die Sie zum Definieren der Datenrahmenausdehnung verwenden möchten, müssen ansonsten ausgewählt werden selected , ist die Option Umriss der ausgewählten Grafik(en) nicht verfügbar.)
  • Ein Rechteck, das durch bestimmte Koordinaten definiert ist, die Sie angeben

Wenn Sie in der Datenansicht die feste Ausdehnung festlegen und das Seitenverhältnis (Höhe/Breite) des Datenansichtsfensters sich vom Seitenverhältnis des Datenrahmens im Seitenlayout unterscheidet, werden Höhe und Breite des Datenrahmens im Seitenlayout ausgerichtet um dem Aspekt der Datenansicht zu entsprechen. Wenn Sie ein Kartenlayout mit einer festen Ausdehnung erstellen möchten, sollten Sie die feste Ausdehnung in der Layoutansicht festlegen.

Die Kartennavigation ist für diesen Datenrahmen eingeschränkt. Sie können nicht schwenken, zoomen oder Lesezeichen verwenden. Wenn Sie diese Option auswählen, sind die entsprechenden Kartennavigationswerkzeuge und -befehle nicht verfügbar. Wenn Sie die Größe des Datenrahmens im Seitenlayout ändern, ändert sich der Kartenmaßstab, um die Ausdehnung konstant zu halten.

Wenn Sie die Größe des Datenrahmens im Seitenlayout ändern, ändert sich der Kartenmaßstab. Der in der Karte angezeigte geografische Bereich ändert sich nicht, wie unten dargestellt:


Sie können das Bild programmgesteuert abrufen und die Abmessungen mit Javascript überprüfen.

Dies kann nützlich sein, wenn das Bild nicht Teil des Markups ist.

clientWidth und clientHeight sind DOM-Eigenschaften, die die aktuelle browserinterne Größe der inneren Abmessungen eines DOM-Elements (ohne Rand und Rahmen) anzeigen. Im Falle eines IMG-Elements erhält dies also die tatsächlichen Abmessungen des sichtbaren Bildes.

Außerdem (zusätzlich zu den Antworten von Rex und Ian) gibt es:

Diese liefern die Höhe und Breite der Bilddatei selbst (und nicht nur des Bildelements).

Wenn Sie jQuery verwenden und Bildgrößen anfordern, müssen Sie warten, bis sie geladen werden, oder Sie erhalten nur Nullen.

Ich denke, eine Aktualisierung dieser Antworten ist nützlich, da eine der am besten bewerteten Antworten die Verwendung von clientWidth und clientHeight vorschlägt, die meiner Meinung nach jetzt veraltet sind.

Ich habe einige Experimente mit HTML5 durchgeführt, um zu sehen, welche Werte tatsächlich zurückgegeben werden.

Zunächst habe ich ein Programm namens Dash verwendet, um mir einen Überblick über die Bild-API zu verschaffen. Es besagt, dass height und width die gerenderte Höhe/Breite des Bildes sind und dass naturalHeight und naturalWidth die intrinsische Höhe/Breite des Bildes sind (und nur HTML5).

Ich habe ein Bild eines schönen Schmetterlings aus einer Datei mit Höhe 300 und Breite 400 verwendet. Und dieses Javascript:


6 Antworten 6

Aktivieren Sie beim Exportieren die Option "Zeichenflächen verwenden", wenn das Bild mit den Zeichenflächengrößen übereinstimmen soll. Andernfalls wird das Bild in der angegebenen Größe exportiert, nicht in der Zeichenflächengröße.

Der große Unterschied in den Exportgrößen könnte auf Rastereffekte wie den Schlagschatten zurückzuführen sein.

Außerdem (basierend auf den Kommentaren unten) ist eine mit 300 ppi exportierte Datei in Bezug auf die Abmessungen viel größer als eine mit 72 ppi exportierte Datei. Da PNG-Dateien keine Daten wie ppi speichern, werden die Dateiabmessungen angepasst, um eine höhere Auflösung zu ermöglichen.

Um dieselbe Größe der Zeichenfläche zu erreichen, müssen Sie sie mit einer Auflösung von 72 ppi exportieren. Wenn Sie es auf 150ppi oder 300ppi (oder einen anderen) ändern, wird das PNG seine Größe erhöhen, um dieser Auflösung zu entsprechen

Sie haben mit hoher Auflösung (300dpi) exportiert. Auf der anderen Seite hat "Für Web speichern" eine automatische Auflösung von 72 dpi. Das PNG mit 300 dpi ist größer als das PNG mit 72 dpi, da die Anzahl der Pixel im Bild erhöht wurde, während die Druckgröße gleich geblieben ist.

Es ist einfach, ein Bild mit bestimmten Pixelabmessungen in PNG zu exportieren, wenn die Zielauflösung 72 dpi beträgt. Richten Sie die Artboard einfach auf exakte Pixelmaße ein und exportieren Sie mit ausgewählter Option "Artboards verwenden".

Das Exportieren eines Bildes in Adobe Illustrator in das PNG-Format mit bestimmten Pixelabmessungen unter Verwendung der Auflösungseinstellung Hohe (300 dpi) scheint jedoch leider vom Benutzer Mathematik und eine potenzielle manuelle Größenänderung des Bildmaterials zu erfordern. Ich habe weder in den Illustrator-Einstellungen noch online eine automatisierte Lösung dafür gefunden.

Teilen Sie Ihre endgültige gewünschte Pixelbreite durch 4,166 (am Beispiel aus der Frage 1020px / 4,166 = 244,839).

Legen Sie in Illustrator die allgemeinen Einheiteneinstellungen auf "Pixel" fest.

Erstellen Sie eine leere Zeichenfläche mit Ihren endgültigen gewünschten Pixelmaßen (in diesem Beispiel 1020 x 100 Pixel) oder ändern Sie die Größe einer vorhandenen Zeichenfläche auf Ihre endgültigen gewünschten Pixelmaße.

Behalten Sie die Proportionen bei und ändern Sie die Breite der Zeichenfläche in den Quotienten in Schritt 2, und runden Sie sie je nach Bedarf auf eine ganze Zahl auf. (In diesem Beispiel wäre die Breite jetzt 245px und die Höhe hat sich im Verhältnis zur Breite automatisch auf 24px geändert).

Fügen Sie Bilder zu Artboard hinzu oder passen Sie die Größe vorhandener Bilder an.

Exportieren Sie in PNG mit der Angabe "Zeichenflächen verwenden" und verwenden Sie eine hohe Auflösung (300 dpi).

Das Ergebnis sollte eine PNG-Datei des Bildes mit einer Auflösung von 300 dpi und den endgültigen gewünschten Pixelmaßen (im Beispiel 1020 Pixel x 100 Pixel) sein.

"4.166" steht übrigens für die Vergrößerung, die auftritt, wenn ein 72dpi-Bild in 300dpi umgewandelt wird. Wenn Sie eine Datei in Illustrator in das PNG-Format exportieren, wobei die Zeichenfläche auf die endgültigen gewünschten Pixelabmessungen eingestellt ist und die Auflösung "Zeichenflächen verwenden" und eine hohe Auflösung (300 dpi) angegeben ist, sind die Abmessungen der resultierenden PNG-Datei 4,166-mal größer als Ihre endgültige gewünschte Abmessungen.

Umgerechnete Pixelbreite bei 300dpi / endgültige gewünschte Pixelbreite bei 72dpi = 4,166 (am Beispiel 4250 / 1020 = 4,166)


1. Sehen Sie sich die Details an, die in jedem dieser beiden Bilder sichtbar sind. Welches der beiden Bilder ist kleiner? Welche Anhaltspunkte haben Sie verwendet, um dies festzustellen? Wäre die Bildgebungsplattform für das kleinere Bild höchstwahrscheinlich ein Satellit oder ein Flugzeug gewesen?
Die Antwort ist .

2. Wenn Sie den allgemeinen Zustand der gesamten Vegetationsdecke über den kanadischen Prärieprovinzen mehrere Monate lang überwachen möchten, welche Art von Plattform und Sensoreigenschaften (räumliche, spektrale und zeitliche Auflösung) wären dafür am besten und warum?
Die Antwort ist .


4.2.3. Andere nützliche Ressourcen¶

Das Global Human Settlement Layer (GHSL)-Projekt produziert zeitnahe Geoinformationen über die menschliche Präsenz auf dem Planeten. Durch den Einsatz von Spatial Data Mining-Technologien sammelt das Projekt Informationen mit evidenzbasierten Analysen und Wissen. Die Informationen werden als bebaute Karten, Bevölkerungsdichtekarten und Siedlungskarten bereitgestellt. Die GHSL profitiert von der Nutzung heterogener Daten wie Satellitenbilder, Volkszählungsdaten und freiwillig bereitgestellte geografische Informationen.

Abb. 4.2.3.1 – Website der Global Human Settlement Layer, https://ghsl.jrc.ec.europa.eu/ ¶

Der Global Human Settlement Layer Population Layer (GHSL-POP) [2] ist ein räumlicher Raster-Datensatz, der die Verteilung und Dichte der Bevölkerung ausgedrückt in Anzahl der Menschen pro Zelle darstellt. Die Produktion dieser Bilder ist durch die Aufteilung von Volkszählungs- oder Verwaltungsraumdaten in Zellen möglich. Die Werte werden als Dezimalzahlen (Float) ausgedrückt und stellen die absolute Anzahl der Einwohner der Zelle dar. Die Wohnbevölkerung zielt auf die Jahre 1975, 1990, 2000 und 2015. Die GHSL-POP-Datensätze lassen sich beschreiben durch:

  • Produktname: GHS_POP_MT_GLOBE_R2019A
  • Koordinatensystem: Welt Mollweide (EPSG:54009), WGS (EPSG:4326)
  • Verfügbare Auflösung: 250 m, 1 km, 9 Bogensekunden, 30 Bogensekunden

Die Namenskonvention für die GHSL-POP-Datensätze ist definiert als ___ (z. B. GHS_POP_E2015_GLOBE_R2019A_4326_9SS_V1_0, das ist die Version 1 des GHSL-POP-Datensatzes für 2015 bezogen auf WGS84 mit einer Auflösung von 9 Bogensekunden).

NoData-Zellen werden -200 als Wert zugewiesen.

Nachdem Sie die in Abb. 4.2.3.1 dargestellten Schritte ausgeführt haben, finden Sie einen Webviewer, der die Kacheln für die GHSL-POP-Produkte visualisiert. An dieser Stelle können Sie auf die Kacheln Ihres Interessensbereichs klicken und den Download des Raster-Datasets ausführen.


Schau das Video: Download very high resolution satellite image metre for free