Kapitel 10. Rasterdatahantering, frågor och applikationer

Innehållsförteckning

10.1. Läs in och skapa raster

I de flesta användningsfall skapar du PostGIS-raster genom att ladda befintliga rasterfiler med hjälp av den paketerade rasterladdaren raster2pgsql.

10.1.1. Använda raster2pgsql för att läsa in raster

Raster2pgsql är en körbar rasterläsa inre som läsa inr GDAL-stödda rasterformat till SQL som lämpar sig för laddning i en PostGIS-rastertabell. Den kan läsa in mappar med rasterfiler samt skapa översikter över raster.

Eftersom raster2pgsql oftast kompileras som en del av PostGIS (om du inte kompilerar ditt eget GDAL-bibliotek), kommer de rastertyper som stöds av den körbara filen att vara desamma som de som kompileras i GDAL-beroendebiblioteket. För att få en lista över rastertyper som just din raster2pgsql stöder, använd -G-omkopplaren.

[Notera]

När du skapar översikter över en viss faktor från en uppsättning raster som är anpassade är det möjligt att översikterna inte är anpassade. Besök http://trac.osgeo.org/postgis/ticket/1764 för ett exempel där översikterna inte är i linje.

10.1.1.1. Exempel på användning

Ett exempel på en session där laddaren används för att skapa en inmatningsfil och ladda upp den i 100x100 bitar kan se ut så här:

Inläsaren tilldelar SRID 4326, skapar ett index och standardbegränsningar, analyserar den inlästa tabellen, registrerar källfilnamn och lagrar indatarastren i rutor på 100×100 pixlar.

Kod
raster2pgsql -s 4326 -I -C -M -F -t 100x100 *.tif public.demelevation 
> elev.sql
psql -d gisdb -f elev.sql
[Notera]

Om du inte anger schemat som en del av måltabellens namn kommer tabellen att skapas i standardschemat för den databas eller användare som du ansluter till.

En konvertering och uppladdning kan göras i ett steg med hjälp av UNIX pipes:

Kod
raster2pgsql -s 4326 -I -C -M -F -t 100x100 \
  *.tif public.demelevation |
  psql -d gisdb

Läs in raster Massachusetts statliga planmätare flygplattor i ett schema som heter aerial och skapa en fullständig vy, 2 och 4 nivå översiktstabeller, använd kopieringsläge för att infoga (ingen mellanliggande fil bara direkt till db) och -e tvingar inte allt i en transaktion (bra om du vill se data i tabeller direkt utan att vänta). Dela upp rastren i 128x128 pixelplattor och tillämpa rasterbegränsningar. Använd kopieringsläge i stället för tabellinsättning. (-F) Inkludera ett fält som heter filename för att innehålla namnet på filen som plattorna klipptes ut från.

