Thats a good point actually, he sent me the mail directly so i thought i'd
put the code up to the group. I haven't really gotten into v3 yet, so dont
even know the syntax for donut holes.

2010/7/7 Nianwei Liu <[email protected]>

> bjorn,
> v3 polygon now supports multiple rings(donut holes etc). the code
> ported straight from v2 needs adjustment.
>
> On Jul 7, 3:36 am, Björn Brala <[email protected]> wrote:
> > Cool, the updated code for v2 by Ucha :)
> >
> > Here goes updated code for V3
> >
> > functional - type
> > you can also implement it via prototype...
> >
> >  var Contains = function(obj, point) {
> >     var j=0;
> >    var oddNodes = false;
> >    var x = point.lng();
> >    var y = point.lat();
> >     for (var i=0; i < obj.getPath().getLength(); i++) {
> >      j++;
> >      if (j == obj.getPath().getLength()) {j = 0;}
> >      if (((obj.getPath().getAt(i).lat(
> > ) < y) &&
> > (obj.getPath().getAt(j).lat() >= y))
> >      || ((obj.getPath().getAt(j).lat() < y) &&
> > (obj.getPath().getAt(i).lat() >= y))) {
> >        if ( obj.getPath().getAt(i).lng() + (y -
> > obj.getPath().getAt(i).lat())
> >        /  (obj.getPath().getAt(j).lat()-obj.getPath().getAt(i).lat())
> >        *  (obj.getPath().getAt(j).lng() -
> > obj.getPath().getAt(i).lng())<x ) {
> >          oddNodes = !oddNodes;
> >        }
> >      }
> >    }
> >    return oddNodes;
> >  };
> >
> > Best
> >
> > 2010/4/23 Björn Brala <[email protected]>
> >
> >
> >
> >
> >
> > > You can speeden up the process a lot if you need to do large
> comparisions.
> > > I keep an array of bounds and only do Contains on polygons from which
> the
> > > bounds are inside. You can also just put that in the method itself
> >
> > > v2 syntax:
> >
> > > /**
> > > *   @desc Check if polygon contains point.
> >
> > > *   @return boolean
> > > **/
> > > GPolygon.prototype.Contains = function(point) {
> > >     if(!this.getBounds().contains(point)){
> > >         return false;
> >
> > >     }
> >
> > >     var j=0;
> > >     var oddNodes = false;
> > >     var x = point.lng();
> > >     var y = point.lat();
> > >     for (var i=0; i < this.getVertexCount(); i++) {
> > >       j++;
> > >       if (j == this.getVertexCount()) {j = 0;}
> > >       if (((this.getVertex(i).lat() < y) && (this.getVertex(j).lat() >=
> y))
> > >       || ((this.getVertex(j).lat() < y) && (this.getVertex(i).lat() >=
> y)))
> > > {
> > >         if ( this.getVertex(i).lng() + (y - this.getVertex(i).lat())
> > >         /  (this.getVertex(j).lat()-this.
> > > getVertex(i).lat())
> > >         *  (this.getVertex(j).lng() - this.getVertex(i).lng())<x ) {
> > >           oddNodes = !oddNodes;
> > >         }
> > >       }
> > >     }
> > >     return oddNodes;
> > > };
> >
> > > Comparing to bounds is a maximum of eh, maybe 4 operations so a LOT
> faster,
> > > this would make it a lot faster.
> >
> > > 2010/4/23 Martin Revert <[email protected]>
> >
> > > There's an issue reported about this, but it is in Need More Info
> > >> status since february 2010.
> > >> It would be nice to have a Polygon.isLatLngInside
> > >> Circle.isLatLngInside and Rectangle.isLatLngInside methods in the API
> > >> from scratch.
> >
> > >> For circles I guess that is more easy and less CPU consuming to
> > >> estimate the difference between the total distance of the center and
> > >> the point (using  Havershine's formula) and the total radius. For
> > >> irregular polygons, I think Björn's suggestion is the way to go but if
> > >> need use that for many polygons yo could expect severe time delays
> > >> when that prototype is invoked.
> >
> > >> On 21 abr, 11:23, Björn Brala <[email protected]> wrote:
> > >> > The group will prabably make the code unreadable. Here's a link:
> >
> > >> >http://www.geostart.nl/GPolygon.contains.js
> >
> > >> > 2010/4/21 Björn Brala <[email protected]>
> >
> > >> > > You should sjust the Contains function to v3.
> >
> > >> > > The things you need to change is getVertextCount() to
> > >> (getPath().length im
> > >> > > guessing)
> >
> > >> > > And perhaps some of the other methods, but the base should be the
> > >> same.
> >
> > >> > > /**
> > >> > > *   @desc Check if polygon contains point.
> > >> > > *   @return boolean
> > >> > > **/
> > >> > > GPolygon.prototype.Contains = function(point) {
> > >> > >     var j=0;
> > >> > >     var oddNodes = false;
> > >> > >     var x = point.lng();
> > >> > >     var y = point.lat();
> > >> > >     for (var i=0; i < this.getVertexCount(); i++) {
> > >> > >       j++;
> > >> > >       if (j == this.getVertexCount()) {j = 0;}
> > >> > >       if (((this.getVertex(i).lat() < y) &&
> (this.getVertex(j).lat()
> > >> >= y))
> > >> > >       || ((this.getVertex(j).lat() < y) &&
> (this.getVertex(i).lat() >=
> > >> y)))
> > >> > > {
> > >> > >         if ( this.getVertex(i).lng() + (y -
> this.getVertex(i).lat())
> > >> > >         /  (this.getVertex(j).lat()-this.getVertex(i).lat())
> > >> > >         *  (this.getVertex(j).lng() - this.getVertex(i).lng())<x )
> {
> > >> > >           oddNodes = !oddNodes;
> > >> > >         }
> > >> > >       }
> > >> > >     }
> > >> > >     return oddNodes;
> > >> > > };
> >
> > >> > > 2010/4/21 Charles <[email protected]>
> >
> > >> > > Hi, I want to know if it's possible in v3 to know if a polygon
> > >> > >> contains a certain coordinate.
> >
> > >> > >> I have polygons representing the districts of a city and users
> enter
> > >> > >> their address (which I reverse geocode to get the latlng of where
> > >> they
> > >> > >> live) to know in which district they are.  I have no problem with
> > >> > >> drawing polygons or getting the coordinates, the only thing
> missing
> > >> is
> > >> > >> getting to know of the coordinate is in a certain polygon.
> >
> > >> > >> I know that in v2 there was a GPolygon.contains method but it
> seems
> > >> it
> > >> > >> is not in v3. I've searched a lot today and all I found were
> > >> tutorials
> > >> > >> for binding clicks... this is not what I want.
> >
> > >> > >> Thanks
> >
> > >> > >> --
> > >> > >> 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%2B
> [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=en.
> >
> > >> > > --
> > >> > > Bjorn Brala
> > >> > > ----------------
> > >> > >www.GeoStart.nl/english/-Google maps - Swis Webdesign
> > >> > >www.twitter.com/bbrala
> >
> > >> > --
> > >> > Bjorn Brala
> > >> > ----------------www.GeoStart.nl/english/-Google maps - Swis
> > >> Webdesignwww.twitter.com/bbrala
> >
> > >> > --
> > >> > 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%2B
> [email protected]>
> > >> .
> > >> > For more options, visit this group athttp://
> > >> 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]<google-maps-js-api-v3%[email protected]><google-maps-js-api-v3%2B
> [email protected]>
> > >> .
> > >> For more options, visit this group at
> > >>http://groups.google.com/group/google-maps-js-api-v3?hl=en.
> >
> > > --
> > > Bjorn Brala
> > > ----------------
> > >www.GeoStart.nl/english/- Google maps - Swis Webdesign
> > >www.twitter.com/bbrala
> >
> > --
> > Bjorn Brala
> > ----------------www.GeoStart.nl/english/- Google maps - Swis
> Webdesignwww.twitter.com/bbrala
>
> --
> 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.
>
>


-- 
Bjorn Brala
----------------
www.GeoStart.nl/english/ - Google maps - Swis Webdesign
www.twitter.com/bbrala

-- 
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