[postgis-users] 3d buffer
Sufficool, Stanley
ssufficool at rov.sbcounty.gov
Fri Aug 15 09:36:37 PDT 2008
Correction:
/* Buffer the point */
px := px + (dx * buffer);
py := py + (dy * buffer);
pz := pz + (dz * buffer);
retWKT := retWKT || ' ( ' || px::text || ' ' || py::text || ' '
|| pz::text || ' )';
-----Original Message-----
From: postgis-users-bounces at postgis.refractions.net
[mailto:postgis-users-bounces at postgis.refractions.net] On Behalf Of
Sufficool, Stanley
Sent: Friday, August 15, 2008 8:34 AM
To: PostGIS Users Discussion
Subject: RE: [postgis-users] 3d buffer
Step 1: Get center of cube by averaging all points (x,y,z) on
the cube
Step 2: Get the delta of each points (x,y,z) from the center
point and divide by distance from the center and then add/subtract that
delta from the points (x,y,z) multiplied by the buffer number
This would expand the CUBE from the center by the given amount.
Someone correct this if needed since I have absolutely no
practical application or data to drive this code.
VERY PSEUDO CODE (since there is no cube geometry type?):
CREATE FUNCTION st_buffercube(theCube geometry, buffer double
precision)
returns geometry AS $BODY$
declare i int;
/* Centroid of cube */
declare cx double precision;
declare cy double precision;
declare cz double precision;
/* Cube point */
declare px double precision;
declare py double precision;
declare pz double precision;
/* Cube point delta */
declare segLength double precision;
declare dx double precision;
declare dy double precision;
declare dz double precision;
/* Output ?CUBE? */
declare retWKT character varying(4096);
BEGIN
cx := 0;
cy := 0;
cz := 0;
for i IN 1..st_npoints(theCube) LOOP
cx := cx + st_x(pointn(theCube,i));
cy := cy + st_y(pointn(theCube,i));
cz := cz + st_z(pointn(theCube,i));
END LOOP;
/* Compute centroid of cube */
cx := cx / st_npoints(theCube);
cy := cy / st_npoints(theCube);
cz := cz / st_npoints(theCube);
/* WHAT WOULD THE APPROPRIATE STORAGE TYPE FOR THIS BE ???
*/
retWKT := 'POLYGON( ';
for i in 1..st_npoints(theCube) loop
px := st_x(pointn(theCube,i));
py := st_y(pointn(theCube,i));
pz := st_z(pointn(theCube,i));
dx := st_x(pointn(theCube,i)) - cx;
dy := st_y(pointn(theCube,i)) - cy;
dz := st_z(pointn(theCube,i)) - cz;
/* Divide by distance from center point */
segLength := sqrt( (cx -px) ^ 2 + (cy - py) ^ 2 + (cz -
pz) ^ 2);
dx := dx / segLength;
dy := dy / segLength;
dz := dz /segLength;
/* Buffer the point */
px := px + dx;
py := py + dy;
pz := pz + dz;
retWKT := ' ( ' || px::text || ' ' || py::text || ' ' ||
pz::text || ' )';
end loop;
retWKT := ' )';
return setsrid(retWKT::geometry, st_srid(theCube));
END;
$BODY$
LANGUAGE 'plpgsql'
-----Original Message-----
From: postgis-users-bounces at postgis.refractions.net
[mailto:postgis-users-bounces at postgis.refractions.net] On Behalf Of
eehab hamzeh
Sent: Friday, August 15, 2008 1:51 AM
To: postgis-users at postgis.refractions.net
Subject: [postgis-users] 3d buffer
What i mean by 3d buffer are i have a room which is like
a box and i need to find all the areas that this room Box that will
intersect if the room are extended and get larger....
buffer FROM (SELECT gid,buffer(r.the_geom,10) as buffer
FROM room r WHERE r.roomname='guest room') AS foo USING UNIQUE gid USING
SRID=31467"
i need such query to take the 3d dimension in
consideration and make it not just only in 2d
Thanks
ihab
________________________________
Get news, entertainment and everything you care about at
Live.com. Check it out! <http://www.live.com/getstarted.aspx>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.osgeo.org/pipermail/postgis-users/attachments/20080815/ce9b4845/attachment.html>
More information about the postgis-users
mailing list