If line goes from A to B and point is P, v = (Ay-By)*Px+(Bx-Ax)*Py+(Ax*By-Bx*Ay) v>0: "Left" v<0: "Right" v=0: "On the line" (or in front of B / behind A)
Example: select sites_gid, roads_gid, case when ( st_y(st_startpoint(sline)) - st_y(st_endpoint(sline)) ) * st_x(cpoint) + ( st_x(st_endpoint(sline)) - st_x(st_startpoint(sline)) ) * st_y(cpoint) + ( st_x(st_startpoint(sline)) * st_y(st_endpoint(sline)) - st_x(st_endpoint(sline)) * st_y(st_startpoint(sline)) ) > 0 then 'L' when ( st_y(st_startpoint(sline)) - st_y(st_endpoint(sline)) ) * st_x(cpoint) + ( st_x(st_endpoint(sline)) - st_x(st_startpoint(sline)) ) * st_y(cpoint) + ( st_x(st_startpoint(sline)) * st_y(st_endpoint(sline)) - st_x(st_endpoint(sline)) * st_y(st_startpoint(sline)) ) < 0 then 'R' when ( st_y(st_startpoint(sline)) - st_y(st_endpoint(sline)) ) * st_x(cpoint) + ( st_x(st_endpoint(sline)) - st_x(st_startpoint(sline)) ) * st_y(cpoint) + ( st_x(st_startpoint(sline)) * st_y(st_endpoint(sline)) - st_x(st_endpoint(sline)) * st_y(st_startpoint(sline)) ) = 0 then null end as side from ... Eric Randall, GIS DB Admin/Analyst County of Erie, Pa 140 West 6th Street Room 111 Erie, Pa 16501 Ph. 814-451-6063 Fx. 814-451-7000 L'unica via d'uscita รจ dentro --Alice -----Original Message----- From: [email protected] [mailto:[email protected]] On Behalf Of Andreas Neumann Sent: Tuesday, July 23, 2013 11:03 AM To: Denis Rouzaud Cc: PostGIS Users Discussion Subject: Re: [postgis-users] Left of/Right of test Hi Denis, Thank you for your reply. Actually I really want to test a LINESTRING against POLYGON centroids (determined with ST_PointOnSurface), not just a line against a point. Is this question not answerable? As a human I can determine it. I am aware about the edge cases where a point is on the line, but in my case this can't happen as the data comes from a correctly defined polygon mosaic. >From the lines of a polygon mosaic (directed lines node to node, no double >lines) I want to label what is left and what is right of a polygon border. My >theme is usage zones and I should label what is left and right of the polygon >border. Andreas Am 23.07.2013 16:48, schrieb Denis Rouzaud: > Oops, here is the complete code: > > pointGeom << ST_Intersection( ST_MakeLine( > ST_MakePoint(ST_XMin(lineGeom), ST_Y(pointGeom)), > ST_MakePoint(ST_XMax(lineGeom), ST_Y(pointGeom)) > ), lineGeom > ) > > > > On 07/23/2013 04:31 PM, Denis Rouzaud wrote: >> Hi Andreas, >> >> Do you mean you want to test to a segment? >> >> Because, I can't see a true answer for a line. >> >> If you want to do test to a segment, it should do the job to test if >> the intersection with the horizontal line (dy=0) over your point and >> your input line is on the left/right to your point. >> >> So, maybe test: >> >> pointGeom << ST_Intersection( ST_MakeLine( >> ST_MakePoint(ST_XMin(lineGeom), ST_Y(pointGeom)), >> ST_MakePoint(ST_XMax(lineGeom), ST_Y(pointGeom)) >> ) >> >> You have to handle the case where your segment is horizontal, but >> then a simple test with ST_Xmin/max should be enough. >> >> Cheers, >> >> Denis >> >> On 07/23/2013 03:54 PM, Andreas Neumann wrote: >>> Hi, >>> >>> I want to test a point if it is left-of or right-of a given LINESTRING. >>> I found the << >> and &< &> but they do not behave like I expected. >>> >>> Perhaps it is because they only test on the bounding box level and >>> not on the real geometry? >>> >>> Is there a left/right of test available on the geometry instead of >>> the bounding box? >>> >>> Thank you, >>> Andreas >>> _______________________________________________ >>> postgis-users mailing list >>> [email protected] >>> http://lists.osgeo.org/cgi-bin/mailman/listinfo/postgis-users >> > _______________________________________________ postgis-users mailing list [email protected] http://lists.osgeo.org/cgi-bin/mailman/listinfo/postgis-users _______________________________________________ postgis-users mailing list [email protected] http://lists.osgeo.org/cgi-bin/mailman/listinfo/postgis-users