Kod
raster2pgsql -I -C -e -Y -F -s 26986 -t 128x128 -l 2,4 \
  bostonaerials2008/*.jpg aerials.boston |
  psql -U postgres -d gisdb -h localhost -p 5432

Lista de rasterformat som stöds av det här bygget:

Kod
raster2pgsql -G

Kommandot -G matar ut en lista som liknar:

Utdata
Available GDAL raster formats:
  Virtual Raster
  GeoTIFF
  National Imagery Transmission Format
  Raster Product Format TOC format
  ECRG TOC format
  Erdas Imagine Images (.img)
  CEOS SAR Image
  CEOS Image
  ...
  Arc/Info Export E00 GRID
  ZMap Plus Grid
  NOAA NGS Geoid Height Grids

10.1.1.2. raster2pgsql-alternativ

Långa alternativ som tar värden accepterar också skrivsättet --option=value.

-?, --help

Visa hjälpskärm. Hjälp visas också om du inte skickar in några argument.

-G, --gdal-formats

Skriv ut de rasterformat som stöds.

(c|a|d|p) Dessa är ömsesidigt uteslutande alternativ:

-c

Skapa en ny tabell och fyll i den med raster, detta är standardläget

-a

Lägg till raster till en befintlig tabell.

-d

Ta bort tabell, skapa en ny och fyll den med raster(s)

-p

Förbered läge, skapa bara bordet.

--if-not-exists

Använd IF NOT EXISTS för tabellskapande i lägena -c och -p. När -I eller --create-index också anges används IF NOT EXISTS även för indexskapande. Detta alternativ kan inte användas med -d. Tilläggsläget kräver en uttrycklig skapandeåtgärd.

Atomiska inläsaråtgärder

De korta lägena är förinställningar för uttryckliga åtgärder. Motsvarande långa alternativ är --drop-table, --create-table, --load-data, --create-index, --add-constraints, --vacuum, --analyze och --no-transaction. Lägg till --if-not-exists så att aktiva skapandeåtgärder använder IF NOT EXISTS. --drop-table matar ut DROP TABLE IF EXISTS före de valda åtgärderna. När inget läge anges gäller fortfarande standardskapande-/inläsningsåtgärderna.

Rasterbearbetning: Tillämpa begränsningar för korrekt registrering i rasterkataloger

-C, --add-constraints

Tillämpa rasterbegränsningar - srid, pixelstorlek etc. för att säkerställa att raster är korrekt registrerat i vyn raster_columns.

-x, --no-extent

Inaktivera inställning av begränsningen för maximal utsträckning. Tillämpas endast om -C eller --add-constraints också används.

-r, --regular-blocking

Sätt begränsningarna (rumsligt unik och täckningsruta) för vanlig blockindelning. Tillämpas endast om -C eller --add-constraints också används.

Rasterbearbetning: Valfria parametrar som används för att manipulera inmatad rasterdatauppsättning

-s, --srid [<FROM_SRID>:]<SRID>

Tilldela utdatarastret det angivna SRID:t. När FROM_SRID också anges markerar raster2pgsql indatarastret med FROM_SRID och matar ut SQL som omprojicerar rastret till mål-SRID:t. Om käll-SRID:t utelämnas eller är noll kontrolleras rastermetadata för att fastställa ett lämpligt käll-SRID. Omprojektion kan inte användas med kopieringsläge.

-b, --band BAND

Index (1-baserat) för det band som ska extraheras från rastret. För mer än ett bandindex, separera med kommatecken (,). Om inget anges kommer alla band i rastret att extraheras.

-t, --tile-size TILE_SIZE

Skär rastret i brickor som ska infogas, en per tabellrad. TILE_SIZE uttrycks som WIDTHxHEIGHT eller sätts till värdet "auto" för att låta inläsaren beräkna en lämplig brickstorlek med hjälp av det första rastret och tillämpas på alla raster.

-P, --pad

Fyll på längst till höger och längst ner för att garantera att alla brickor har samma bredd och höjd.

-R, --register

Registrera rastret som ett filsystemraster (out-db).

Endast metadata för rastret och sökvägen till rastret lagras i databasen (inte pixlarna).

-l, --overview-factor OVERVIEW_FACTOR

Skapa en översikt av rastret. Separera med kommatecken (,) för mer än en faktor. Namnet på översiktstabellen följer mönstret o_overview factor_table, där overview factor är en platshållare för en numerisk översiktsfaktor och table ersätts med bastabellens namn. Om ett källraster redan har en översikt med matchande dimensioner återanvänds den. Den skapade översikten lagras i databasen och påverkas inte av -R. Observera att den genererade SQL-filen innehåller både huvudtabellen och översiktstabellerna.

-N, --nodata NODATA

NODATA-värde som ska användas på band utan NODATA-värde.

Valfria parametrar som används för att manipulera databasobjekt

-f, --raster-column COLUMN

Ange namn på målrasterkolumn, standard är 'rast'

-F, --filename

Lägg till en kolumn med namnet på filen

-n, --filename-column COLUMN

Ange namnet på kolumnen för filnamn. Innebär -F.

-q, --quote

Packa in PostgreSQL-identifierare i citat.

-I

Alias för --create-index.

--create-index

Skapa ett GiST-index på rasterkolumnen i slutet av denna raster2pgsql-körning. Vid upprepade tilläggskörningar med -a skapar du indexet i den sista körningen eller efter inläsning; lägg till --if-not-exists för att låta omkörningar tolerera ett befintligt index.

-M

Vakuumanalysera rastertabellen.

-k, --skip-nodata-check

Behåller tomma plattor och hoppar över NODATA-värdeskontroller för varje rasterband. Observera att du sparar tid på att kontrollera, men kan sluta med mycket fler skräprader i din databas och dessa skräprader markeras inte som tomma rutor.

-T, --tablespace tablespace

Ange tablespace för den nya tabellen. Observera att index (inklusive primärnyckeln) fortfarande kommer att använda standardtabellutrymmet om inte flaggan -X också används.

-X, --index-tablespace tablespace

Ange tablespace för tabellens nya index. Detta gäller för primärnyckeln och det spatiala indexet om flaggan -I används.

-Y, --copy [MAX_ROWS_PER_COPY]

Använd copy-satser i stället för insert-satser. Ange valfritt max_rows_per_copy; standard 50 om inget anges.

-e, --no-transaction

Utför varje villkor individuellt, använd inte en transaktion.

-E, --endian ENDIAN

Styr endianness för genererad binär utdata av raster; ange 0 för XDR och 1 för NDR (standard); endast NDR-utdata stöds nu

-V, --wkb-version version

Ange version av utdataformat. Standard är 0. Endast 0 stöds för närvarande.

10.1.2. Skapa raster med hjälp av PostGIS rasterfunktioner

Vid många tillfällen vill du skapa raster och rastertabeller direkt i databasen. Det finns en uppsjö av funktioner för att göra det. De allmänna stegen att följa.

  1. Skapa en tabell med en rasterkolumn för att hålla de nya rasterposterna, vilket kan åstadkommas med:

    Kod
    CREATE TABLE myrasters(rid serial primary key, rast raster);
  2. Det finns många funktioner som hjälper till med det målet. Om du skapar raster som inte är ett derivat av andra raster, bör du börja med: ST_MakeEmptyRaster, följt av ST_AddBand

    Du kan också skapa raster från geometrier. För att uppnå det vill du använda ST_AsRaster kanske tillsammans med andra funktioner som ST_Union eller ST_MapAlgebraFct eller någon av familjen av andra map algebra-funktioner.

    Det finns även många fler alternativ för att skapa nya rastertabeller från befintliga tabeller. Du kan t.ex. skapa en rastertabell i en annan projektion än en befintlig med hjälp av ST_Transform

  3. När du är klar med att fylla i din tabell initialt vill du skapa ett spatialt index på rasterkolumnen med något liknande:

    Kod
    CREATE INDEX myrasters_rast_st_convexhull_idx ON myrasters USING gist(ST_ConvexHull(rast));

    Observera användningen av ST_ConvexHull eftersom de flesta rasteroperatorer baseras på rastrernas konvexa skrov.

    [Notera]

    Pre-2.0-versioner av PostGIS-raster baserades på kuvertet snarare än det konvexa skrovet. För att de spatiala indexen ska fungera korrekt måste du ta bort dem och ersätta dem med index baserade på konvexa skrov.

  4. Tillämpa rasterbegränsningar med hjälp av AddRasterConstraints

10.1.3. Använda "out db"-molnraster

Verktyget raster2pgsql använder GDAL för att få åtkomst till rasterdata och kan dra nytta av en viktig GDAL-funktion: möjligheten att läsa från raster som lagras på distans i molnbaserade "objektlager" (t.ex. AWS S3, Google Cloud Storage).

Effektiv användning av molnlagrade raster kräver att man använder ett "molnoptimerat" format. Det mest välkända och använda är det"molnoptimerade GeoTIFF"-formatet. Om du använder ett format som inte är molnbaserat, t.ex. JPEG eller en TIFF som inte är kaklad, får du mycket dåliga prestanda eftersom systemet måste ladda ner hela rastret varje gång det behöver komma åt en delmängd.

Först laddar du ditt raster i den molnlagring du väljer. När den har laddats kommer du att ha en URI för att komma åt den, antingen en "http"-URI eller ibland en URI som är specifik för tjänsten. (t.ex. "s3://bucket/object"). Om du vill komma åt icke-offentliga buckets måste du ange GDAL-konfigurationsalternativ för att autentisera din anslutning. Observera att det här kommandot läser från molnrastret och skriver till databasen.

Kod
AWS_ACCESS_KEY_ID=xxxxxxxxxxxxxxxxxxxx \
AWS_SECRET_ACCESS_KEY=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx \
raster2pgsql \
  -s 990000 \
  -t 256x256 \
  -I \
  -R \
  /vsis3/your.bucket.com/your_file.tif \
  your_table \
  | psql your_db

När tabellen har laddats måste du ge databasen behörighet att läsa från fjärraster genom att ange två behörigheter, postgis.enable_outdb_rasters och postgis.gdal_enabled_drivers.

Kod
SET postgis.enable_outdb_rasters = true;
SET postgis.gdal_enabled_drivers TO 'ENABLE_ALL';
    

För att ändringarna ska bli bestående kan du göra dem direkt i din databas. Du måste återansluta för att uppleva de nya inställningarna.

Kod
ALTER DATABASE your_db SET postgis.enable_outdb_rasters = true;
ALTER DATABASE your_db SET postgis.gdal_enabled_drivers TO 'ENABLE_ALL';
    

För icke-publika raster kan du behöva ange åtkomstnycklar för att läsa från molnrastern. Samma nycklar som du använde för att skriva raster2pgsql-anropet kan ställas in för användning i databasen med postgis.gdal_vsi_options -konfigurationen. Observera att flera alternativ kan ställas in genom att mellanslag separerar nyckel=värde-paren.

Kod
SET postgis.gdal_vsi_options = 'AWS_ACCESS_KEY_ID=xxxxxxxxxxxxxxxxxxxx
AWS_SECRET_ACCESS_KEY=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx';

När du har laddat data och ställt in behörigheter kan du interagera med rastertabellen som med vilken annan rastertabell som helst och använda samma funktioner. Databasen hanterar all mekanik för att ansluta till molndata när den behöver läsa pixeldata.

10.2. Rastertäckningar och raster-/vektoranalys

En täckning är ett sätt att tolka rumsliga data som en mappning från en domän av platser till en mängd av värden. Att utvärdera en täckning innebär att fråga efter värdet på en plats; en invers fråga frågar efter de platser vars värden uppfyller ett villkor. PostGIS exponerar ingen generell SQL-typ för ISO 19123-täckningar, men geometriska tabeller och rastervärden tillhandahåller byggstenarna för båda riktningarna.

En täckning kan vara kontinuerlig med värden beräknade eller interpolerade för godtyckliga platser, eller diskret med värden från lagrade rumsliga objekt eller rutnätsceller. Täckningsmodellen beskriver hur platser mappas till värden oberoende av om värdena kommer från en ekvation, en tabell eller ett eller flera rastervärden. En tidskolumn eller ett funktionsargument kan lägga till en tidsdimension utan att ändra denna åtskillnad.

I en vektortäckning tillhandahåller en geometrikolumn domänen och andra kolumner attribut i värdemängden. En vektorvärdemängd kan innehålla text, tal eller ett annat rumsligt värde, förutsatt att dess betydelse och typ är konsekventa överallt där täckningen definieras. I ett raster är varje cellplats en del av domänen och bandvärdena i cellen utgör värdemängden. Andra kolumner i samma tabellrad beskriver rastervärdet eller rutan som helhet; de kopplar inte separata värden till enskilda celler.

En logisk rastertäckning kan lagras som ett rastervärde eller som många rutor i en tabell. Rutor som tillhör en täckning bör ha kompatibla SRID:n, skalor, justering, bandantal, pixeltyper och NODATA-konventioner. Begränsningarna som exponeras av Avsnitt 10.3.1, ”Rasterkolumner Katalog” registrerar och validerar dessa egenskaper.

Arrangemang för rastertabeller. En rasterkolumn kan representera ett bildlager, en rutindelad täckning eller en samling rastrerade objekt. Dessa arrangemang har olika antaganden om rutstorlek, justering, mellanrum och överlappningar. PostGIS härleder inte det avsedda arrangemanget enbart från kolumntypen.

Arrangemang Radrelation Typisk användning
Bildlager Oberoende raster; storlek, justering och utsträckning kan skilja sig eller överlappa Katalogisering av orelaterade källbilder
Oregelbunden rutindelad täckning En logisk täckning där mellanrum tillåts, rutstorlekar varierar och överlappning normalt saknas Inkrementella eller källdrivna mosaiker
Regelbunden rutindelad täckning En justering och rutstorlek utan överlappning; mellanrum kan finnas kvar vid gränsen eller inne i täckningen Indexerad analys över en stor täckning
Rektangulär regelbunden täckning Lika justerade rutor fyller en rektangulär utsträckning utan mellanrum eller överlappningar Förutsägbar blockbearbetning och generering av översikter
Separata rutindelade bilder Varje bild är internt regelbunden men lagras i sin egen tabell eller partition Håller källbildens identitet och livscykel åtskilda
Täckning med rasterobjekt Varje rad är ett rastrerat objekt; utsträckning och storlek kan skilja sig eller överlappa Objektmodeller där celler ersätter eller kompletterar vektorgeometri

Använd AddRasterConstraints för att registrera gemensamma egenskaper för SRID, skala, justering, band, utsträckning och regelbunden blockindelning och använd rumsliga index och programbegränsningar för relationer som katalogen inte kan uttrycka.

Frågor mot en rutindelad täckning har normalt två steg:

  1. Använd rasterkolumnens rumsliga index och ST_Intersects för att välja kandidatrutor.

  2. Läs, klipp, aggregera eller vektorisera värden inuti dessa rutor med funktioner som ST_Value, ST_Clip, ST_SummaryStatsAgg och ST_DumpAsPolygons.

ST_DumpAsPolygons returnerar geomval-rader som parar ihop geometrier med cellvärden. Detta gör att vanlig geometriöverlagring och filtrering kan besvara inversa täckningsfrågor, men att polygonisera många celler är vanligen dyrare än att behålla åtgärden i rasterutrymmet.

Välj gränssemantik medvetet. Att klippa och aggregera rasterpixlar är vanligtvis den kortare och snabbare vägen. Om en partiell gränscell måste bidra i proportion till sin täckta area ska du skära geometrin med raderna geomval och beräkna ett areaviktat resultat i ett lämpligt projicerat koordinatsystem. Den exakta metoden för partiella celler kostar mer eftersom den vektoriserar de valda cellerna.

Rutstorleken påverkar båda sidor av den indexerade frågan: mindre rutor minskar mängden rasterdata som granskas för varje kandidatrad, men ökar omkostnaden för rader och index. Prestandatesta representativa frågor i stället för att behandla en rutstorlek som ett universellt standardvärde.

För ett aktuellt helhetsmönster för raster/vektor laddar och indelar du data i rutor med Avsnitt 10.1.1, ”Använda raster2pgsql för att läsa in raster” och ser sedan byggnadsexemplet i ST_SummaryStats. Det väljer skärande rutor, klipper dem till varje polygon och kombinerar statistik per ruta till ett resultat per objekt. För punktobservationer som djurplatser buffrar du först punkterna i ett lämpligt projicerat koordinatsystem och tillämpar sedan samma mönster för val av rutor, klippning och aggregering på en höjd- eller annan kontinuerlig rastertäckning.

10.3. Rasterkataloger

Det finns två rasterkatalogvyer som levereras med PostGIS. Båda vyerna använder information som är inbäddad i begränsningarna i rastertabellerna. Som ett resultat är katalogvyerna alltid konsekventa med rasterdata i tabellerna eftersom begränsningarna verkställs.

  1. raster_columns Denna vy katalogiserar alla rastertabellkolumner i databasen.

  2. raster_overviews Denna vy katalogiserar alla rastertabellkolumner i din databas som fungerar som översikter för en mer finkornig tabell. Tabeller av den här typen genereras när du använder växeln -l under inläsning.

10.3.1. Rasterkolumner Katalog

Raster_columns är en katalog över alla kolumner i rastertabeller i databasen som är av typen raster. Det är en vy som utnyttjar begränsningarna i tabellerna så att informationen alltid är konsekvent även om du återställer en rastertabell från en säkerhetskopia av en annan databas. Följande kolumner finns i katalogen raster_columns.

Om du inte skapade dina tabeller med inläsningsprogrammet eller glömde att ange flaggan -C under inläsningen kan du genomdriva begränsningarna i efterhand med hjälp av AddRasterConstraints så att raster_columns-katalogen registrerar den gemensamma informationen om dina rasterplattor.

  • r_table_catalog Den databas som tabellen finns i. Detta kommer alltid att läsa den aktuella databasen.

  • r_table_schema Det databasschema som rastertabellen tillhör.

  • r_table_namn rastertabell

  • r_raster_column den kolumn i tabellen r_table_name som är av typen raster. Det finns inget i PostGIS som hindrar dig från att ha flera rasterkolumner per tabell, så det är möjligt att ha en rastertabell listad flera gånger med en annan rasterkolumn för varje.

  • srid Den spatiala referensidentifieraren för rastret. Bör vara en post i Avsnitt 4.5, ”Spatiala referenssystem”.

  • scale_x Skalningen mellan geometriska rumskoordinater och pixel. Detta är endast tillgängligt om alla tiles i rasterkolumnen har samma scale_x och denna begränsning tillämpas. Se ST_ScaleX för mer information.

  • scale_y Skalningen mellan geometriska rumskoordinater och pixel. Detta är endast tillgängligt om alla tiles i rasterkolumnen har samma scale_y och scale_y-begränsningen tillämpas. Se ST_ScaleY för mer information.

  • blocksize_x Bredden (antal pixlar tvärs över) för varje rasterplatta. Se ST_Width för mer information.

  • blocksize_y Bredden (antal pixlar nedåt) för varje rasterplatta. Se ST_Height för mer information.

  • same_alignment är ett booleskt värde som är true om alla rasterplattor har samma inriktning. Se ST_SameAlignment för mer information.

  • regular_blocking Om rasterkolumnen har begränsningarna spatially unique och coverage tile är värdet TRUE. Annars kommer det att vara FALSE.

  • num_bands Antalet band i varje platta i rasteruppsättningen. Detta är samma information som den som tillhandahålls av ST_NumBands

  • pixel_types En array som definierar pixeltypen för varje band. Du kommer att ha samma antal element i denna array som du har antal band. Pixel_types är en av följande definierade i ST_BandPixelType.

  • nodata_values En matris med tal med dubbel precision som anger nodata_värdet för varje band. Du kommer att ha samma antal element i den här matrisen som du har antal band. Dessa siffror definierar pixelvärdet för varje band som bör ignoreras för de flesta operationer. Detta är liknande information som tillhandahålls av ST_BandNoDataValue.

  • out_db En array med booleska flaggor som anger om rasterbanddata sparas utanför databasen. Du kommer att ha samma antal element i denna array som du har antal band.

  • extent Detta är omfattningen av alla rasterrader i din rasteruppsättning. Om du planerar att läsa in mer data som kommer att ändra uppsättningens utsträckning, bör du köra funktionen DropRasterConstraints före laddningen och sedan tillämpa begränsningar på nytt med AddRasterConstraints efter laddningen.

  • spatial_index En boolean som är sann om rasterkolumnen har ett spatialt index.

10.3.2. Raster-översikter

raster_overviews katalogiserar information om rastertabellkolumner som används för översikter och ytterligare information om dem som är bra att känna till när man använder översikter. Översiktstabeller katalogiseras i både raster_columns och raster_overviews eftersom de är rastertabeller i sig själva men också har ett särskilt syfte, nämligen att vara en karikatyr med lägre upplösning av en tabell med högre upplösning. Dessa genereras tillsammans med huvudrastertabellen när du använder -l-omkopplaren i rasterladdningen eller kan genereras manuellt med AddOverviewConstraints.

Översiktstabeller innehåller samma begränsningar som andra rastertabeller samt ytterligare begränsningar som endast gäller information och som är specifika för översikter.

[Notera]

Informationen i raster_overviews duplicerar inte informationen i raster_columns. Om du behöver information om en översiktstabell som finns i raster_columns kan du koppla ihop raster_overviews och raster_columns för att få den fullständiga information du behöver.

Två huvudskäl till översikter är:

  1. Lågupplöst representation av kärntabellerna som ofta används för snabb utzoomning av kartor.

  2. Det går i allmänhet snabbare att göra beräkningar på dem än på deras högupplösta förlagor eftersom det finns färre poster och varje pixel täcker ett större område. Även om beräkningarna inte är lika exakta som de högupplösta tabeller de stöder, kan de vara tillräckliga i många tumregelberäkningar.

Katalogen raster_overviews innehåller följande kolumner med information.

  • o_table_catalog Den databas som översiktstabellen finns i. Detta kommer alltid att läsa den aktuella databasen.

  • o_table_schema Det databasschema som översiktsrastertabellen tillhör.

  • o_table_name namn på tabell för rasteröversikt

  • o_raster_column rasterkolumnen i översiktstabellen.

  • r_table_catalog Databasen där rastertabellen för denna översiktstjänst finns. Detta kommer alltid att läsa den aktuella databasen.

  • r_table_schema Databasschemat för den rastertabell som denna översiktstjänst tillhör.

  • r_table_name rastertabell som denna översikt hanterar.

  • r_raster_column den rasterkolumn som denna översiktskolumn hanterar.

  • overview_factor - detta är pyramidnivån för översiktstabellen. Ju högre siffra desto lägre upplösning på tabellen. raster2pgsql kommer, om den får en mapp med bilder, att beräkna översikten för varje bildfil och läsa in den separat. Nivå 1 antas alltid vara originalfilen. Nivå 2 är att varje platta representerar 4 av originalet. Så om du till exempel har en mapp med bildfiler på 5000x5000 pixlar som du valt att dela upp i 125x125, kommer din bastabell för varje bildfil att ha (5000*5000)/(125*125) poster = 1600, din (l=2) o_2-tabell kommer att ha tak(1600/Power(2,2)) = 400 rader, din (l=3) o_3 kommer att ha tak(1600/Power(2,3)) = 200 rader. Om dina pixlar inte är delbara med storleken på dina brickor kommer du att få några skrotbrickor (brickor som inte är helt fyllda). Observera att varje översiktsplatta som genereras av raster2pgsql har samma antal pixlar som sin förälder, men har en lägre upplösning där varje pixel i den representerar (Power(2,overview_factor) pixlar av originalet).

10.4. Bygga anpassade applikationer med PostGIS Raster

Det faktum att PostGIS raster ger dig SQL-funktioner för att rendera raster i kända bildformat ger dig många alternativ för att rendera dem. Du kan till exempel använda OpenOffice / LibreOffice för rendering, vilket visas i Rendering av PostGIS Raster-grafik med LibreOffice Base Reports. Dessutom kan du använda en mängd olika språk som visas i det här avsnittet.

10.4.1. PHP-exempel Utdata med ST_AsPNG i kombination med andra rasterfunktioner

I det här avsnittet kommer vi att visa hur man använder PHP PostgreSQL-drivrutinen och ST_AsGDALRaster -familjen av funktioner för att mata ut band 1,2,3 av en raster till en PHP-förfrågningsström som sedan kan bäddas in i en img src html-tagg.

Exempelfrågan visar hur man kombinerar ett helt gäng rasterfunktioner tillsammans för att ta tag i alla plattor som skär en viss wgs 84 avgränsningsbox och sedan förenar med ST_Union de korsande plattorna tillsammans och returnerar alla band, transformerar till användarens angivna projektion med ST_Transform och sedan matar ut resultaten som en png med ST_AsPNG.

Du anropar skriptet med http://mywebserver/test_raster.php?srid=2249 för att få rasterbilden i Massachusetts State Plane-fot.

Kod
<?php
$conn_str = 'dbname=mydb host=localhost port=5432 user=myuser password=mypwd';
$dbconn = pg_connect($conn_str);
header('Content-Type: image/png');

if (!empty($_REQUEST['srid']) &amp;&amp; is_numeric($_REQUEST['srid'])) {
    $input_srid = intval($_REQUEST['srid']);
} else {
    $input_srid = 26986;
}

$sql = "SET bytea_output = 'escape';
SELECT ST_AsPNG(
    ST_Transform(
        ST_AddBand(
            ST_Union(rast, 1),
            ARRAY[ST_Union(rast, 2), ST_Union(rast, 3)]
        ),
        $input_srid
    )
) AS new_rast
FROM aerials.boston
WHERE ST_Intersects(
    rast,
    ST_Transform(
        ST_MakeEnvelope(-71.1217, 42.227, -71.1210, 42.218, 4326),
        26986
    )
)";

$result = pg_query($sql);
$row = pg_fetch_row($result);
pg_free_result($result);
if ($row === false) return;
echo pg_unescape_bytea($row[0]);
?>

10.4.2. ASP.NET C# Exempel Utdata med hjälp av ST_AsPNG tillsammans med andra rasterfunktioner

I detta avsnitt visar vi hur Npgsql PostgreSQL .NET-drivrutinen och funktionsfamiljen ST_AsGDALRaster kan användas för att mata ut band 1, 2 och 3 i ett raster till HTTP-svarsströmmen så att det kan bäddas in i en img-tagg.

Du behöver npgsql .NET PostgreSQL-drivrutinen för den här övningen som du kan få det senaste från http://npgsql.projects.postgresql.org/. Ladda bara ner det senaste och släpp in i din ASP.NET bin-mapp så är du redo att gå.

Exempelfrågan visar hur man kombinerar ett helt gäng rasterfunktioner tillsammans för att ta tag i alla plattor som skär en viss wgs 84 avgränsningsbox och sedan förenar med ST_Union de korsande plattorna tillsammans och returnerar alla band, transformerar till användarens angivna projektion med ST_Transform och sedan matar ut resultaten som en png med ST_AsPNG.

Detta är samma exempel som Avsnitt 10.4.1, ”PHP-exempel Utdata med ST_AsPNG i kombination med andra rasterfunktioner” men implementerat i C#.

Du anropar hanteraren med http://mywebserver/TestRaster.ashx?srid=2249 för att få rasterbilden i Massachusetts State Plane-fot.

Avsnittet för anslutningssträng i web.config:

Kod
<connectionStrings>
    <add name="DSN"
        connectionString="server=localhost;database=mydb;Port=5432;User Id=myuser;password=mypwd"/>
</connectionStrings>

Kod för TestRaster.ashx:

Kod
<%@ WebHandler Language="C#" Class="TestRaster" %>
using System;
using System.Data;
using System.Web;
using Npgsql;

public class TestRaster : IHttpHandler
{
    public void ProcessRequest(HttpContext context)
    {
        context.Response.ContentType = "image/png";
        context.Response.BinaryWrite(GetResults(context));
    }

    public bool IsReusable {
        get { return false; }
    }

    public byte[] GetResults(HttpContext context)
    {
        byte[] result = null;
        NpgsqlCommand command;
        string sql = null;
        int input_srid = 26986;
        try {
            string connectionString = System.Configuration.ConfigurationManager
                .ConnectionStrings["DSN"].ConnectionString;
            using (NpgsqlConnection conn = new NpgsqlConnection(connectionString)) {
                conn.Open();

                if (context.Request["srid"] != null)
                {
                    input_srid = Convert.ToInt32(context.Request["srid"]);
                }
                sql = @"SELECT ST_AsPNG(
                            ST_Transform(
                                ST_AddBand(
                                    ST_Union(rast, 1),
                                    ARRAY[ST_Union(rast, 2), ST_Union(rast, 3)]
                                ),
                                :input_srid
                            )
                        ) As new_rast
                        FROM aerials.boston
                        WHERE ST_Intersects(
                            rast,
                            ST_Transform(
                                ST_MakeEnvelope(
                                    -71.1217, 42.227,
                                    -71.1210, 42.218,
                                    4326
                                ),
                                26986
                            )
                        )";
                command = new NpgsqlCommand(sql, conn);
                command.Parameters.Add(new NpgsqlParameter("input_srid", input_srid));


                result = (byte[]) command.ExecuteScalar();
                conn.Close();
            }

        }
        catch (Exception ex)
        {
            result = null;
            context.Response.Write(ex.Message.Trim());
        }
        return result;
    }
}

10.4.3. Java-konsolapp som matar ut rasterfråga som bildfil

Detta är en enkel java-konsolapp som tar en fråga som returnerar en bild och matar ut till den angivna filen.

Du kan ladda ner de senaste PostgreSQL JDBC-drivrutinerna från http://jdbc.postgresql.org/download.html

Du kan kompilera följande kod med kommandon som:

Kod
CLASSPATH=".:../postgresql.jar" javac SaveQueryImage.java
jar cfm SaveQueryImage.jar Manifest.txt *.class

Och anropa den från kommandoraden med något som:

Kod
java -jar SaveQueryImage.jar \
  "SELECT ST_AsPNG(ST_AsRaster(ST_Buffer(ST_Point(1, 5), 10, 'quad_segs=2'), 150, 150, '8BUI', 100));" \
  "test.png"

Manifest.txt:

Kod
Class-Path: postgresql-9.0-801.jdbc4.jar
Main-Class: SaveQueryImage

Kod för SaveQueryImage.java:

Kod
import java.sql.Connection;
import java.sql.SQLException;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.io.*;

public class SaveQueryImage {
  public static void main(String[] argv) {
      System.out.println("Checking if Driver is registered with DriverManager.");

      try {
        //java.sql.DriverManager.registerDriver (new org.postgresql.Driver());
        Class.forName("org.postgresql.Driver");
      }
      catch (ClassNotFoundException cnfe) {
        System.out.println("Couldn't find the driver!");
        cnfe.printStackTrace();
        System.exit(1);
      }

      Connection conn = null;

      try {
        conn = DriverManager.getConnection("jdbc:postgresql://localhost:5432/mydb", "myuser", "mypwd");
        conn.setAutoCommit(false);

        PreparedStatement sGetImg = conn.prepareStatement(argv[0]);

        ResultSet rs = sGetImg.executeQuery();

        FileOutputStream fout;
        try
        {
            rs.next();
            /** Output to file name requested by user **/
            fout = new FileOutputStream(new File(argv[1]) );
            fout.write(rs.getBytes(1));
            fout.close();
        }
        catch(Exception e)
        {
            System.out.println("Can't create file");
            e.printStackTrace();
        }

        rs.close();
        sGetImg.close();
        conn.close();
      }
      catch (SQLException se) {
        System.out.println("Couldn't connect: print out a stack trace and exit.");
        se.printStackTrace();
        System.exit(1);
      }
  }
}

