= PostGIS WKT Raster Planning and Funding = [[TOC]] This is the development page of [wiki:WKTRaster PostGIS WKT Raster] - a project extending PostGIS engine with raster support. If you need support for raster in [http://www.postgresql.org/ PostgreSQL] or you have to do raster/vector operations, help us develop WKT Raster! [wiki:WKTRaster WKT Raster] developement 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 by the end of 2009! You can contribute with money or developer time. 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 ˜ 5000US$ per month ˜ 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. We expect that developers 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. Tasks are arranged into coherent groups: Similar functions together and dependencies first. == Developers == WKT 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) * [http://foo.keybit.net/~strk/ Sandro Santilli] (SS) == Funding Contributors == Prime financial contributors who established development of the WKT Raster project: * [http://www.cef-cfr.ca/index.php?n=Membres.StevenGCumming Steve Cumming] (SC): 2400 + 4800 + 4800 + 1200 = $13200 USD * [http://blog.lostinspatial.com/ Martin Daly] (MD), ([http://cadcorp.com/ Cadcorp]): $2600 USD and 2 weeks of Development Time (DT) * [http://wiki.mtri.org/display/mtripub/tyler+erickson/ Tyler Erickson] (TE): $1200 USD == 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. * '''done''': The task is finished. == Milestones for Beta 0.1.6 == ||'''Objectives and Tasks'''||'''Coder'''||'''Approx. Schedule'''||'''Time'''||'''Fund (US$)'''||'''Status'''|| ||[[BR]]'''Objective B01a - 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 B01b - 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 B01c - Being able to import TIFF rasters using raster2pgsql.exe''' ||gdal2wktraster.py as a prototype of raster2pgsql.exe based on [http://www.gdal.org/ GDAL]||ML||February 2009||1 week||!DevTime from MD||done ||raster2pgsql.exe[[BR]](tiff only, only one band, option for tiling)||TBD||March 2009||4 weeks||4800||todo ||[[BR]]'''Objective B01d - Being able to get all the properties of a raster (all the "Get" functions).'''|| ||- RT_SRID(raster|geometry) -> integer[[BR]]- RT_GetWidth(raster) -> integer[[BR]]- RT_GetHeight(raster) -> integer[[BR]]- RT_GetXPixelSize(raster) -> float32[[BR]]- RT_GetYPixelSize(raster) -> float32[[BR]]- RT_GetYPixelSize(raster) -> float32[[BR]]- RT_GetXRotation(raster) -> float32[[BR]]- RT_GetYRotation(raster) -> float32[[BR]]- RT_GetXUpperLeft(raster) -> float32[[BR]]- RT_GetYUpperLeft(raster) -> float32[[BR]]- RT_GetGeoReference(raster) -> string[[BR]]- RT_GetNumBands(raster) -> integer[[BR]]- RT_GetBandPixelType(raster, band) -> string[[BR]]- RT_GetBandNoDataValue(raster, band) -> float32||ML||February 2009||1 weeks||!DevTime from MD||done|| ||[[BR]]'''Objective B01e - Being able to intersect vector and raster to produce vector. '''|| ||- RT_GetBBox(raster) -> polygon geometry[[BR]]- RT_Envelope(raster|geometry) -> polygon geometry[[BR]]- RT_Shape(raster) -> polygon geometry[[BR]]- RT_AsPolygon(raster) -> polygon geometry set[[BR]]- RT_Intersects(raster|geometry, raster|geometry)[[BR]]- RT_Intersection(raster|geometry, raster|geometry, ‘raster’|’geometry’)->raster/geometry||PR||April-June 2009||4 weeks||4800 by SC||in-progress|| ||[[BR]]'''Objective B01f - Being able to return a JPEG, a TIFF or a PNG.'''|| ||- RT_Band(raster, band) -> raster[[BR]]- RT_AsJPEG(raster, band, quality) -> JPEG as "bytea"[[BR]]- RT_AsTIFF(raster, band, compression) -> TIFF as "bytea"[[BR]]- RT_AsPNG(raster, band) -> PNG as "bytea"||TBD||April 2009||2 weeks||2400||todo|| == Milestones for Beta 0.2.4 == ||'''Objectives and Tasks'''||'''Coder'''||'''Approx. Schedule'''||'''Time'''||'''Fund (US$)'''||'''Status'''|| ||[[BR]]'''Objective 0.2.4a - Being able to register TIFF and JPEG tiles as raster stored outside the database.'''|| ||Mostly changes to raster2pgsql.exe and RT_RasterFromText().[[BR]]- RT_GetPath() -> string[[BR]]- RT_SetPath(string)||TBD||||2 weeks||2400||todo|| ||[[BR]]'''Objective 0.2.4b - Being able to import JPEG rasters using raster2pgsql.exe.'''|| ||Mostly changes to raster2pgsql.exe||TBD||||1 week||1200||todo|| ||[[BR]]'''Objective 0.2.4c - Being able to intersect vector and raster to produce raster.'''|| ||- RT_AsRaster(geometry, pixelsize) -> raster[[BR]]- Changes to RT_Intersection||TBD||||4 weeks||4800||todo|| ||[[BR]]'''Objective 0.2.4d - Being able to use "group by" to accumulate tiles to form a new raster.'''|| ||- RT_Union(raster|geometry, raster|geometry, ‘raster’|’geometry’) -> raster/geometry[[BR]]- RT_Accum(raster set|geometry set, ‘raster’|’geometry’) -> raster/geometry||TBD||||2 weeks||2400||todo|| == Other Important Milestones == ||'''Objectives and Tasks'''||'''Coder'''||'''Approx. Schedule'''||'''Time'''||'''Fund (US$)'''||'''Status'''|| ||[[BR]]'''B03a - Being able to set all the properties of a raster.'''|| ||- RT_SetSRID(raster|geometry, integer)[[BR]]- RT_SetPixelType(raster, band, string)[[BR]]- RT_SetPixelSize(raster)[[BR]]- RT_SetNoDataValue(raster, band, value)[[BR]]- RT_SetGeoReference(raster, string)||TBD||||1 week||1200||todo|| ||[[BR]]'''B03b - Being able to reproject a raster.'''|| ||- RT_Transform(raster|geometry, SRID) -> same type as input||TBD||||1 week||1200||todo|| ||[[BR]]'''B03c - Being able todo some base raster operations.'''|| ||- RT_Area(raster|geometry) -> double[[BR]]- RT_Count(raster, value) -> integer[[BR]]- RT_Resample(raster, pixelsize, method) -> raster[[BR]]- RT_SelectByValue(raster|geometry, ‘expression’) -> same type as first argument[[BR]]- RT_Reclass(raster|geometry,string) -> same type as first argument[[BR]]- RT_MapAlgebra(raster|geometry, [raster|geometry,...], ‘mathematical expression’, ‘raster’ |’geometry’) -> raster/geometry[[BR]]- RT_Clip(raster|geometry,geometry) -> same type as first argument[[BR]]- RT_Flip(raster|geometry, ’vertical’|’horizontal’) -> same type as first argument||TBD||||6 weeks||7200||todo|| ||[[BR]]'''B04a - Being able to convert a raster to standards formats.'''|| ||- RT_AsKML(raster|geometry) -> string[[BR]]- RT_AsSVG(raster|geometry) -> string||TBD||||2 weeks||2400||todo|| ||[[BR]]'''B04b - Being able to control the validity of a raster.'''|| ||- RT_IsEmpty(raster|geometry) -> boolean[[BR]]- RT_mem_size(raster|geometry) -> integer[[BR]]- RT_isvalid(raster|geometry) -> boolean||TBD||||1 week||1200||todo|| ||[[BR]]'''B04c - Being able to use other major topological operators.'''|| ||- RT_Within(raster|geometry A, raster|geometry B)[[BR]]- RT_Contains(raster|geometry A, raster|geometry B)[[BR]]- RT_Overlaps(raster|geometry, raster|geometry)||TBD||||1 week||1200||todo|| ||[[BR]]'''B05a - Being able to derive a raster layer from vector layer.'''|| ||- RT_Interpolate(points, pixelsize, method) -> raster||TBD||||1 week||1200||todo|| ||[[BR]]'''B05b - Being able todo on rasters most operations available on geometries.'''|| ||- RT_Centroid(raster|geometry) -> point geometry[[BR]]- RT_PointOnSurface(raster|geometry) -> point geometry[[BR]]- RT_Buffer(raster|geometry, double) -> same type as first arg.[[BR]]- RT_ConvexHull(raster|geometry) -> same type as input[[BR]]- RT_Difference(raster|geometry A, raster|geometry B) -> same type as first argument[[BR]]- RT_SymDifference(raster|geometry,raster|geometry,‘raster’|’geometry’) -> raster/geometry||TBD||||4 weeks||4800||todo|| ||[[BR]]'''B06a - Being able to use all the other topological operators.'''|| ||- RT_Equals(raster|geometry, raster|geometry)[[BR]]- RT_Disjoint(raster|geometry, raster|geometry)[[BR]]- RT_Touches(raster|geometry, raster|geometry)[[BR]]- RT_Crosses(raster|geometry, raster|geometry)[[BR]]- RT_Covers(raster|geometry A, raster|geometry B)[[BR]]- RT_IsCoveredBy(raster|geometry A, raster|geometry B)[[BR]]- RT_Relate(raster|geometry, raster|geometry, intersectionPatternMatrix )||TBD||||2 weeks||2400||todo|| ||[[BR]]'''B07b - Being able to edit a raster.'''|| ||- RT_SetValue(raster, band, x, y, value)[[BR]]- RT_Affine(raster|geometry,...) -> same type as input[[BR]]- RT_Translate(raster|geometry,...) -> same type as input[[BR]]- RT_Scale(raster|geometry,...) -> same type as input[[BR]]- RT_TransScale(raster|geometry,...) -> same type as input[[BR]]- RT_RotateZ,Y,Z(raster|geometry, float8) -> same type as input||TBD||||2 weeks||2400||todo|| ||Other functions[[BR]]- RT_AsBinary(raster, compression)[[BR]]- RT_RasterFromWKB(raster, [])[[BR]]- RT_RasterFromText(string, [])[[BR]]- RT_AsText(raster)||TBD||||2 weeks||2400||todo|| ||'''Total'''||||||48 weeks||58800||||