org.locationtech.jts.index.quadtree.Quadtree类的使用及代码示例

x33g5p2x  于2022-01-28 转载在 其他  
字(8.8k)|赞(0)|评价(0)|浏览(332)

本文整理了Java中org.locationtech.jts.index.quadtree.Quadtree类的一些代码示例,展示了Quadtree类的具体用法。这些代码示例主要来源于Github/Stackoverflow/Maven等平台,是从一些精选项目中提取出来的代码,具有较强的参考意义,能在一定程度帮忙到你。Quadtree类的具体详情如下:
包路径:org.locationtech.jts.index.quadtree.Quadtree
类名称:Quadtree

Quadtree介绍

[英]A Quadtree is a spatial index structure for efficient range querying of items bounded by 2D rectangles. Geometrys can be indexed by using their Envelopes. Any type of Object can also be indexed as long as it has an extent that can be represented by an Envelope.

This Quadtree index provides a primary filter for range rectangle queries. The various query methods return a list of all items which may intersect the query rectangle. Note that it may thus return items which do not in fact intersect the query rectangle. A secondary filter is required to test for actual intersection between the query rectangle and the envelope of each candidate item. The secondary filter may be performed explicitly, or it may be provided implicitly by subsequent operations executed on the items (for instance, if the index query is followed by computing a spatial predicate between the query geometry and tree items, the envelope intersection check is performed automatically.

This implementation does not require specifying the extent of the inserted items beforehand. It will automatically expand to accommodate any extent of dataset.

This data structure is also known as an MX-CIF quadtree following the terminology of Samet and others.
[中]四叉树是一种空间索引结构,用于高效地查询二维矩形范围内的项。几何体可以通过使用其封套进行索引。任何类型的对象也可以被索引,只要它有一个可以用信封表示的范围。
这个四叉树索引为范围矩形查询提供了一个主过滤器。各种查询方法返回一个列表,其中包含可能与查询矩形相交的所有项。请注意,它可能因此返回实际上与查询矩形不相交的项。需要一个二级过滤器来测试查询矩形和每个候选项的信封之间的实际交集。二级过滤器可以显式执行,也可以通过对项执行的后续操作隐式提供(例如,如果索引查询之后计算查询几何体和树项之间的空间谓词,则自动执行信封相交检查)。
这种实现不需要事先指定插入项的范围。它将自动扩展以适应数据集的任何范围。
这种数据结构也被称为MX-CIF四叉树,它遵循Samet和其他术语。

代码示例

代码示例来源:origin: geotools/geotools

/**
 * Adds a label into the index
 *
 * @param item
 * @param bounds
 */
public void addLabel(LabelCacheItem item, Rectangle2D bounds) {
  Envelope e = toEnvelope(bounds);
  index.insert(e, new InterferenceItem(e, item));
}

代码示例来源:origin: geotools/geotools

protected Node find(Polygon polygon) {
  List close = index.query(polygon.getEnvelopeInternal());
  for (Iterator itr = close.iterator(); itr.hasNext(); ) {
    Node node = (Node) itr.next();
    Polygon p = (Polygon) node.getObject();
    if (rel.equal(polygon, p)) {
      return node;
    }
  }
  return null;
}

代码示例来源:origin: geotools/geotools

protected Quadtree copySTRtreeFrom(Diff diff) {
  Quadtree tree = new Quadtree();
  synchronized (diff) {
    Iterator<Entry<String, SimpleFeature>> i = diff.added.entrySet().iterator();
    while (i.hasNext()) {
      Entry<String, SimpleFeature> e = i.next();
      SimpleFeature f = (SimpleFeature) e.getValue();
      if (!diff.modifiedFeatures.containsKey(f.getID())) {
        tree.insert(ReferencedEnvelope.reference(f.getBounds()), f);
      }
    }
    Iterator<Entry<String, SimpleFeature>> j = diff.getModified().entrySet().iterator();
    while (j.hasNext()) {
      Entry<String, SimpleFeature> e = j.next();
      SimpleFeature f = (SimpleFeature) e.getValue();
      tree.insert(ReferencedEnvelope.reference(f.getBounds()), f);
    }
  }
  return tree;
}

代码示例来源:origin: geotools/geotools

@Override
public boolean checkAndReserve(List<AffineTransform2D> transforms)
    throws MismatchedDimensionException, TransformException {
  List<Geometry> transformedConflictBounds = new ArrayList<Geometry>();
  boolean conflict = false;
  for (AffineTransform2D tx2d : transforms) {
    if (conflict) {
      break;
    }
    Geometry cbTransformed = JTS.transform(conflictBounds, tx2d);
    transformedConflictBounds.add(cbTransformed);
    List results = qt.query(cbTransformed.getEnvelopeInternal());
    for (Iterator it = results.iterator(); it.hasNext(); ) {
      Geometry candidate = (Geometry) it.next();
      if (candidate.intersects(cbTransformed)) {
        // location conflict
        conflict = true;
        break;
      }
    }
  }
  // reserve the area if no conflict
  if (!conflict) {
    for (Geometry tcb : transformedConflictBounds) {
      qt.insert(tcb.getEnvelopeInternal(), tcb);
    }
  }
  return !conflict;
}

代码示例来源:origin: org.jaitools/jt-vectorize

Quadtree spIndex = new Quadtree();
for (Geometry poly : polys) {
  spIndex.insert(poly.getEnvelopeInternal(), poly);
    filterIter.remove();
    List nbrs = spIndex.query(smallPoly.getEnvelopeInternal());
    Geometry selectedNbr = null;
    if (!nbrs.isEmpty()) {
      spIndex.remove(selectedNbr.getEnvelopeInternal(), selectedNbr);
      removePolygon(polys, selectedNbr);
      spIndex.insert(merged.getEnvelopeInternal(), merged);
      polys.add(merged);

代码示例来源:origin: locationtech/jts

@SuppressWarnings("rawtypes")
 public void testNullQuery() {
  Quadtree qt = new Quadtree();
  List result1 = qt.query(null); 
  assertTrue(result1.size() == 0);
  
  qt.insert(new Envelope(0, 10, 0, 10), "some data");
  List result2 = qt.query(null); 
  assertTrue(result2.size() == 0);
}

代码示例来源:origin: locationtech/jts

public void testSpatialIndex()
      throws Exception
 {
  Quadtree index = new Quadtree();
  assertTrue(index.size() == 0);
  assertTrue(index.isEmpty());

  index.insert(new Envelope(0,0,1,1), "test");
  assertTrue(index.size() == 1);
  assertTrue(!index.isEmpty());

  index.remove(new Envelope(0,0,1,1), "test");
  assertTrue(index.size() == 0);
  assertTrue(index.isEmpty());
 }
}

代码示例来源:origin: geotools/geotools

/** Clear diff - called during rollback. */
public void clear() {
  synchronized (mutex) {
    nextFID = 0;
    addedFeatures.clear();
    addedFidList.clear();
    modifiedFeatures.clear();
    spatialIndex = new Quadtree();
  }
}

代码示例来源:origin: geotools/geotools

public Graphable remove(Object obj) {
  Node node = (Node) get(obj);
  if (node != null) {
    Polygon polygon = (Polygon) node.getObject();
    index.remove(polygon.getEnvelopeInternal(), node);
    builder.removeNode(node);
  }
  return node;
}

代码示例来源:origin: locationtech/jts

public void insert(Envelope itemEnv, Object item)
{
 collectStats(itemEnv);
 Envelope insertEnv = ensureExtent(itemEnv, minExtent);
 root.insert(insertEnv, item);
}

代码示例来源:origin: orbisgis/h2gis

/**
 * Compute unique index for the coordinate
 * Index count from 0 to n
 * If the new vertex is closer than distMerge with an another vertex then it will return its index.
 * @return The index of the vertex
 */
private int getOrAppendVertex(Coordinate newCoord, Quadtree ptQuad) {
  Envelope queryEnv = new Envelope(newCoord);
  queryEnv.expandBy(epsilon);
  QuadTreeVisitor visitor = new QuadTreeVisitor(epsilon, newCoord);
  try {
    ptQuad.query(queryEnv, visitor);
  } catch (RuntimeException ex) {
    //ignore
  }
  if (visitor.getNearest() != null) {
    return visitor.getNearest().index;
  }
  // Not found then
  // Append to the list and QuadTree
  EnvelopeWithIndex ret = new EnvelopeWithIndex(triVertex.size(), newCoord);
  ptQuad.insert(queryEnv, ret);
  triVertex.add(ret);
  return ret.index;
}

代码示例来源:origin: geotools/geotools

/** Create an empty Diff */
public Diff() {
  // private fields
  modifiedFeatures = new ConcurrentHashMap<String, SimpleFeature>();
  addedFeatures = new ConcurrentHashMap<String, SimpleFeature>();
  addedFidList = new CopyOnWriteArrayList<String>();
  // public "views" requiring synchronised( mutex )
  modified2 = Collections.unmodifiableMap(modifiedFeatures);
  added = Collections.unmodifiableMap(addedFeatures);
  spatialIndex = new Quadtree();
  mutex = this;
}

代码示例来源:origin: locationtech/jts

public void remove(LineSegment seg)
{
 index.remove(new Envelope(seg.p0, seg.p1), seg);
}

代码示例来源:origin: geotools/geotools

/**
 * Returns true if there is any label in the index within the specified distance from the
 * bounds. For speed reasons the bounds will be simply expanded by the distance, no curved
 * buffer will be generated
 *
 * @param bounds
 * @param distance
 * @return
 */
@SuppressWarnings("unchecked")
public boolean labelsWithinDistance(Rectangle2D bounds, double distance) {
  if (distance < 0) return false;
  Envelope e = toEnvelope(bounds);
  e.expandBy(distance);
  List<InterferenceItem> results = index.query(e);
  if (results.size() == 0) return false;
  for (Iterator<InterferenceItem> it = results.iterator(); it.hasNext(); ) {
    InterferenceItem item = it.next();
    if (item.env.intersects(e)) {
      return true;
    }
  }
  return false;
}

代码示例来源:origin: geotools/geotools

/**
   * Reserve the area indicated by these Geometry.
   *
   * @param reserved
   */
  public void reserveArea(List<Rectangle2D> reserved) {
    for (Rectangle2D area : reserved) {
      Envelope env = toEnvelope(area);

      InterferenceItem item = new InterferenceItem(env, null);
      index.insert(env, item);
    }
  }
}

代码示例来源:origin: locationtech/jts

private void buildQuadtree()
 {
  quadtree = new Quadtree();

  for (int i = 0; i < rings.size(); i++) {
   LinearRing ring = (LinearRing) rings.get(i);
   Envelope env = ring.getEnvelopeInternal();
   quadtree.insert(env, ring);
  }
 }
}

