[FreeGeoCZ] PlPython + Postgis
Martin Chodúr <[email protected]>
| Newsgroups | gmane.comp.gis.grass.cz |
|---|---|
| Message-ID | <[email protected]> |
Zdravím, narazil jsem na takový problém. Co se snažím udělat je vytvořit
funkci v PLPythonu, která by načetla rastr z databáze, převedla ho do pole
hodnot pro clustering, převedla nově vygenerovaný rastr na polygony a
vrátila je jako tabulku geometrií.
Načtení dat z databáze (přestože ne zrovna ideálním způsobem) se mi podařilo
i jejich clusterování, pro převod na polygony jsem chtěl ale využít ST_
Polygon, k tomu ale potřebuji převést výslednou matici zpět na raster a
ještě jí nastavit spatial data jako srs bbox atd.
Tady sem bohužel narazil. Gdal nemá podle všeho zatím funkční driver pro
výstup do postgis (možná se pletu) a nevím jak tenhle zádrhel obejít zatím.
Uložení do souboru je z důvodu že imread() nebere vstup string. jeto jen
provizorní řešení.
Pokud by někdo uměl poradit, nebo měl lepší nápad jak to řešit, budu vděčný.
Podpora práce s rastrem v PostGISu není zatím tak převratná a google neumí
poradit už.
Předem díky za jakoukoli odpověď
Martin Chodúr
pro ukázku dosavadní stav funkce:
CREATE OR REPLACE FUNCTION cluster (raster text)
RETURNS table(geom geometry)
AS $$
from sklearn.cluster import AffinityPropagation
import matplotlib.pyplot as plt
from scipy import misc
from osgeo import gdal
import os
out = plpy.execute("select st_aspng(rast) png from "+raster, 1)
f = open('/foo/bin/temp.png','wb')
f.write(out[0]['png'])
f.close()
im = misc.imread('/foo/bin/temp.png')
im_reshaped = im.reshape((len(im) * len(im[0]), 3))
af = AffinityPropagation(damping=0.5, convergence_iter=2).fit(im_reshaped)
labels_reshaped = af.labels_.reshape(len(im), len(im[0]))
##### dál už to nefunguje a je to jen představa jak by to mohlo jít
misc.imsave('/home/fus/out/temp_clustered.png',labels_reshaped)
plpy.info(os.system('raster2pgsql /home/fus/out/temp_clustered.png
clustering.out | psql -d testovaci -q '))
out = plpy.execute("select st_polygon(rast) geom from clustering.out limit
1")
return out
$$ LANGUAGE plpythonu;
_______________________________________________
FreeGeoCZ mailing list
[email protected]
http://mailman.fsv.cvut.cz/mailman/listinfo/freegeocz