= PostGIS Raster Planning and Funding = {{{ #!div style='background-color: #F4F4F4; padding: 5px; border: 1px solid gray; float: right; margin-left: 5px; width: 260px; font-size: small;' > '''Quick Links''' * [wiki:WKTRaster PostGIS Raster Home Page] * [wiki:WKTRaster/SpecificationWorking02 Working Specifications for PostGIS 2.0] * [wiki:WKTRaster/SpecificationWorking03 Working Specifications for Future Versions] * [wiki:WKTRaster/Documentation01 Documentation] * [wiki:WKTRaster/SpecificationFinal01 Old Final Specifications for Beta 0.1.6] }}} [[TOC]] This is the development page of [wiki:WKTRaster PostGIS Raster] - a project extending PostGIS engine with raster support. '''Need more PostGIS Raster features? -''' If you need support for raster in [http://www.postgresql.org/ PostgreSQL] or you have to do raster/vector operations, help us develop PostGIS Raster! PostGIS Raster development is a work in progress. Each slice of 2000$ will bring new functions in! The approximate cost of the whole project is about 60 000$US. If 30 groups each give 2000$US, we will have the best seamless raster/vector set of SQL functions available! '''Time or Money -''' You can contribute with money or developer time (!DevTime). Contributing give you the opportunity to have a word to say on the development priorities and on the schedule. For financial contribution, the conversion rate between time and money is 1200$ per week = approx. 5000US$ per month = approx. 60 000 US$ per year. Coders have to be experienced C developer with a minimal object oriented database development experience. There are some developers out there willing to offer their services to implement your needs. '''Expectations -''' We expect that contributors will: * Try to follow the schedule or at least arrange it to fit their particular needs as much as possible in accordance with the project roadmap. The project is divided into coherent groups of tasks. We are very flexible on modifying the content of those sections. * Contribute to the specifications in order to agree and to keep track of what's done. Specifications of the intented development should be described in the Specifications page and submited to the postgis-devel mailing list for comments before starting development. Ask [http://www.cef-cfr.ca/index.php?n=Membres.PierreRacine Pierre Racine] to get write access to the specification page. * Contribute to the Documentation as much as they can to make sure we produce a coherent and a professional open source product. '''Advices to developers -''' We can assure degree of quality with obeying basic rules and development cycle process, most of them are easily executable: 1. If you add new C API function, always add test case for it in test/core. 1. If you add new SQL function, always add test case for it in test/regress. 1. Always do full build of PostGIS Raster before commit (with new tests included). 1. Always run all PostGIS Raster unit tests before commit (with new tests included). 1. Do not commit anything if any of the two occurs: a) PostGIS Raster build failed b) PostGIS Raster tests failed. 1. Try to do full rebuild and full tests run of all related components: GEOS + PostGIS + PostGIS Raster. 1. Frequently check if PostGIS Raster build is "green" in the very our :-) Hudson bay http://office.refractions.net:1500/view/WKTRaster/ 1. Don't worry if something got broken after a commit. A broken code is a daily bread and errors are valuable. Just don't let buggy commits to accumulate, but fix as soon as first error is spotted. 1. Adding new test cases are the only time consuming element, but even a very simple test is worth (i.e. test/regress/rt_box2d.sql) '''Objectives & Tasks -''' are arranged into coherent groups: Similar functions together and dependencies first. == Developers having worked or available for future work on the project == PostGIS Raster development team members with officially allocated tasks: * [http://mateusz.loskot.net/ Mateusz Loskot] (ML) at [http://cadcorp.com/ Cadcorp] * [http://www.cef-cfr.ca/index.php?n=Membres.PierreRacine Pierre Racine] (PR) at [http://www.ulaval.com/ University Laval] * [http://foo.keybit.net/~strk/ Sandro Santilli] (SS) * [http://gis4free.wordpress.com Jorge Arévalo] (JA) at [http://www.deimos-space.com/UK/index.asp?lang=UK Deimos Space] * [http://cvec.ucdavis.edu/eait Bborie Park] (BP) at [http://cvec.ucdavis.edu/ the Center for Vectorborne Diseases] Unofficial PostGIS Raster development members with unofficially allocated tasks: * [http://wiki.osgeo.org/wiki/User:Dzwarg David Zwarg] (DZ) at ([http://www.avencia.com/ Avencia, Inc.]) * [http://wiki.osgeo.org/wiki/User:Robe Regina Obe] (RO) at ([http://www.paragoncorporation.com/team.aspx Paragon Corporation]) == Funding Contributors == Prime financial contributors who established development of the PostGIS Raster project: * [http://www.cef-cfr.ca/index.php?n=Membres.StevenGCumming Steve Cumming] (SC), ([http://www.sbf.ulaval.ca/index.php?id=930 University Laval]): All of Pierre Racine's time (about two years up to june 2011). * [http://blog.lostinspatial.com/ Martin Daly] (MD), ([http://cadcorp.com/ Cadcorp]): All of Mateuzs Loskot's time (about six months up to june 2009). * [http://wiki.mtri.org/display/mtripub/tyler+erickson/ Tyler Erickson] (TE), ([http://mtri.org/ Michigan Tech Research Institute]): $1200 USD * [http://www.deimos-space.com/UK/index.asp?lang=UK DEIMOS Space] (DS): All of Jorge Arevalo time (about two year up to june 2011). * [http://cvec.ucdavis.edu/ Center for Vectorborne Diseases] at UC Davis (UC): All of Bborie Park time (about 4 months up to june 2011). == Development Status == Explanation of status markers used in the tables below: * '''todo''': The task has not yet been funded. Everything is to do. * '''funded''': Someone committed some funding or developer time and the task has been assigned to a developper but the task is still to do. * '''in-progress''': The task is being implemented. * '''pending''': The developer is waiting for other development to continue. * '''buggy''': The tast has been implemented but is disfunctional for some reason. * '''partially done''': Some parts of task are done but everything is not finished. * '''done''': The task is finished. == Milestones for PostGIS 2.0 == ||'''Objectives and Tasks'''||'''Coder'''||'''Approx. Schedule'''||'''Time'''||'''Approx. Contribution (US$)'''||'''Status'''|| ||[[BR]]'''Objective 2.0.01 - Being able to get and set the rotation of a raster.''' ([wiki:WKTRaster/SpecificationWorking02 specifications])|||||||||| ||- ST_Rotation(raster)[[BR]]- ST_SetRotation(raster, rotation)||TBD||||2 days||480||todo|| ||[[BR]]'''Objective 2.0.02 - Being able to create a raster as the expression of another raster''' ([wiki:WKTRaster/SpecificationWorking02 specifications])|||||||||| ||- ST_MapAlgebra(raster)||JA||||4 weeks||4800||done|| ||[[BR]]'''Objective 2.0.04 - Implement better handling for NULL, ST_IsEmpty, ST_HasNoBand and ST_BandIsNodata rasters''' ([wiki:WKTRaster/SpecificationWorking02 specifications])|||||||||| ||- ST_IsEmpty(raster)[[BR]]- ST_HasNoBand(raster, band)[[BR]]- ST_BandIsNodata(raster, band)||JA||||2 weeks||2400||partially done|| ||[[BR]]'''Objective 2.0.05 - Being able to set and get values for part of a raster''' ([wiki:WKTRaster/SpecificationWorking02 specifications])|||||||||| ||- ST_SetValues(raster)[[BR]]- ST_Clip(raster)||TBD||||2 weeks||2400||todo|| ||[[BR]]'''Objective 2.0.06 - Being able to add a band to a raster ''' ([wiki:WKTRaster/SpecificationWorking02 specifications])|||||||||| ||- ST_AddBand()||PR & JA||||2 weeks||2400||done|| == Milestones for Future Versions == ||'''Objectives and Tasks'''||'''Coder'''||'''Approx. Schedule'''||'''Time'''||'''Approx. Contribution (US$)'''||'''Status'''|| ||[[BR]]'''Objective FV.01 - Being able to return a JPEG, a TIFF or a PNG ''- Done''''' ([wiki:WKTRaster/SpecificationWorking03 specifications])|||||||||| ||- ST_Band(raster, band) -> raster[[BR]]- ST_Reclass(raster|geometry,string) -> same type as first argument[[BR]]- ST_AsGDALRaster(raster, band int, type text, options text) -> bytea[[BR]]- ST_GDALDrivers() -> set of record[[BR]]- ST_AsJPEG(raster, band, quality) -> JPEG as "bytea"[[BR]]- ST_AsTIFF(raster, band, compression) -> TIFF as "bytea"[[BR]]- ST_AsPNG(raster, band) -> PNG as "bytea"||BP||TBD||2 weeks||2400 / !DevTime from UC||done|| ||[[BR]]'''Objective FV.02 - Being able to intersect vector and raster to produce raster.''' ([wiki:WKTRaster/SpecificationWorking03 specifications])|||||||||| ||- ST_AsRaster(geometry, pixelsize) -> raster[[BR]]- Changes to ST_Intersection||TBD||TBD||4 weeks||4800||todo|| ||[[BR]]'''Objective FV.03 - Implement all the necessary versions of ST_MapAlgebra.''' ([wiki:WKTRaster/SpecificationWorking03 specifications])|||||||||| ||- ST_MapAlgebraExpr()[[BR]]- ST_MapAlgebraFct()[[BR]]- ST_MapAlgebraFctNgb(taking one raster)[[BR]]- ST_MapAlgebraFctNgb(taking one coverage (table))[[BR]]- ST_MapAlgebraExpr(taking two rasters)[[BR]]- ST_MapAlgebraExpr(taking two coverages (tables))[[BR]]- ST_MapAlgebraFct(taking two rasters)[[BR]]- ST_MapAlgebraFct(taking two coverages (tables))||TBD||TBD||8 weeks||9600||todo|| ||[[BR]]'''Objective FV.04 - Being able to use "group by" to accumulate tiles to form a new raster.''' ([wiki:WKTRaster/SpecificationWorking03 specifications])|||||||||| ||- ST_Union(raster|geometry, raster|geometry, ‘raster’|’geometry’) -> raster/geometry[[BR]]- ST_Accum(raster set|geometry set, ‘raster’|’geometry’) -> raster/geometry||TBD||TBD||2 weeks||2400||todo|| ||[[BR]]'''Objective FV.05 - Being able to reproject a raster'' - Done''''' ([wiki:WKTRaster/SpecificationWorking03 specifications])|||||||||| ||- ST_Transform(raster|geometry, SRID) -> same type as input||BP||||1 week||!DevTime from UC||done|| ||[[BR]]'''Objective FV.06 - Being able todo some base raster operations.''' ([wiki:WKTRaster/SpecificationWorking03 specifications])|||||||||| ||- ST_Area(raster|geometry) -> double[[BR]]- ST_ValueCount(raster, value) -> integer'' - done''[[BR]]- ST_ValuePercent(raster, value) -> double precision'' - done''[[BR]]- ST_Resample(raster, pixelsize, method) -> raster[[BR]]- ST_SelectByValue(raster|geometry, ‘expression’) -> same type as first argument[[BR]]- ST_Clip(raster|geometry,geometry) -> same type as first argument[[BR]]- ST_Flip(raster|geometry, ’vertical’|’horizontal’) -> same type as first argument||TBD||||6 weeks||7200||partially done|| ||[[BR]]'''Objective FV.07 - Being able to convert a raster to standards formats.''' ([wiki:WKTRaster/SpecificationWorking03 specifications])|||||||||| ||- ST_AsKML(raster|geometry) -> string[[BR]]- ST_AsSVG(raster|geometry) -> string||TBD||||2 weeks||2400||todo|| ||[[BR]]'''Objective FV.08 - Being able to control the validity of a raster.''' ([wiki:WKTRaster/SpecificationWorking03 specifications])|||||||||| ||- ST_mem_size(raster|geometry) -> integer[[BR]]- ST_isvalid(raster|geometry) -> boolean||TBD||||1 week||1200||todo|| ||[[BR]]'''Objective FV.09 - Being able to use other major topological operators.''' ([wiki:WKTRaster/SpecificationWorking03 specifications])|||||||||| ||- ST_Within(raster|geometry A, raster|geometry B)[[BR]]- ST_Contains(raster|geometry A, raster|geometry B)[[BR]]- ST_Overlaps(raster|geometry, raster|geometry)||TBD||||1 week||1200||todo|| ||[[BR]]'''Objective FV.10 - Being able to derive a raster layer from vector layer.''' ([wiki:WKTRaster/SpecificationWorking03 specifications])|||||||||| ||- ST_Interpolate(points, pixelsize, method) -> raster||TBD||||1 week||1200||todo|| ||[[BR]]'''Objective FV.11 - Being able todo on rasters most operations available on geometries.''' ([wiki:WKTRaster/SpecificationWorking03 specifications])|||||||||| ||- ST_Centroid(raster|geometry) -> point geometry[[BR]]- ST_PointOnSurface(raster|geometry) -> point geometry[[BR]]- ST_Buffer(raster|geometry, double) -> same type as first arg.[[BR]]- ST_Difference(raster|geometry A, raster|geometry B) -> same type as first argument[[BR]]- ST_SymDifference(raster|geometry,raster|geometry,‘raster’|’geometry’) -> raster/geometry||TBD||||4 weeks||4800||todo|| ||[[BR]]'''Objective FV.12 - Being able to use all the other topological operators.''' ([wiki:WKTRaster/SpecificationWorking03 specifications])|||||||||| ||- ST_Equals(raster|geometry, raster|geometry)[[BR]]- ST_Disjoint(raster|geometry, raster|geometry)[[BR]]- ST_Touches(raster|geometry, raster|geometry)[[BR]]- ST_Crosses(raster|geometry, raster|geometry)[[BR]]- ST_Covers(raster|geometry A, raster|geometry B)[[BR]]- ST_IsCoveredBy(raster|geometry A, raster|geometry B)[[BR]]- ST_Relate(raster|geometry, raster|geometry, intersectionPatternMatrix )||TBD||||2 weeks||2400||todo|| ||[[BR]]'''Objective FV.13 - Being able to edit a raster.''' ([wiki:WKTRaster/SpecificationWorking03 specifications])|||||||||| ||- ST_Affine(raster|geometry,...) -> same type as input[[BR]]- ST_Translate(raster|geometry,...) -> same type as input[[BR]]- ST_Scale(raster|geometry,...) -> same type as input[[BR]]- ST_TransScale(raster|geometry,...) -> same type as input[[BR]]- ST_RotateZ,Y,Z(raster|geometry, float8) -> same type as input||TBD||||2 weeks||2400||todo|| ||[[BR]]'''Objective FV.16 - Being able to quickly get raster statistics'' - Done''''' ([wiki:WKTRaster/SpecificationWorking03 specifications])|||||||||| ||- ST_SummaryStats(raster, nband) -> record[[BR]]- ST_ApproxSummaryStats(rast raster, nband int, exclude_nodata_value boolean, sample_percent double precision) -> record[[BR]]- ST_Count(raster, nband) -> bigint[[BR]]- ST_ApproxCount(rast raster, nband int, exclude_nodata_value boolean, sample_percent double precision) -> bigint[[BR]]- ST_Histogram(raster, nband) -> set of records[[BR]]- ST_ApproxHistogram(rast raster, nband int, exclude_nodata_value boolean, sample_percent double precision, bins int, width double precision[], right boolean) -> set of record[[BR]]- ST_Quantile(raster, nband) -> set of records[[BR]]- ST_ApproxQuantile(rast raster, nband int, exclude_nodata_value boolean, sample_percent double precision, quantiles double precision[]) -> set of records||BP||||2 weeks||2400||done|| ||[[BR]]'''Other functions''' |||||||||| ||- ST_AsBinary(raster, compression) ([wiki:WKTRaster/SpecificationWorking03 specifications])|| ML (start ST_AsBinary) || ||2 weeks||2400 / !DevTime from MD||in-progress|| ||- ST_RasterFromWKB(raster, [])|| TBD || TBD || - || - ||todo|| ||- ST_RasterFromText(string, [])|| TBD || TBD || - || - ||todo|| ||- ST_AsText(raster))|| TBD || TBD || - || - ||todo|| ||- ST_SetPath(string)|| TBD || TBD || - || - ||todo|| == GDAL Driver Milestones == ||'''Objectives and Tasks'''||'''Coder'''||'''Approx. Schedule'''||'''Time'''||'''Approx. Contribution (US$)'''||'''Status'''|| ||[[BR]]'''Objective 1 - Being able to read in-db regular blocking WKT Raster with the GDAL driver. ''' ([wiki:WKTRaster/SpecificationWorking01#Objective0.1.6g-BeingabletoreadandwriteWKTRasterwithGDALdriver. specifications])|||||||||| ||- Read a WKT Raster from database (in-db, regular blocking)||JA||July - August 2010||TBD||!DevTime from JA ||done|| ||[[BR]]'''Objective 2 - Being able to read out-db irregular blocking WKT Raster with the GDAL driver. ''' ([wiki:WKTRaster/SpecificationWorking01#Objective0.1.6g-BeingabletoreadandwriteWKTRasterwithGDALdriver. specifications])|||||||||| ||- Read a WKT Raster from database (out-db, irregular blocking)||JA||July - August 2010||TBD||!DevTime from JA ||todo|| ||[[BR]]'''Objective 3 - Being able to write WKT Raster with the GDAL driver. ''' ([wiki:WKTRaster/SpecificationWorking01#Objective0.1.6g-BeingabletoreadandwriteWKTRasterwithGDALdriver. specifications])|||||||||| ||- Create a new WKT Raster in database (in-db/out-db, regular/irregular blocking)||JA||July - August 2010||TBD||!DevTime from JA ||todo|| == Old Milestones for Beta 0.1.6 - All Done == ||'''Objectives and Tasks'''||'''Coder'''||'''Approx. Schedule'''||'''Time'''||'''Approx. Contribution (US$)'''||'''Status'''|| ||[[BR]]'''Objective 0.1.6a - Being able to create tables with RASTER fields'''|||||||||| ||Initial setup: type definition, canonical input/output||SS||January 2009||4 weeks||2400 by SC[[BR]]2600 by MD||done ||[[BR]]'''Objective 0.1.6b - Being able to select RASTER values based on bbox spatial relation'''|||||||||| ||[http://postgis.refractions.net/documentation/manual-1.3/ch06.html#id2747989 Spatial operators with semantic matching postgis ones] ||SS||February 2009||1 week||1200 by TE||done ||GiST indexing support||PR||February 2009||1 week||1200 by SC||done ||[[BR]]'''Objective 0.1.6c - Being able to load raster in the database''' ([wiki:WKTRaster/SpecificationWorking01#Objective0.1.6c-Beingabletoloadrastersinthedatabase specifications])|||||||||| ||gdal2wktraster.py as a prototype of raster2pgsql.exe based on [http://www.gdal.org/ GDAL]||ML||February 2009||1 week||!DevTime from MD||done ||[[BR]]'''Objective 0.1.6d - Being able to get all the properties of a raster (all the "Get" functions).''' ([wiki:WKTRaster/SpecificationWorking01#Objective0.1.6d-BeingabletogetallthepropertiesofarasteralltheGetfunctions. specifications])|||||||||| ||- ST_SRID(raster|geometry) -> integer[[BR]]- ST_Width(raster) -> integer[[BR]]- ST_Height(raster) -> integer[[BR]]- ST_PixelSizeX(raster) -> float32[[BR]]- ST_PixelSizeY(raster) -> float32[[BR]]- ST_RotationX(raster) -> float32[[BR]]- ST_RotationY(raster) -> float32[[BR]]- ST_UpperLeftX(raster) -> float32[[BR]]- ST_UpperLeftY(raster) -> float32[[BR]]- ST_GeoReference(raster) -> string[[BR]]- ST_NumBands(raster) -> integer[[BR]]- ST_BandPixelType(raster, band) -> string[[BR]]- ST_BandNoDataValue(raster, band) -> float32||ML||February 2009||1 weeks||!DevTime from MD||done|| ||[[BR]]'''Objective 0.1.6e - Being able to intersect geometries and rasters to produce geometries . ''' ([wiki:WKTRaster/SpecificationWorking01#Objective0.1.6e-Beingabletointersectvectorandrastertoproducevector. specifications])|||||||||| ||- ST_ConvexHull(raster) -> polygon geometry[[BR]]- ST_Envelope(raster|geometry) -> polygon geometry[[BR]]- ST_Polygon(raster) -> polygon geometry[[BR]]- ST_DumpAsPolygons(raster) -> polygon geometry set[[BR]]- ST_Intersects(raster|geometry, raster|geometry)[[BR]]- ST_Intersection(raster|geometry, raster|geometry)->geometry set||JA & PR||July - August 2010||8 weeks||4800 by SC / !DevTime from JA ||done|| ||[[BR]]'''Objective 0.1.6f - Being able to set all the properties of a raster.''' ([wiki:WKTRaster/SpecificationWorking03 specifications])|||||||||| ||- ST_SetSRID(raster|geometry, integer)[[BR]]- ST_SetPixelSize(raster, pixelsizex, pixelsizey)[[BR]]- ST_SetBandNoDataValue(raster, band, nodatavalue)[[BR]]- ST_SetGeoReference(raster, string)[[BR]]- ST_SetSkew(raster, skewx, skewy)[[BR]]- ST_SetUpperLeft(raster, x, y)||DZ||April 2010||1 week||Devtime from DZ||done|| ||[[BR]]'''Objective 0.1.6g - Being able to register images as raster stored outside the database.''' ([wiki:WKTRaster/SpecificationWorking02#ObjectiveB02a-BeingabletoregisterTIFFandJPEGtilesasrasterstoredoutsidethedatabase. specifications])|||||||||| ||- Mostly changes to gdal2wktraster.py[[BR]]- ST_BandPath() -> string||PR||February 2010||1 weeks||2400||done|| ||[[BR]]'''Objective 0.1.6h - Being able to quickly get metadata for raster and band.'''|||||||||| ||- ST_Metadata(rast)[[BR]]- ST_BandMetadata(rast||PR||June 2010||1 day||!DevTime from SC||done|| ||[[BR]]'''Objective 0.1.6i - Being able to easily convert world coordinates to raster coordinates.'''|||||||||| ||- ST_World2RasterCoordX(rast, xw, yw)[[BR]]- ST_World2RasterCoordY(rast, xw, yw)[[BR]]- ST_Raster2WorldCoordX(rast, xr, yr)[[BR]]- ST_Raster2WorldCoordY(rast, xr, yr)||PR||June 2010||3 day||!DevTime from SC||done|| ||[[BR]]'''Objective 0.1.6j - Being able to set and know if a band nodata value is a true nodata value.'''|||||||||| ||- ST_BandHasNodataValue(rast, band)[[BR]]- ST_SetBandHasNodataValue(rast, band, boolean)||PR||June 2010||1 day||!DevTime from SC||done|| ||[[BR]]'''Objective 0.1.6k - Being able to get and set the value of a pixel.'''|||||||||| ||- ST_Value(rast, band, x, y)[[BR]]- ST_SetValue(rast, band, x, y, val)||PR||July 2010||1 day||!DevTime from SC||done||