1. STRtree 简单使用
大白话:STRStree 相当于一个拓扑树,以上图为例,根节点相当于北京市, A、B分别为树的第二层节点,叶子节点分别是C、D、E、F。若使用范围查询D,使用索引3次则找到D这个范围内的数据。
//新建STRtree 空间对象,和记录查询map
private STRtree createSrtree(Map<String, JsonNode> nMap, JsonNode n) {
STRtree strTree = new STRtree();
WKTReader reader = new WKTReader();
n.fields().forEachRemaining(d -> {
JsonNode checkNode = d.getValue();
String geom = checkNode.get("geom").asText();
try {
LineString lineString = (LineString) reader.read(geom);
//lineString.getEnvelopeInternal()几何形状的最大x,y值对象Envelope
strTree.insert(lineString.getEnvelopeInternal(), d.getKey());
nMap.put(d.getKey(), checkNode);
} catch (ParseException ex) {
LOGGER.error("异常{}", ex);
}
});
strTree.build();
return strTree;
}
//使用STRtree查询
WKTReader reader = new WKTReader();
LineString lineString = (LineString) reader(jsonNode.get("geom").asText());
Point sPoint = lineString.getStartPoint();
Point ePoint = lineString.getEndPoint();
Geometry startBuffer = sPoint.buffer(0.5); //建立0.5m缓冲区
Map<String, JsonNode> nMap = new HashMap<String, JsonNode>();
STRtree strTree = createSrtree(nMap, jsonNode);
Envelope envelope = startBuffer.getEnvelopeInternal();
List<String> keys = strTree.query(envelope);