public void addOSMEdgeToSpatialIndex(OSMEdge osmEdge) {
    // System.out.println("added edge with ID " + osmEdge.getId());
    // counter__edge.put(osmEdge.getId(), osmEdge.getGeometry());	// store edges in the hash map

    Geometry env = osmEdge.getGeometry().getBoundary();
    //  (minx, miny), (maxx, miny), (maxx, maxy), (minx, maxy), (minx, miny).

    if (env.getNumGeometries() > 0) {
      Point p1 = (Point) env.getGeometryN(0);
      Point p2 = (Point) env.getGeometryN(1);

      si.add(
          new Rectangle((float) p1.getX(), (float) p1.getY(), (float) p2.getX(), (float) p2.getY()),
          osmEdge.getId());
    }
  }
  /**
   * Create a new graph, with linestrings read from the database (optionally using only a buffer
   * around a given track for the network)
   *
   * @param track GPS track consisting of a list of data points
   * @param bufferSize size of the buffer to select around the track
   * @param dumpFile if not empty, the path of a shapefile to dump the network into.
   */
  public void addLineStringsFromDatabase(
      ArrayList<Point> track, float bufferSize, String dumpFile) {
    setLineMergeGraphH4cked(new LineMergeGraphH4cked());
    distancesCalculated = false;

    Session session = HibernateUtil.getSessionFactory().getCurrentSession();
    session.beginTransaction();

    // Query gpsResults = session.createQuery("from" );

    if (track == null) {
      Query result = session.createQuery("from OSMEdge");

      @SuppressWarnings("unchecked")
      Iterator<OSMEdge> iter = result.iterate();
      while (iter.hasNext()) {
        OSMEdge o = iter.next();
        LineString g = o.getGeometry();
        addLineString(g, o.getId(), o.getEnvtype(), o.getCyktype(), o.getGroenm());
        // let us add this thing to the spatial index
        addOSMEdgeToSpatialIndex(o);
      }
    } else {
      // let us join the nodes of the track to a linestring ....

      Iterator<Point> trackIter = track.iterator();
      Coordinate[] coords = new Coordinate[track.size()];
      int i = 0;
      while (trackIter.hasNext()) {
        Point p = trackIter.next();
        coords[i] = p.getCoordinate();
        i++;
      }
      if (i > 1) {
        LineString l = fact.createLineString(coords);

        Criteria testCriteria = session.createCriteria(OSMEdge.class);
        if (bufferSize > 0.) { // ... build a buffer ...
          Geometry buffer = l.buffer(bufferSize);
          //				testCriteria.add(SpatialRestrictions.within("geometry", buffer));
          testCriteria.add(SpatialRestrictions.intersects("geometry", buffer));
        }
        @SuppressWarnings("unchecked")
        List<OSMEdge> result = testCriteria.list();

        logger.info("Spatial query selected " + result.size() + " edges");

        Iterator<OSMEdge> iter = result.iterator();
        i = 0;
        while (iter.hasNext()) {
          i++;
          OSMEdge o = iter.next();
          LineString g = o.getGeometry();
          addLineString(g, o.getId(), o.getEnvtype(), o.getCyktype(), o.getGroenm());
          // let us add this thing to the spatial index
          addOSMEdgeToSpatialIndex(o);
        }

        // if required, dump the graph to a shapefile:
        if (dumpFile != "") {
          try {
            this.dumpBuffer(result, dumpFile);
            logger.info("buffer dumped");
          } catch (Exception e) {
            logger.error("error dumping buffer: " + e);
          }
        }
      } else {
        logger.error("error: track has <2 coordinates");
      }
    }

    session.disconnect();
  }