@Test
  public void test() throws IOException {
    GeoJSONWriter writer = new GeoJSONWriter();

    Point point = new GeometryFactory().createPoint(new Coordinate(1, 1));
    GeoJSON json = writer.write(point);
    System.out.println(json);

    GeoJSONReader reader = new GeoJSONReader();
    Geometry geometry = reader.read(json);
    System.out.println(geometry);

    LineString lineString =
        new GeometryFactory()
            .createLineString(
                new Coordinate[] {
                  new Coordinate(1, 1),
                  new Coordinate(1, 2),
                  new Coordinate(2, 2),
                  new Coordinate(1, 1)
                });
    json = writer.write(lineString);
    System.out.println(json);

    Polygon polygon = new GeometryFactory().createPolygon(lineString.getCoordinates());
    json = writer.write(polygon);
    System.out.println(json);

    MultiPoint multiPoint = new GeometryFactory().createMultiPoint(lineString.getCoordinates());
    json = writer.write(multiPoint);
    System.out.println(json);

    MultiLineString multiLineString =
        new GeometryFactory().createMultiLineString(new LineString[] {lineString, lineString});
    json = writer.write(multiLineString);
    System.out.println(json);

    MultiPolygon multiPolygon =
        new GeometryFactory().createMultiPolygon(new Polygon[] {polygon, polygon});
    json = writer.write(multiPolygon);
    System.out.println(json);

    geometry = reader.read(json);
    System.out.println(geometry);
  }
  public static void write(
      Network network, LinkOccupancyCalculator linkVols, double factor, String file) {
    Map<Link, Double> volumes = new HashMap<>(network.getLinks().size());
    Map<Link, Double> loads = new HashMap<>(network.getLinks().size());

    double maxVolume = 0;
    double minVolume = Double.MAX_VALUE;

    for (Link link : network.getLinks().values()) {
      String linkId = link.getId().toString();
      if (!(linkId.startsWith(ODCalibrator.VIRTUAL_ID_PREFIX) || linkId.contains(".l"))) {
        double vol = linkVols.getOccupancy(link.getId()) * factor;
        double load = vol / (link.getCapacity() * 24);
        volumes.put(link, vol);
        loads.put(link, load);

        maxVolume = Math.max(maxVolume, vol);
        minVolume = Math.min(minVolume, vol);
      }
    }

    MathTransform transform = null;
    try {
      transform = CRS.findMathTransform(CRSUtils.getCRS(31467), CRSUtils.getCRS(4326));
    } catch (FactoryException e) {
      e.printStackTrace();
    }

    GeoJSONWriter jsonWriter = new GeoJSONWriter();
    List<Feature> features = new ArrayList<>(network.getLinks().size());

    for (Link link : volumes.keySet()) {
      double coord1[] =
          new double[] {link.getFromNode().getCoord().getX(), link.getFromNode().getCoord().getY()};
      double coord2[] =
          new double[] {link.getToNode().getCoord().getX(), link.getToNode().getCoord().getY()};

      try {
        transform.transform(coord1, 0, coord1, 0, 1);
        transform.transform(coord2, 0, coord2, 0, 1);
      } catch (TransformException e) {
        e.printStackTrace();
      }

      double coords[][] = new double[2][2];
      coords[0][0] = coord1[0];
      coords[0][1] = coord1[1];
      coords[1][0] = coord2[0];
      coords[1][1] = coord2[1];

      LineString lineString = new LineString(coords);

      Map<String, Object> properties = new HashMap<>();
      double volume = volumes.get(link);
      double load = loads.get(link);
      properties.put("volume", volume);
      properties.put("load", load);
      properties.put("capacity", link.getCapacity());
      double width = (volume - minVolume) / (maxVolume - minVolume);
      properties.put("width", width);
      Color color = ColorUtils.getRedGreenColor(load);
      properties.put("color", "#" + String.format("%06x", color.getRGB() & 0x00FFFFFF));

      Feature feature = new Feature(lineString, properties);
      features.add(feature);
    }

    try {
      FeatureCollection fCollection = jsonWriter.write(features);
      BufferedWriter writer = new BufferedWriter(new FileWriter(file));
      writer.write(fCollection.toString());
      writer.close();
    } catch (IOException e) {
      e.printStackTrace();
    }
  }