zoukankan      html  css  js  c++  java
  • geotools的空间索引使用——R树和四叉树

    点索引可以用网格索引kdtree

    线和面的索引用strtree或者QuadTree

    /**
     * 空间索引之st R树
     */
    public static void stRTreeTest(){
        String filePath = "E:\gis资料\测试数据\道路中心线.shp";
        SimpleFeatureCollection sfc = fromShapeFile(filePath);
        SimpleFeatureIterator iterator = sfc.features();
        STRtree stRtree = new STRtree(sfc.size());
        while (iterator.hasNext()){
            Feature ft = iterator.next();
            MultiLineString multiLineString = (MultiLineString)((SimpleFeature) ft).getDefaultGeometry();
            stRtree.insert(multiLineString.getEnvelopeInternal(),ft);
        }
        System.out.println("str树深度:"+stRtree.depth());
        stRtree.build();
        System.out.println("str树深度:"+stRtree.getRoot().getLevel());
        GeometryFactory geometryFactory = JTSFactoryFinder.getGeometryFactory();

        Geometry point =  geometryFactory.createPoint(new Coordinate(120.68,30.76));
        Envelope search = new Envelope(point.getCoordinate());
        search.expandBy(0.001);
        Date start = new Date();
        List result = stRtree.query(search);

       // MySizeOf.sizeOf(stRtree);
        System.out.println("总数据量:"+stRtree.size()+"条");
        System.out.println("查询结果:"+result.size()+"条");
        System.out.println("STR树索引查找耗时:"+(new Date().getTime() - start.getTime()));
    }

    /**
     * 空间索引之st 四叉树
     * 点索引使用kdtree最好
     */
    public static void QuadtreeTest(){
        String filePath = "E:\gis资料\测试数据\道路中心线.shp";
        SimpleFeatureCollection sfc = fromShapeFile(filePath);
        SimpleFeatureIterator iterator = sfc.features();

        GeometryFactory geometryFactory = JTSFactoryFinder.getGeometryFactory();
        Geometry point =  geometryFactory.createPoint(new Coordinate(120.68,30.76));
        Quadtree quadtree = new Quadtree();
        Date start = new Date();
        while (iterator.hasNext()){
            Feature ft = iterator.next();
            MultiLineString multiLineString = (MultiLineString)((SimpleFeature) ft).getDefaultGeometry();
            /*if(multiLineString.intersects(point)){
                break;
            }*/
            quadtree.insert(multiLineString.getEnvelopeInternal(),ft);
        }

        System.out.println("无索引查找耗时:"+(new Date().getTime() - start.getTime()));


        start = new Date();
        Envelope search = new Envelope(point.getCoordinate());
        OctagonalEnvelope searchGeom = new OctagonalEnvelope(point.getCoordinate());
        searchGeom.expandBy(0.001);
        search.expandBy(0.001);

        List result = quadtree.query(search);
        System.out.println(result.get(0).getClass());
        List lastRs = new ArrayList();
        for(Object ob : result){
            SimpleFeature sft = (SimpleFeature)ob;
            Geometry lineGeom =  (Geometry)sft.getDefaultGeometry();
            if(lineGeom.intersects(searchGeom.toGeometry(geometryFactory))){
                lastRs.add(ob);
            }
        }
        System.out.println("总数据量:"+quadtree.size()+"条");
        System.out.println("查询结果:"+lastRs.size()+"条");
        System.out.println("四叉树深度:"+quadtree.depth());
        System.out.println("四叉树树索引查找耗时:"+(new Date().getTime() - start.getTime()));
    }

    总数据量:67749

    查询结果:8

    STR树索引查找耗时:29

    查询结果:8

    四叉树深度:28

    四叉树树索引查找耗时:35

  • 相关阅读:
    clientHeight、offsetHeight、scrollHeight详解
    JavaScript中常见的字符串操作函数及用法
    获取伪元素的属性和改变伪元素的属性
    HTML和CSS实现左侧固定宽度右侧内容可滚动
    gulp常用插件
    gulp入门详细教程
    Javascript 异步实现机制
    JavaScript:彻底理解同步、异步和事件循环(Event Loop)
    chrome调试,打完断点后关于JS的几个控制介绍
    js断点调试心得
  • 原文地址:https://www.cnblogs.com/yinchuanqi/p/5607696.html
Copyright © 2011-2022 走看看