Heim > Backend-Entwicklung > Python-Tutorial > Rasteranalyse mit Uber hndexes und PostgreSQL

Rasteranalyse mit Uber hndexes und PostgreSQL

王林
Freigeben: 2024-08-12 22:31:33
Original
887 Leute haben es durchsucht

Hallo, in diesem Blog werden wir darüber sprechen, wie wir mit h3-Indizes ganz einfach Rasteranalysen durchführen können.

Objektiv

Zum Lernen werden wir eine Berechnung durchführen, um herauszufinden, wie viele Gebäude sich in der von ESRI Land Cover ermittelten Siedlungsfläche befinden. Ziel ist es, Daten auf nationaler Ebene sowohl für Vektor- als auch für Rasterdaten zu erhalten.

Lassen Sie uns zunächst die Daten finden

Laden Sie Rasterdaten herunter

Das Siedlungsgebiet habe ich von Esri Land Cover heruntergeladen.

  • https://livingatlas.arcgis.com/landcover/

Laden wir das Jahr 2023 mit einer Größe von ca. 362 MB herunter

Raster Analysis Using Uber hndexes and PostgreSQL

Laden Sie OSM Buildings of Nepal herunter

Quelle: http://download.geofabrik.de/asia/nepal.html

wget http://download.geofabrik.de/asia/nepal-latest.osm.pbf
Nach dem Login kopieren

Verarbeiten Sie die Daten vor

Lassen Sie uns vor den eigentlichen h3-Zellenberechnungen eine Vorverarbeitung der Daten durchführen
Für diesen Schritt verwenden wir das Befehlszeilenprogramm gdal. Installieren Sie gdal auf Ihrem Computer

Konvertierung in Cloud-optimiertes Geotiff

Wenn Sie Cog nicht kennen, schauen Sie hier vorbei: https://www.cogeo.org/

  • Überprüfen Sie, ob gdal_translate verfügbar ist
gdal_translate --version
Nach dem Login kopieren

Es sollte die von Ihnen verwendete GDAL-Version gedruckt werden

  • Raster auf 4326 neu projizieren

Ihr Raster verfügt möglicherweise über andere Quell-SRS, ändern Sie es entsprechend

gdalwarp esri-settlement-area-kathmandu-grid.tif esri-landcover-4326.tif -s_srs EPSG:32645 -t_srs EPSG:4326
Nach dem Login kopieren
  • Jetzt können wir TIF in Cloud-optimiertes Geotif konvertieren
gdal_translate -of COG esri-landcover-4326.tif esri-landcover-cog.tif
Nach dem Login kopieren

Es dauerte etwa eine Minute, das neu projizierte TIFF in Geotiff zu konvertieren

Fügen Sie OSM-Daten in die Postgresql-Tabelle ein

Wir verwenden osm2pgsql, um OSM-Daten in unsere Tabelle einzufügen

osm2pgsql --create nepal-latest.osm.pbf -U postgres
Nach dem Login kopieren

osm2pgsql benötigte insgesamt 274 Sekunden (4 Minuten und 34 Sekunden).

Sie können GeoJSON-Dateien auch verwenden, wenn Sie welche haben, die ogr2ogr verwenden

ogr2ogr -f PostgreSQL  PG:"dbname=postgres user=postgres password=postgres" buildings_polygons_geojson.geojson -nln buildings
Nach dem Login kopieren

ogro2gr bietet eine breite Palette an Treiberunterstützung, sodass Sie bei Ihren Eingaben ziemlich flexibel sind. Die Ausgabe ist die Postgresql-Tabelle

Berechnen Sie h3-Indizes

Postgresql

Installieren

pip install pgxnclient cmake
pgxn install h3
Nach dem Login kopieren

Erstellen Sie eine Erweiterung in Ihrer Datenbank

create extension h3;
create extension h3_postgis CASCADE;
Nach dem Login kopieren

Jetzt erstellen wir die Gebäudetabelle

CREATE TABLE buildings (
  id SERIAL PRIMARY KEY,
  osm_id BIGINT,
  building VARCHAR,
  geometry GEOMETRY(Polygon, 4326)
);
Nach dem Login kopieren

Daten in Tabelle einfügen

INSERT INTO buildings (osm_id, building, geometry)
SELECT osm_id, building, way
FROM planet_osm_polygon pop
WHERE building IS NOT NULL;
Nach dem Login kopieren

Protokoll und Timing:

Updated Rows    8048542
Query   INSERT INTO buildings (osm_id, building, geometry)
    SELECT osm_id, building, way
    FROM planet_osm_polygon pop
    WHERE building IS NOT NULL
