Ben,

Finally got around to playing with this today.  I still have some
cleanup to do to get the rest of the code working, but the format that
you suggested works like a charm.

My final design is something like this:

path[poly][ring] = new google.maps.MVCArray([new google.maps.LatLng
()]);

To specify a polygon with one inner ring I use:

poly[0].setPaths(new google.maps.MVCArray([path[0][0], path[0][1]]));


Thanks for all your help with this!

-Jim

On Nov 24, 7:34 pm, Ben Appleton <[email protected]> wrote:
> On Wed, Nov 25, 2009 at 3:32 AM, arclyte <[email protected]> wrote:
> > Thanks for the help, Ben.  I've been moving brackets, commas and
> > parentheses around like mad for an hour or two now but am still having
> > trouble.  I tried your suggestion and got it working, but the trouble
> > comes in when I try to specify a polygon with an inner ring/
> > exclusion.  Let me detail it a bit...
>
> > poly = new google.maps.Polygon({});
>
> > path = new google.maps.MVCArray([new google.maps.LatLng
> > (40.79607046969819, -74.03931065508519),new google.maps.LatLng
> > (40.79594051506491, -73.99828358599339),new google.maps.LatLng
> > (40.77033449116813, -73.99845524737034),new google.maps.LatLng
> > (40.77072450463922, -74.03828068682347)]);
>
> > poly.setPaths(path);
>
> > This code works fine.  It creates a square(ish) polygon over West New
> > York, NJ.  If I try to add another path...
>
> > path = new google.maps.MVCArray([new google.maps.LatLng
> > (40.787492918244446, -74.03089924761449),new google.maps.LatLng
> > (40.78879261847979, -74.007038316218),new google.maps.LatLng
> > (40.77657443199805, -74.00652333208714),new google.maps.LatLng
> > (40.777484374404445, -74.03038426348363)]);
>
> > poly.setPaths(path);
>
> > ... it creates a second, smaller rectangle inside the first.  As
> > expected, they are separate polygons.  What I'd like to do is specify
> > these as a singly polygon with the smaller rectangle as an exclusion
> > of the larger.   Here is what I tried:
>
> > path = new google.maps.MVCArray([new google.maps.LatLng
> > (40.79607046969819, -74.03931065508519),...],[new google.maps.LatLng
> > (40.787492918244446, -74.03089924761449),...]);
>
> > The method works but only adds the first polygon to the map, ignoring
> > the rest of the array.
>
> > path = new google.maps.MVCArray([[new google.maps.LatLng
> > (40.79607046969819, -74.03931065508519),...], [new google.maps.LatLng
> > (40.787492918244446, -74.03089924761449),...]]);
>
> > This method doesn't work and gives the invalid constructor (object)
> > error.
>
> Try:
>
> var outer = new google.maps.MVCArray([new google.maps.LatLng
> (40.79607046969819, -74.03931065508519),...]);
> var inner = new google.maps.MVCArray([new google.maps.LatLng
> (40.787492918244446, -74.03089924761449),...]);
> var paths = new MVCArray([outer, inner]);
> poly.setPaths(paths);
>
> I've also tried manually adding points to the sub-arrays... path[0][1]
>
> > = new LatLng(); but couldn't get that going either.
>
> > I'm hoping this is just my lack of understanding about the MVCArray...
> > Is it possible to properly structure a multidimensional array as input
> > for the MVCArray such that it will produce polygons with inner
> > rings?
>
> > I've looked at the pentagon example (http://gmaps-samples-
> > v3.googlecode.com/svn/trunk/poly/pentagon.html) but that is using a
> > regular multi-dim array, which is basically what I'm doing now.  I'd
> > really like to have it as an MVCArray so I can trigger the updates
> > automatically.
>
> In that demo I've used a feature of setPaths(), which is that it will
> automagically convert JS Arrays to MVCArrays, even converting nested JS
> Arrays to nested MVCArrays.  So rather than creating MVCArrays manually
> above, another possibility would be to feed .setPaths() a multi-dim JS
> Array, then .getPaths() to retrieve the nested MVCArray and edit that.
>
> By the way, note that in Safari and Chrome, inner exclusions have to be
> specified in reverse order compared to the outer boundary.  So if the outer
> boundary is clockwise, the inner boundary has to be counter-clockwise.  This
> is because Safari and Chrome render with Canvas, which does not implement
> the usual even-odd winding rule for polygon rendering, but implements a
> non-zero winding rule instead.
>
> - Jim
>
>
>
> > On Nov 24, 12:58 am, Ben Appleton <[email protected]> wrote:
> > > On Tue, Nov 24, 2009 at 6:05 AM, arclyte <[email protected]> wrote:
> > > > Can anyone (Ben?) provide an example of how I can prepopulate an
> > > > MVCArray?  I think that's my problem.
>
> > > If you write
> > >     new MVCArray([... your points here ...]);
> > > then the MVCArray adopts the given array for its internal storage.  The
> > > .setAt(), .insertAt(), .deleteAt() methods will modify the given array,
> > and
> > > fire change events so the polygon knows to redraw.
>
> > > Ben, the example you provide instantiates an empty array and fill it
>
> > > > on click.  I'm doing that in my script, but it must also pre-load some
> > > > stored polygons.  I'm trying to get away from the way we used to do it
> > > > in v2 with a thousand lines of pushing points.  If I could construct
> > > > the array of points and define it in the constructor that'd be much
> > > > better, to my eyes anyway.  I've tested and can manually push (.setAt)
> > > > points into the path/poly but any time I've tried to pre-define it I
> > > > get the constructor errors I've mentioned. Thanks!
>
> > > > - Jim
>
> > > > On Nov 23, 12:45 pm, arclyte <[email protected]> wrote:
> > > > > I kind of hacked this together based on a prototype, so it's gone
> > > > > through a few different versions.  I had tried to simplify things and
> > > > > ended up changing path from an MVCArray to just an array.  It looks
> > > > > like that's probably my downfall, forcing me to update the polygon in
> > > > > order to see the changes that were made in the path.
>
> > > > > I did that, though, because I've had some trouble getting MVCArray
> > > > > working correctly.  I keep getting errors like this: "Invalid value
> > > > > for constructor parameter 0: [object Object]
> > > >http://maps.gstatic.com/intl/en_us/mapfiles/api-3/22a/main.jsLine
> > > > > 52".  I'm guessing it's just syntax, but I'm not familiar enough with
> > > > > the MVCArray to figure it out in this context.
>
> > > > > Back to fiddling with it I suppose...  Thanks for the response!
>
> > > > > On Nov 22, 7:34 pm, Ben Appleton <[email protected]> wrote:
>
> > > > > > On Sat, Nov 21, 2009 at 5:49 AM, arclyte <[email protected]>
> > wrote:
> > > > > > > I'm guessing that this is a bug in my code somewhere, but I
> > haven't
> > > > > > > been able to figure out where just yet.
>
> > > > > > > Here is the sample for my current code:
> > > > > > >http://arclyte.netdojo.com/geo/polyDraw.php
>
> > > > > > > If you click on the map you'll start placing markers, or you can
> > > > click
> > > > > > > on the color box next to a polygon to load markers for that
> > polygon
> > > > > > > and edit it.
>
> > > > > > > My polygon is defined as an array of polygons, so the new (green)
> > > > > > > polygon is in poly[2].  If you click and add points to the
> > polygon
> > > > you
> > > > > > > can see that the points actually are contained within the object
> > but
> > > > > > > the polygon display is not being updated.
>
> > > > > > > I've found that if I call poly[n].setMaps(map) on the polygon I'm
> > > > > > > editing it will redraw and show the new/edited points.  But that
> > > > means
> > > > > > > redrawing the polygon each time... I'm afraid that won't scale
> > very
> > > > > > > well if we get very large polygons.  It also gives a nice flicker
> > > > > > > every time you draw a point which I'd rather avoid.
>
> > > > > > I see you've tried MVCArray's .insertAt(), which notifies the
> > polygon
> > > > of a
> > > > > > change in its coordinates.  But that code is currently commented
> > out.
> > > >  Did
> > > > > > that not work?
>
> > > > > > For reference, I use MVCArray's .insertAt() in this polygon editing
> > > > demo:
> >http://gmaps-samples-v3.googlecode.com/svn/trunk/poly/poly_edit.html
>
> > > > > > --
>
> > > > > > > You received this message because you are subscribed to the
> > Google
> > > > Groups
> > > > > > > "Google Maps JavaScript API v3" group.
> > > > > > > To post to this group, send email to
> > > > > > > [email protected].
> > > > > > > To unsubscribe from this group, send email to
> > > > > > > [email protected]<google-maps-js-api-v3%[email protected]>
> > <google-maps-js-api-v3%[email protected]<google-maps-js-api-v3%[email protected]>
>
> > > > <google-maps-js-api-v3%[email protected]<google-maps-js-api-v3%[email protected]>
> > <google-maps-js-api-v3%[email protected]<google-maps-js-api-v3%[email protected]>
>
> > > > > > > .
> > > > > > > For more options, visit this group at
> > > > > > >http://groups.google.com/group/google-maps-js-api-v3?hl=.
>
> > > > --
>
> > > > You received this message because you are subscribed to the Google
> > Groups
> > > > "Google Maps JavaScript API v3" group.
> > > > To post to this group, send email to
> > > > [email protected].
> > > > To unsubscribe from this group, send email to
> > > > [email protected]<google-maps-js-api-v3%[email protected]>
> > <google-maps-js-api-v3%[email protected]<google-maps-js-api-v3%[email protected]>
>
> > > > .
> > > > For more options, visit this group at
> > > >http://groups.google.com/group/google-maps-js-api-v3?hl=.
>
> > --
>
> > You received this message because you are subscribed to the Google Groups
> > "Google Maps JavaScript API v3" group.
> > To post to this group, send email to
> > [email protected].
> > To unsubscribe from this group, send email to
> > [email protected]<google-maps-js-api-v3%[email protected]>
> > .
> > For more options, visit this group at
> >http://groups.google.com/group/google-maps-js-api-v3?hl=en.

--

You received this message because you are subscribed to the Google Groups 
"Google Maps JavaScript API v3" group.
To post to this group, send email to [email protected].
To unsubscribe from this group, send email to 
[email protected].
For more options, visit this group at 
http://groups.google.com/group/google-maps-js-api-v3?hl=en.


Reply via email to