/**
   * Split the graph by splitting an Edge at a point into 2 Edges
   *
   * @param c coordinates at which to split the graph
   * @param iSplit split index (the i-th split point, used to create the new edge IDs)
   */
  public void splitGraphAtPoint(Coordinate c, int iSplit) {
    Edge nearestEdge = null;
    float nearestDist = kNearestEdgeDistance;
    while (nearestEdge == null && nearestDist / kNearestEdgeDistance < 20.) {
      nearestEdge = findNearestEdge(c, nearestDist);
      if (nearestEdge == null) {
        nearestDist *= 2.;
        logger.info("Increasing kNearestEdgeDistance: " + nearestDist);
      }
    }
    // get the projected point on the nearest edge

    PointPairDistance ppd = new PointPairDistance();
    @SuppressWarnings("rawtypes")
    LineString nearestLineString = (LineString) ((HashMap) nearestEdge.getData()).get("geom");
    EuclideanDistanceToPoint.computeDistance(nearestLineString, c, ppd);

    Coordinate resultcoord = null;

    for (Coordinate cc : ppd.getCoordinates()) {
      // System.out.println(cc);
      if (cc.equals(c) == false) {
        resultcoord = cc;
      }
    }

    // let us loop through the vertices

    Coordinate[] nearestLineStringCoordinates = nearestLineString.getCoordinates();

    ArrayList<Coordinate> fromVertices = new ArrayList<Coordinate>();
    ArrayList<Coordinate> toVertices = new ArrayList<Coordinate>();
    fromVertices.add(nearestLineStringCoordinates[0]);
    boolean isAfter = false;

    for (int i = 1; i < nearestLineStringCoordinates.length; i++) {
      Coordinate pt0 = nearestLineStringCoordinates[i - 1];
      Coordinate pt1 = nearestLineStringCoordinates[i];

      // let us build a segment between 2 nodes

      Coordinate[] segmentCoords = {pt0, pt1};
      LineString segment = fact.createLineString(segmentCoords);

      // let us check whether the projected point (resultcoord) is on the node

      if (fact.createPoint(resultcoord).distance(segment) < SPLITSNAPDISTANCE) {
        // point within, let us split
        fromVertices.add(resultcoord);
        toVertices.add(resultcoord);
        isAfter = true;
      } else {
        if (!isAfter) {
          fromVertices.add(nearestLineStringCoordinates[i]);
        } else {
          toVertices.add(nearestLineStringCoordinates[i]);
        }
      }
    }
    // if (nearestLineStringCoordinates.length==2) {
    toVertices.add(nearestLineStringCoordinates[nearestLineStringCoordinates.length - 1]);
    // }

    // TODO: generate nice edge ids here
    int id1 = -2 * iSplit - 1;
    int id2 = -2 * iSplit - 2;
    // replace straight lines with lines including vertices
    Coordinate[] fromArray = new Coordinate[fromVertices.size()];
    Coordinate[] toArray = new Coordinate[toVertices.size()];

    fromVertices.toArray(fromArray);
    toVertices.toArray(toArray);

    addLineString(fact.createLineString(fromArray), id1);
    addLineString(fact.createLineString(toArray), id2);

    this.removeEdge(nearestEdge);

    System.out.println("Graph split @ " + resultcoord);
  }