[postgis-devel] [PostGIS] #1215: ST_DelaunayTriangles

PostGIS trac at osgeo.org
Mon Sep 26 13:12:14 PDT 2011


#1215: ST_DelaunayTriangles
---------------------+------------------------------------------------------
 Reporter:  strk     |       Owner:  pramsey       
     Type:  defect   |      Status:  new           
 Priority:  medium   |   Milestone:  PostGIS Future
Component:  postgis  |     Version:  trunk         
 Keywords:           |  
---------------------+------------------------------------------------------

Comment(by woodbri):

 Adding some use cases for discussion that I presented on the list.

 I wrote code years ago in C that would take a cloud of 3D points insert
 them into a Delaunay triangular surface, then slice the surface triangles
 with a plane(s) into intersecting edges and then composite rings from the
 edges. It seems like we are very close to being able to do this in
 PostGIS. I'm not sure if we have the Delaunay triangularization yet.

 I'm thinking of something like:

 {{{
 select b.z, a.* from
   st_buildarea(
     st_collect(
       intersection(
         delaunay_triangles(
           select the_geom from points),
           st_translate(
             st_expand(select extents(the_geom) from points, 0.1),
             0.0, 0.0, b.z
           )
         )
       )
     )
   ) as a,
   (select 1.0 * generate_series(2, 10, 2) as z) as b
  group by b.z;
 }}}

 So I'm thinking of something like this is the use case, where this would
 create contour rings for Z at 2, 4, 6, 8, and 10 based on the triangulated
 surface created from the points. My SQL is probably broken, but it is only
 to present the idea.

 This use case is very broad in its applicability to real world cases.
 Think of the points as XY as in location of a sensor or some other point
 of measurement and the Z as the measurement value. Creating a 3D
 triangulated surface and cutting it with z-planes creates contours of
 equal value results. Create a vertical plane(s) and you are generating
 elevation profiles. and if you have 2d path like a bicycle route, a GPS
 track, etc and extrude that into a vertical panel the intersects the
 surface, you intersection becomes the measurement profile of the path. If
 the surface is elevation, then you have an elevation profile, if the
 measurement was chemical concentrations in a water body and the track is
 fish, then the profile because an exposure profile for the fish.

 So some use cases of this are:

   1. driving distance - compute the costs to the node using Dijkstra and
 the XY is the node location and Z is the cost.
   2. weather air-presure - XY is sensor location Z is the bars, rings are
 isobars
   3. XY location, Z=altitude, height contours one of the more obvious
 cases

 And I think that being able to build a pipeline of functions like I
 offered above would be extremely useful. in all of these use cases.

 While I do not need it specifically at the moment, anyone trying to render
 3D landscapes might want to be able to extract the triangles or might want
 to be able to apply hillshading to the the triangulated surface and create
 a postGIS raster as a result. For the hillshading task I believe they
 would like to get the average normal at the each triangle node, this is
 needed for both Gouraud and Phong shading algorithms, being able to
 extract that might be of interest in the future.

-- 
Ticket URL: <http://trac.osgeo.org/postgis/ticket/1215#comment:1>
PostGIS <http://trac.osgeo.org/postgis/>
The PostGIS Trac is used for bug, enhancement & task tracking, a user and developer wiki, and a view into the subversion code repository of PostGIS project.


More information about the postgis-devel mailing list