public void setup() {
    // (1) Initializing canvas and map tiles
    size(900, 700, OPENGL);
    if (offline) {
      map = new UnfoldingMap(this, 200, 50, 650, 600, new MBTilesMapProvider(mbTilesString));
      earthquakesURL = "2.5_week.atom"; // The same feed, but saved August 7, 2015
    } else {
      map = new UnfoldingMap(this, 200, 50, 650, 600, new Google.GoogleMapProvider());
      // IF YOU WANT TO TEST WITH A LOCAL FILE, uncomment the next line
      // earthquakesURL = "2.5_week.atom";
    }
    MapUtils.createDefaultEventDispatcher(this, map);

    // FOR TESTING: Set earthquakesURL to be one of the testing files by uncommenting
    // one of the lines below.  This will work whether you are online or offline
    // earthquakesURL = "test1.atom";
    // earthquakesURL = "test2.atom";

    // Uncomment this line to take the quiz
    earthquakesURL = "quiz2.atom";

    // (2) Reading in earthquake data and geometric properties
    //     STEP 1: load country features and markers
    List<Feature> countries = GeoJSONReader.loadData(this, countryFile);
    countryMarkers = MapUtils.createSimpleMarkers(countries);

    //     STEP 2: read in city data
    List<Feature> cities = GeoJSONReader.loadData(this, cityFile);
    cityMarkers = new ArrayList<Marker>();
    for (Feature city : cities) {
      cityMarkers.add(new CityMarker(city));
    }

    //     STEP 3: read in earthquake RSS feed
    List<PointFeature> earthquakes = ParseFeed.parseEarthquake(this, earthquakesURL);
    quakeMarkers = new ArrayList<Marker>();

    for (PointFeature feature : earthquakes) {
      // check if LandQuake
      if (isLand(feature)) {
        quakeMarkers.add(new LandQuakeMarker(feature));
      }
      // OceanQuakes
      else {
        quakeMarkers.add(new OceanQuakeMarker(feature));
      }
    }

    // could be used for debugging
    printQuakes();

    // (3) Add markers to map
    //     NOTE: Country markers are not added to the map.  They are used
    //           for their geometric properties
    map.addMarkers(quakeMarkers);
    map.addMarkers(cityMarkers);

    sortAndPrint(20);
  } // End setup
  public void setup() {
    // (1) Initializing canvas and map tiles
    size(900, 700, OPENGL);
    if (offline) {
      map = new UnfoldingMap(this, 200, 50, 650, 600, new MBTilesMapProvider(mbTilesString));
      earthquakesURL = "2.5_week.atom"; // The same feed, but saved August 7, 2015
    } else {
      map = new UnfoldingMap(this, 200, 50, 650, 600, new Google.GoogleMapProvider());
      // IF YOU WANT TO TEST WITH A LOCAL FILE, uncomment the next line
      // earthquakesURL = "2.5_week.atom";
    }
    MapUtils.createDefaultEventDispatcher(this, map);

    // (2) Reading in earthquake data and geometric properties
    //     STEP 1: load country features and markers
    List<Feature> countries = GeoJSONReader.loadData(this, countryFile);
    countryMarkers = MapUtils.createSimpleMarkers(countries);

    //     STEP 2: read in city data
    List<Feature> cities = GeoJSONReader.loadData(this, cityFile);
    cityMarkers = new ArrayList<Marker>();
    for (Feature city : cities) {
      System.out.println(
          city.getProperty("name")
              + ", "
              + city.getProperty("country")
              + " Pop: "
              + city.getProperty("population")
              + "Million");
      cityMarkers.add(new CityMarker(city));
    }

    //     STEP 3: read in earthquake RSS feed
    List<PointFeature> earthquakes = ParseFeed.parseEarthquake(this, earthquakesURL);
    quakeMarkers = new ArrayList<Marker>();

    for (PointFeature feature : earthquakes) {
      // check if LandQuake
      if (isLand(feature)) {
        quakeMarkers.add(new LandQuakeMarker(feature));
      }
      // OceanQuakes
      else {
        quakeMarkers.add(new OceanQuakeMarker(feature));
      }
    }

    // could be used for debugging
    printQuakes();

    // (3) Add markers to map
    //     NOTE: Country markers are not added to the map.  They are used
    //           for their geometric properties
    map.addMarkers(quakeMarkers);
    map.addMarkers(cityMarkers);
  } // End setup
  public void setup() {
    size(950, 600, OPENGL);

    if (offline) {
      map = new UnfoldingMap(this, 200, 50, 700, 500, new MBTilesMapProvider(mbTilesString));
      earthquakesURL = "2.5_week.atom"; // Same feed, saved Aug 7, 2015, for working offline
    } else {
      map = new UnfoldingMap(this, 200, 50, 700, 500, new Google.GoogleMapProvider());
      // IF YOU WANT TO TEST WITH A LOCAL FILE, uncomment the next line
      // earthquakesURL = "2.5_week.atom";
    }

    map.zoomToLevel(2);
    MapUtils.createDefaultEventDispatcher(this, map);

    // The List you will populate with new SimplePointMarkers
    List<Marker> markers = new ArrayList<Marker>();

    // Use provided parser to collect properties for each earthquake
    // PointFeatures have a getLocation method
    List<PointFeature> earthquakes = ParseFeed.parseEarthquake(this, earthquakesURL);

    // These print statements show you (1) all of the relevant properties
    // in the features, and (2) how to get one property and use it
    if (earthquakes.size() > 0) {
      PointFeature f = earthquakes.get(0);
      System.out.println(f.getProperties());
      Object magObj = f.getProperty("magnitude");
      float mag = Float.parseFloat(magObj.toString());
      // PointFeatures also have a getLocation method

      // here we looped through each PointFeature in earthquakes
      for (PointFeature pf : earthquakes) {

        // we created a new simplePointMarker for each earthquake
        SimplePointMarker spm = createMarker(pf);

        // we added that simplepointmarker to the marker list
        markers.add(spm);
      }
    }

    // added the markers to the map
    map.addMarkers(markers);
    // Here is an example of how to use Processing's color method to generate
    // an int that represents the color yellow.
    // int yellow = color(255, 255, 0);

    // Done: Add code here as appropriate
    addKey();
  }