[mapserver-users] is this possible or does this need to be a feature request

Steve Lime steve.lime at dnr.state.mn.us
Tue Feb 19 07:22:10 PST 2002


Couple of things, this type of processing would have to be taken care of
in C, just too slow
to do elsewhere. Building a buffered polygon is not a trivial
excercise. I've been looking for
quite some time now for code to swipe. No luck so far. IF such a
function could be written
then I'd look at implementing it using something like a PROCESS block
within a layer, for 
example

  PROCESS
    REMOVE 5000 # remove islands less than 5000 sq meters
    BUFFER 10 # then create a 10 m buffer
  END

I'd look at this in a similar fashion to how projections work. You read
the data, then do something
to it before actually using it for rendering or query.
    
Queries do support polygons, either those defined on an ad hoc basis
(via a URL or scripting
environment - MAP|IMGSHAPEQUERY) or those defined in another layer
(FEATUREQUERY). These
bother have been around for some time now...

Steve


Stephen Lime
Data & Applications Manager

Minnesota DNR
500 Lafayette Road
St. Paul, MN 55155
651-297-2937

>>> Stephen Woodbridge <woodbri at swoodbridge.com> 02/15/02 01:34PM >>>
Fred,

Steve Lime may want to jump in on this to add or correct this.

I see two issues here:

1) You have to construct and offset polygon (unless you are willing to
accept the rectangular extents of the polygon). This is pretty
straight
forward:
  a) pick the first edge and determine which side is outside of the
     polygon
  b) construct an offset line on the outside of the first segment
  c) construct an offset line for each successive segment and intersect

     it with the previous segment and save the intersection point, you
     also have to check and handle concave angles where the offsets
     eliminate the edges totally.
  d) then build a new poygon form the intersection points.

2) currently (I believe) the query code ONLY works for points and
rectangles. Modifing query code to do queries of arbitrary polygons
would be possible but require some additional computations like:
  a) first check that the extents of the obj and the query polygon
     overlap.
  b) if point, see if it is inside the query polygon
     if line,  see if it intersects the query polygon
     if polygon, polyline, see if extents are all inside or the
extents
        intersect with the query polygon
       if extents intersect see if any edge intersects with the query
          polygon
         if not, see if all vertices are inside the query polygon

You could do all of this in mapscript, but might be very slow if you
have lots of polygons or the polygon have lots of points. Also you
have
to be able to deal with multipart objects. There may be some code
already in mapserver that can be adapted to some parts of this as
rotated label extents represent 5 node convex polygons.

Anyway, I hope this helps,
  -Steve Woodbridge

Fred McDavid wrote:
> 
> What I'm wanting to do is:
> 
> take a polygon from one layer, using that polygon and some function
(in
> this case, one that would add a "buffer" to the original polygon)
come
> up with a new polygon, then draw that polygon and/or use it to query
> layers.
> 
> I'm wondering if there is presently a way to do this and, if not,
what
> obstacles (WRT design issues) would I face if I tried to make
mapserver
> and/or php-mapscript do this?
> 
> Regards,
> 
> Fred



More information about the MapServer-users mailing list