• 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

  • 相关阅读:
    现代程序设计 作业1
    现代程序设计课程简介
    ubuntu 下解决安装包依赖问题
    centos下安装nginx和php-fpm
    如何在本机上将localhost改为www.dev.com
    神器
    脚本监测 前十名磁盘空间用户的列表
    使用xml来显示获取的mysql数据
    linux使用脚本自动连接数据库
    shell script的连接符是逗号,不是英文的句号
  • 原文地址:https://www.cnblogs.com/yinchuanqi/p/5607696.html
Copyright © 2020-2023  润新知