code: public Point2D fromLatLngToPoint(LatLong loc) {
  //        System.out.println("GoogleMap.fromLatLngToPoint loc: " + loc);
          Projection proj = getProjection();
          //System.out.println("map.fromLatLngToPoint Projection: " + proj);
          LatLongBounds llb = getBounds();
  //        System.out.println("GoogleMap.fromLatLngToPoint Bounds: " + llb);
  
          GMapPoint topRight = proj.fromLatLngToPoint(llb.getNorthEast());
  //        System.out.println("GoogleMap.fromLatLngToPoint topRight: " + topRight);
          GMapPoint bottomLeft = proj.fromLatLngToPoint(llb.getSouthWest());
  //        System.out.println("GoogleMap.fromLatLngToPoint bottomLeft: " + bottomLeft);
  
          double scale = Math.pow(2, getZoom());
          GMapPoint worldPoint = proj.fromLatLngToPoint(loc);
  //        System.out.println("GoogleMap.fromLatLngToPoint worldPoint: " + worldPoint);
  
          double x = (worldPoint.getX() - bottomLeft.getX()) * scale;
          double y = (worldPoint.getY() - topRight.getY()) * scale;
  
  //        System.out.println("GoogleMap.fromLatLngToPoint x: " + x + " y: " + y);
          return new Point2D(x, y);
      }
docs: Returns the screen point for the provided LatLong. Note: Unexpected
  results can be obtained if this method is called as a result of a zoom
  change, as the zoom event is fired before the bounds are updated, and
  bounds need to be used to obtain the answer!
  <p>
  One workaround is to only operate off bounds_changed events.
  
  @param loc
  @return