Start time  Mon Aug 12 08:23:30 NPT 2024
Finish time Mon Aug 12 08:24:25 NPT 2024
Nach dem Login kopieren

Jetzt berechnen wir die h3-Indizes für diese Gebäude mithilfe von „centroid“. Hier ist 8 die H3-Auflösung, an der ich arbeite. Erfahren Sie hier mehr über Vorsätze

ALTER TABLE buildings ADD COLUMN h3_index h3index GENERATED ALWAYS AS (h3_lat_lng_to_cell(ST_Centroid(geometry), 8)) STORED;
Nach dem Login kopieren

Rasteroperationen

Installieren

pip install h3 h3ronpy rasterio asyncio asyncpg aiohttp
Nach dem Login kopieren

Stellen Sie sicher, dass sich das neu projizierte Zahnrad im statischen Zustand befindet/

mv esri-landcover-cog.tif ./static/
Nach dem Login kopieren

Führen Sie das im Repository bereitgestellte Skript aus, um h3-Zellen aus dem Raster zu erstellen. Ich resample nach Modusmethode: Dies hängt von der Art der Daten ab, die Sie haben. Für kategoriale Daten ist der Modus besser geeignet. Erfahren Sie hier mehr über Resampling-Methoden

python cog2h3.py --cog esri-landcover-cog.tif --table esri_landcover --res 8 --sample_by mode
Nach dem Login kopieren

Protokoll:

2024-08-12 08:55:27,163 - INFO - Starting processing
2024-08-12 08:55:27,164 - INFO - COG file already exists: static/esri-landcover-cog.tif
2024-08-12 08:55:27,164 - INFO - Processing raster file: static/esri-landcover-cog.tif
2024-08-12 08:55:41,664 - INFO - Determined Min fitting H3 resolution: 13
2024-08-12 08:55:41,664 - INFO - Resampling original raster to : 1406.475763m
2024-08-12 08:55:41,829 - INFO - Resampling Done
2024-08-12 08:55:41,831 - INFO - New Native H3 resolution: 8
2024-08-12 08:55:41,967 - INFO - Converting H3 indices to hex strings
2024-08-12 08:55:42,252 - INFO - Raster calculation done in 15 seconds
2024-08-12 08:55:42,252 - INFO - Creating or replacing table esri_landcover in database
2024-08-12 08:55:46,104 - INFO - Table esri_landcover created or updated successfully in 3.85 seconds.
2024-08-12 08:55:46,155 - INFO - Processing completed
Nach dem Login kopieren

Analyse

Lasst uns eine Funktion erstellen, um_h3_indexes in einem Polygon zu erhalten

CREATE OR REPLACE FUNCTION get_h3_indexes(shape geometry, res integer)
  RETURNS h3index[] AS $$
DECLARE
  h3_indexes h3index[];
BEGIN
  SELECT ARRAY(
    SELECT h3_polygon_to_cells(shape, res)
  ) INTO h3_indexes;

  RETURN h3_indexes;
END;
$$ LANGUAGE plpgsql IMMUTABLE;
Nach dem Login kopieren

Lassen Sie uns alle Gebäude abrufen, die in unserem Interessengebiet als bebaute Fläche identifiziert wurden

WITH t1 AS (
  SELECT *
  FROM esri_landcover el
  WHERE h3_ix = ANY (
    get_h3_indexes(
      ST_GeomFromGeoJSON('{
        "coordinates": [
          [
            [83.72922006065477, 28.395029869336483],
            [83.72922006065477, 28.037312312532066],
            [84.2367635433626, 28.037312312532066],
            [84.2367635433626, 28.395029869336483],
            [83.72922006065477, 28.395029869336483]
          ]
        ],
        "type": "Polygon"
      }'), 8
    )
  ) AND cell_value = 7
)
SELECT *
FROM buildings bl
JOIN t1 ON bl.h3_ix = t1.h3_ix;
Nach dem Login kopieren

Abfrageplan:

Raster Analysis Using Uber hndexes and PostgreSQL

Dies kann weiter verbessert werden, wenn der Index für die Gebäudespalte h3_ix hinzugefügt wird

create index on buildings(h3_ix);
Nach dem Login kopieren

Zählung der Aufnahme: In meiner Gegend gab es 24.416 Gebäude mit der Bauklasse ESRI

Überprüfung

Lasst uns überprüfen, ob die Ausgabe wahr ist: Lasst uns die Gebäude als Geojson abrufen

