private static void drawEventsHod(SvgFile svg, List<UserData> users, Map<Integer, Zone> zones) {
   float strokeWidth = 0.5f;
   int ci = 0;
   for (UserData user : users) {
     for (Event e : user.getEvents()) {
       //				e.get
       Float hod = e.getHourOfDay();
       if (hod == null) continue;
       String stroke = getColour(scaleHod(hod));
       if (e.getGpsTagId() != 0) {
         Zone z = zones.get(e.getGpsTagId());
         if (z != null) {
           String fill = getZoneFill(z);
           float rx = (float) ((Math.random() - 0.5) * JITTER);
           float ry = (float) ((Math.random() - 0.5) * JITTER);
           float size = scaleD(z.getRadius());
           if (size < 1) size = 1;
           svg.circle(
               rx + scaleX(Mercator.mercX(z.getLon())),
               ry + scaleY(Mercator.mercY(z.getLat())),
               size,
               stroke,
               1.0f,
               fill,
               "fill-opacity=\"0.1\"");
         }
       }
     }
   }
 }
 /** colour by hour of day */
 private static void drawPositionsHod(SvgFile svg, List<UserData> users, boolean showPoints) {
   float strokeWidth = 0.5f;
   for (UserData user : users) {
     Position lp = null;
     Position lastGoodp = null;
     for (Position p : user.getPositions()) {
       String stroke = getColour(scaleHod(p.getHourOfDay()));
       if (lp != null && !lp.isTruncated() && !p.isTruncated()) {
         svg.line(
             scaleX(lp.getX()),
             scaleY(lp.getY()),
             scaleX(p.getX()),
             scaleY(p.getY()),
             stroke,
             strokeWidth);
       } else if (lastGoodp != null && !p.isTruncated()) {
         svg.line(
             scaleX(lastGoodp.getX()),
             scaleY(lastGoodp.getY()),
             scaleX(p.getX()),
             scaleY(p.getY()),
             stroke,
             strokeWidth,
             "stroke-dasharray=\"" + MAG * 3 + " " + MAG * 3 + "\"");
         lastGoodp = null;
       }
       lp = p;
       if (!p.isTruncated()) lastGoodp = p;
       if (showPoints) svg.circle(scaleX(p.getX()), scaleY(p.getY()), 3, stroke, 0.4f, null);
     }
   }
 }
 private static void drawEvents(
     SvgFile svg, List<UserData> users, String overrideStroke, Map<Integer, Zone> zones) {
   float strokeWidth = 0.5f;
   int ci = 0;
   for (UserData user : users) {
     ci = ci + 1 % colors.length;
     String stroke = overrideStroke != null ? overrideStroke : colors[ci];
     for (Event e : user.getEvents()) {
       //				e.get
       if (e.getGpsTagId() != 0) {
         Zone z = zones.get(e.getGpsTagId());
         if (z != null) {
           String fill = getZoneFill(z);
           float rx = (float) ((Math.random() - 0.5) * JITTER);
           float ry = (float) ((Math.random() - 0.5) * JITTER);
           svg.circle(
               rx + scaleX(Mercator.mercX(z.getLon())),
               ry + scaleY(Mercator.mercY(z.getLat())),
               scaleD(z.getRadius()),
               stroke,
               1.0f,
               fill,
               "fill-opacity=\"0.1\"");
         }
       }
     }
   }
 }
 private static void drawPositions(
     SvgFile svg, UserData user, String stroke, float strokeWidth, boolean showPoints) {
   Position lp = null;
   Position lastGoodp = null;
   for (Position p : user.getPositions()) {
     if (lp != null && !lp.isTruncated() && !p.isTruncated()) {
       svg.line(
           scaleX(lp.getX()),
           scaleY(lp.getY()),
           scaleX(p.getX()),
           scaleY(p.getY()),
           stroke,
           strokeWidth);
     } else if (lastGoodp != null && !p.isTruncated()) {
       svg.line(
           scaleX(lastGoodp.getX()),
           scaleY(lastGoodp.getY()),
           scaleX(p.getX()),
           scaleY(p.getY()),
           stroke,
           strokeWidth,
           "stroke-dasharray=\"" + MAG * 3 + " " + MAG * 3 + "\"");
       lastGoodp = null;
     }
     lp = p;
     if (!p.isTruncated()) lastGoodp = p;
     if (showPoints) svg.circle(scaleX(p.getX()), scaleY(p.getY()), 3, stroke, 0.4f, null);
   }
 }
 private static void drawZones2(SvgFile svg, Map<Integer, Zone> zones) {
   for (Zone z : zones.values()) {
     String fill = getZoneFill(z);
     float size = scaleD(z.getRadius());
     if (size < 1) size = 1;
     svg.circle(
         scaleX(Mercator.mercX(z.getLon())),
         scaleY(Mercator.mercY(z.getLat())),
         size,
         fill,
         0.0f,
         fill,
         " fill-opacity=\"15%\" stroke-opacity=\"20%\"");
   }
 }