kopia lustrzana https://github.com/onthegomap/planetiler
				
				
				
			synchronize inserts
							rodzic
							
								
									8b952ab64e
								
							
						
					
					
						commit
						fe7f573deb
					
				| 
						 | 
				
			
			@ -79,7 +79,10 @@ public class PointIndex<T> {
 | 
			
		|||
  public void put(Geometry geom, T item) {
 | 
			
		||||
    if (geom instanceof Point point && !point.isEmpty()) {
 | 
			
		||||
      Envelope envelope = Objects.requireNonNull(point.getEnvelopeInternal());
 | 
			
		||||
      index.insert(envelope, new GeomWithData<>(point.getCoordinate(), item));
 | 
			
		||||
      // need to externally synchronize inserts into the STRTree
 | 
			
		||||
      synchronized (this) {
 | 
			
		||||
        index.insert(envelope, new GeomWithData<>(point.getCoordinate(), item));
 | 
			
		||||
      }
 | 
			
		||||
    } else if (geom instanceof GeometryCollection geoms) {
 | 
			
		||||
      for (int i = 0; i < geoms.getNumGeometries(); i++) {
 | 
			
		||||
        put(geoms.getGeometryN(i), item);
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -22,7 +22,21 @@ public class PolygonIndex<T> {
 | 
			
		|||
    return new PolygonIndex<>();
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  private volatile boolean built = false;
 | 
			
		||||
 | 
			
		||||
  private void build() {
 | 
			
		||||
    if (!built) {
 | 
			
		||||
      synchronized (this) {
 | 
			
		||||
        if (!built) {
 | 
			
		||||
          index.build();
 | 
			
		||||
          built = true;
 | 
			
		||||
        }
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  public List<T> getContaining(Point point) {
 | 
			
		||||
    build();
 | 
			
		||||
    List<?> items = index.query(point.getEnvelopeInternal());
 | 
			
		||||
    return getContaining(point, items);
 | 
			
		||||
  }
 | 
			
		||||
| 
						 | 
				
			
			@ -45,6 +59,7 @@ public class PolygonIndex<T> {
 | 
			
		|||
  }
 | 
			
		||||
 | 
			
		||||
  public List<T> getContainingOrNearest(Point point) {
 | 
			
		||||
    build();
 | 
			
		||||
    List<?> items = index.query(point.getEnvelopeInternal());
 | 
			
		||||
    // optimization: if there's only one then skip checking contains/distance
 | 
			
		||||
    if (items.size() == 1) {
 | 
			
		||||
| 
						 | 
				
			
			@ -81,7 +96,10 @@ public class PolygonIndex<T> {
 | 
			
		|||
 | 
			
		||||
  public synchronized void put(Geometry geom, T item) {
 | 
			
		||||
    if (geom instanceof Polygon poly) {
 | 
			
		||||
      index.insert(poly.getEnvelopeInternal(), new GeomWithData<>(poly, item));
 | 
			
		||||
      // need to externally synchronize inserts into the STRTree
 | 
			
		||||
      synchronized (this) {
 | 
			
		||||
        index.insert(poly.getEnvelopeInternal(), new GeomWithData<>(poly, item));
 | 
			
		||||
      }
 | 
			
		||||
    } else if (geom instanceof GeometryCollection geoms) {
 | 
			
		||||
      for (int i = 0; i < geoms.getNumGeometries(); i++) {
 | 
			
		||||
        put(geoms.getGeometryN(i), item);
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Ładowanie…
	
		Reference in New Issue