WITH t1 AS (
  SELECT *
  FROM esri_landcover el
  WHERE h3_ix = ANY (
    get_h3_indexes(
      ST_GeomFromGeoJSON('{
        "coordinates": [
          [
            [83.72922006065477, 28.395029869336483],
            [83.72922006065477, 28.037312312532066],
            [84.2367635433626, 28.037312312532066],
            [84.2367635433626, 28.395029869336483],
            [83.72922006065477, 28.395029869336483]
          ]
        ],
        "type": "Polygon"
      }'), 8
    )
  ) AND cell_value = 7
)
SELECT jsonb_build_object(
  'type', 'FeatureCollection',
  'features', jsonb_agg(ST_AsGeoJSON(bl.*)::jsonb)
)
FROM buildings bl
JOIN t1 ON bl.h3_ix = t1.h3_ix;
Nach dem Login kopieren

Lass uns auch H3-Zellen bekommen

with t1 as (
  SELECT *, h3_cell_to_boundary_geometry(h3_ix)
  FROM esri_landcover el
  WHERE h3_ix = ANY (
    get_h3_indexes(
      ST_GeomFromGeoJSON('{
        "coordinates": [
          [
            [83.72922006065477, 28.395029869336483],
            [83.72922006065477, 28.037312312532066],
            [84.2367635433626, 28.037312312532066],
            [84.2367635433626, 28.395029869336483],
            [83.72922006065477, 28.395029869336483]
          ]
        ],
        "type": "Polygon"
      }'), 8
    )
  ) AND cell_value = 7
)
SELECT jsonb_build_object(
  'type', 'FeatureCollection',
  'features', jsonb_agg(ST_AsGeoJSON(t1.*)::jsonb)
)
FROM t1
Nach dem Login kopieren

Raster Analysis Using Uber hndexes and PostgreSQL

Die Genauigkeit kann nach Erhöhung der h3-Auflösung erhöht werden und hängt auch von der Eingabe- und Resampling-Technik ab

Aufräumen

Lassen Sie die Tische weg, die wir nicht brauchen

drop table planet_osm_line;
drop table planet_osm_point;
drop table planet_osm_polygon;
drop table planet_osm_roads;
drop table osm2pgsql_properties;
Nach dem Login kopieren

Optional – Vektorkacheln

Um die Kacheln zu visualisieren, können wir mit pg_tileserv schnell Vektorkacheln erstellen

  • Laden Sie pg_tileserv herunter Laden Sie es über den oben angegebenen Link herunter oder verwenden Sie Docker
  • Anmeldeinformationen exportieren
export DATABASE_URL=postgresql://postgres:postgres@localhost:5432/postgres
Nach dem Login kopieren
  • Gewähren Sie unserer Tabellenauswahlberechtigung
GRANT SELECT ON buildings to postgres;
GRANT SELECT ON esri_landcover to postgres;
Nach dem Login kopieren
  • Erstellen wir Geometrie auf h3-Indizes zur Visualisierung (Sie können dies direkt aus der Abfrage heraus tun, wenn Sie Kacheln manuell aus st_asmvt erstellen)
ALTER TABLE esri_landcover 
ADD COLUMN geometry geometry(Polygon, 4326) 
GENERATED ALWAYS AS (h3_cell_to_boundary_geometry(h3_ix)) STORED;
Nach dem Login kopieren
  • Erstellen Sie einen Index für dieses H3-Geom, um es effektiv zu visualisieren
CREATE INDEX idx_esri_landcover_geometry 
ON esri_landcover 
USING GIST (geometry);
Nach dem Login kopieren
  • Lauf
  ./pg_tileserv
Nach dem Login kopieren

Raster Analysis Using Uber hndexes and PostgreSQL

  • Jetzt können Sie diese MVT-Kacheln basierend auf dem Kachelwert oder auf jede gewünschte Weise visualisieren, z. B. mit Maplibre! Sie können das verarbeitete Ergebnis auch visualisieren oder mit anderen Datensätzen kombinieren. Dies ist die Visualisierung, die ich für h3-Indizes basierend auf ihrem Zellwert in QGIS erstellt habe Raster Analysis Using Uber hndexes and PostgreSQL

Quellen-Repo: https://github.com/kshitijrajsharma/raster-analysis-using-h3

Referenzen:

  • https://blog.rustprooflabs.com/2022/04/postgis-h3-intro
  • https://jsonsingh.com/blog/uber-h3/
  • https://h3ronpy.readthedocs.io/en/latest/

Das obige ist der detaillierte Inhalt vonRasteranalyse mit Uber hndexes und PostgreSQL. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:dev.to
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage