import com.vividsolutions.jts.geom.GeometryFactory;
import com.vividsolutions.jts.geom.LineString;
import com.vividsolutions.jts.index.strtree.STRtree;
import com.vividsolutions.jts.io.ParseException;
import com.vividsolutions.jts.io.WKTReader;
import org.apache.commons.collections.CollectionUtils;
import org.apache.log4j.Logger;
import org.gdal.ogr.Feature;
import org.gdal.ogr.Geometry;
import java.util.*;
public class STRtreeUtils {
private static Logger logger = Logger.getLogger(STRtreeUtils.class);
private static STRtree createStrtree(Collection<Feature> features) {
STRtree tree = new STRtree();
for (Feature feature : features) {
GeometryFactory factory = new GeometryFactory();
WKTReader reader = new WKTReader(factory);
Geometry geometry = feature.GetGeometryRef();
LineString lineString = null;
try {
lineString = (LineString) reader.read(geometry.ExportToWkt());
} catch (ParseException e) {
logger.error("读取linestring异常", e);
}
if (lineString == null) {
continue;
}
tree.insert(lineString.getEnvelopeInternal(), lineString);
}
tree.build();
return tree;
}
public static Set<Feature> drawDissFeature(Map<String, Feature> newMap, Map<String, Feature> oldMap, String newOriginalFileName) throws ParseException {
Set<Feature> features = new HashSet<Feature>();
Collection<Feature> newFeatures = newMap.values();
GeometryFactory factory = new GeometryFactory();
Map<String, STRtree> stRtreeMap = new HashMap<String, STRtree>();
//map对象存放Geometry和Feature的映射,方便后面寻找对应Feature
Map<com.vividsolutions.jts.geom.Geometry, Feature> geoMap = new HashMap<com.vividsolutions.jts.geom.Geometry, Feature>();
for (Feature newFeature : newFeatures) {
Geometry geometry = newFeature.GetGeometryRef();
WKTReader reader = new WKTReader(factory);
com.vividsolutions.jts.geom.Geometry delGeometry = reader.read(geometry.ExportToWkt());
geoMap.put(delGeometry, newFeature);
}
//创建strtree空间索引,strtree很吃内存,尽量少建索引
STRtree stRtree = stRtreeMap.get(newOriginalFileName);
if (stRtree == null) {
stRtree = createStrtree(newFeatures);
if (stRtree == null) return features;
stRtreeMap.put(newOriginalFileName, stRtree);
}
Collection<Feature> delFeatures = oldMap.values();
for (Feature delFeature : delFeatures) {
Geometry geometry = delFeature.GetGeometryRef();
WKTReader reader = new WKTReader(factory);
com.vividsolutions.jts.geom.Geometry delGeometry = reader.read(geometry.ExportToWkt());
List<com.vividsolutions.jts.geom.Geometry> geometries = query(stRtree, delGeometry);
if (CollectionUtils.isEmpty(geometries)) continue;
for (com.vividsolutions.jts.geom.Geometry geometry1 : geometries) {
Feature feature = geoMap.get(geometry1);
if (feature != null) features.add(feature);
}
}
return features;
}
private static List<com.vividsolutions.jts.geom.Geometry> query(STRtree tree, com.vividsolutions.jts.geom.Geometry searchGeo) {
List<com.vividsolutions.jts.geom.Geometry> result = new ArrayList<com.vividsolutions.jts.geom.Geometry>();
@SuppressWarnings("rawtypes")
List list = tree.query(searchGeo.getEnvelopeInternal());
for (Object o : list) {
com.vividsolutions.jts.geom.Geometry lineStr = (com.vividsolutions.jts.geom.Geometry) o;
if (lineStr.intersects(searchGeo)) {
result.add(lineStr);
}
}
return result;
}
}