10.4.4. Använd PLPython för att dumpa bilder via SQL

Detta är en plpython-lagrad funktion som skapar en fil i serverkatalogen för varje post. Kräver att du har plpython installerat. Bör fungera bra med både plpythonu och plpython3u.

Kod
CREATE OR REPLACE FUNCTION write_file (param_bytes bytea, param_filepath text)
RETURNS text
AS $$
f = open(param_filepath, 'wb+')
f.write(param_bytes)
return param_filepath
$$ LANGUAGE plpythonu;

Skriv ut 5 bilder till PostgreSQL-servern i varierande storlekar. PostgreSQL-demonens konto behöver skrivåtkomst till mappen; detta ekar tillbaka de skapade filnamnen.

Kod
SELECT write_file(
    ST_AsPNG(
        ST_AsRaster(
            ST_Buffer(ST_Point(1, 5), j * 5, 'quad_segs=2'),
            150 * j,
            150 * j,
            '8BUI',
            100
        )
    ),
    'C:/temp/slices' || j || '.png'
)
FROM generate_series(1, 5) AS j;
Utdata
write_file
---------------------
 C:/temp/slices1.png
 C:/temp/slices2.png
 C:/temp/slices3.png
 C:/temp/slices4.png
 C:/temp/slices5.png

10.4.5. Utdata av raster med PSQL

Tyvärr har PSQL ingen lättanvänd inbyggd funktion för att mata ut binärdata. Detta är ett slags hack som bygger på PostgreSQL:s något äldre stöd för stora objekt. För att använda det startar du först kommandoraden psql ansluten till databasen.

Till skillnad från pythonmetoden skapas filen här på din lokala dator.

Kod
SELECT
    oid,
    lowrite(lo_open(oid, 131072), png) AS num_bytes
FROM (VALUES (
    lo_create(0),
    ST_AsPNG((SELECT rast FROM aerials.boston WHERE rid = 1))
)) AS v(oid, png);
Utdata
oid   | num_bytes
---------+-----------
 2630819 |     74860

Notera OID för det stora objektet och exportera det till en fil på den lokala datorn. Ersätt exempelsökvägen med den önskade filsökvägen.

Kod
\lo_export 2630819 'C:/temp/aerial_samp.png'

Detta tar bort filen från lagringen för stora objekt i databasen.

Kod
SELECT lo_unlink(2630819);