代码示例来源:origin: geotools/geotools

public PolygonGraphGenerator(GraphBuilder builder, PolygonRelationship rel) {
  setGraphBuilder(builder);
  this.rel = rel;
  index = new Quadtree();
}

代码示例来源:origin: org.geotools/gt-graph

public Graphable remove(Object obj) {
  Node node = (Node) get(obj);
  if (node != null) {
    Polygon polygon = (Polygon) node.getObject();
    index.remove(polygon.getEnvelopeInternal(), node);
    builder.removeNode(node);
  }
  return node;
}

代码示例来源:origin: geotools/geotools

protected void relate(Node node) {
    Polygon polygon = (Polygon) node.getObject();
    List close = index.query(polygon.getEnvelopeInternal());

    for (Iterator itr = close.iterator(); itr.hasNext(); ) {
      Node n = (Node) itr.next();
      Polygon p = (Polygon) n.getObject();

      if (!rel.equal(polygon, p) && rel.related(polygon, p)) {
        Edge edge = builder.buildEdge(node, n);
        builder.addEdge(edge);
        builder.addEdge(edge);
      }
    }
  }
}

代码示例来源:origin: geotools/geotools

public Graphable add(Object obj) {
  Node node = (Node) get(obj);
  if (node == null) {
    node = builder.buildNode();
    builder.addNode(node);
    node.setObject(obj);
    relate(node);
    // TODO: the envelope should be buffered by some tolerance
    index.insert(((Polygon) obj).getEnvelopeInternal(), node);
  }
  return node;
}

相关文章

微信公众号

最新文章

更多