JTS: 25 Index 索引

news2024/11/28 12:51:23

文章目录

      • 版本
      • 代码

版本

org.locationtech.jts:jts-core:1.19.0
链接: github

代码

在这里插入图片描述
在这里插入图片描述

package pers.stu.index;

import org.locationtech.jts.geom.*;
import org.locationtech.jts.index.hprtree.HPRtree;
import org.locationtech.jts.index.quadtree.Quadtree;
import org.locationtech.jts.index.strtree.STRtree;
import org.locationtech.jts.io.ParseException;
import org.locationtech.jts.io.WKTReader;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import pers.stu.util.GeoGebraUtil;
import pers.stu.util.SRIDOutUtil;

import java.util.Arrays;
import java.util.List;
import java.util.Random;

/**
 * 索引使用
 * @author LiHan
 * 2023-11-16 14:11:28
 */
public class IndexUse {

    private static final Logger LOGGER = LoggerFactory.getLogger(IndexUse.class);

    private final GeometryFactory geometryFactory = new GeometryFactory();

    private final WKTReader wktReader = new WKTReader();

    public static void main(String[] args) {
        IndexUse indexUse = new IndexUse();
        Geometry[] geometries = indexUse.test01();
        indexUse.test00(geometries);

    }


    public void test00(Geometry[] geometries) {
        Coordinate[] coordinates = new Coordinate[] {
                new Coordinate(10, 70), new Coordinate(130, 70), new Coordinate(130, 5), new Coordinate(10, 5),
                new Coordinate(10, 70)
        };
        Polygon polygon1 = geometryFactory.createPolygon(coordinates);

        STRtree stRtree = new STRtree();
        HPRtree hpRtree = new HPRtree();
        Quadtree quadtree = new Quadtree();

        for (Geometry geometry : geometries) {
            stRtree.insert(geometry.getEnvelopeInternal(), geometry);
            hpRtree.insert(geometry.getEnvelopeInternal(), geometry);
            quadtree.insert(geometry.getEnvelopeInternal(), geometry);
            LOGGER.info(SRIDOutUtil.ewkt(geometry));
        }

        // 查询范围内的点
        Coordinate[] coordinates1 = new Coordinate[] {
                new Coordinate(20, 60), new Coordinate(110,60), new Coordinate(110, 40), new Coordinate(20, 40),
                new Coordinate(20, 60)
        };
        Polygon polygon2 = geometryFactory.createPolygon(coordinates1);

        LOGGER.info(SRIDOutUtil.ewkt(polygon1));
        LOGGER.info(SRIDOutUtil.ewkt(polygon2));

        long startTime = System.currentTimeMillis();
        List<?> strings0 = stRtree.query(polygon2.getEnvelopeInternal());
        long endTime = System.currentTimeMillis();
        LOGGER.info("查询时间:{}, 查询出多少个:{}", (endTime - startTime), strings0.size());

        startTime = System.currentTimeMillis();
        List<?> strings1 = hpRtree.query(polygon2.getEnvelopeInternal());
        endTime = System.currentTimeMillis();
        LOGGER.info("查询时间:{}, 查询出多少个:{}", (endTime - startTime), strings1.size());

        startTime = System.currentTimeMillis();
        List<?> strings2 = quadtree.query(polygon2.getEnvelopeInternal());
        endTime = System.currentTimeMillis();
        LOGGER.info("查询时间:{}, 查询出多少个:{}", (endTime - startTime), strings2.size());

    }

    /**
     * 根据字符串生成点
     * @return
     */
    public Geometry[] test01() {
        String pointstr = "POINT (100.93320018996765 30.29943781543053), POINT (13.30741823728117 60.67274654095857), POINT (60.70677831219285 50.76468552433665), POINT (79.9774150875676 6.13769673816433), POINT (13.469139126248212 61.88187995248715), POINT (95.38412933841829 15.41536130253155), POINT (40.93550696399639 7.389429211019658), POINT (112.19185248633876 43.044841254913585), POINT (64.93098452078718 55.718223668244505), POINT (75.18707435725018 21.290767238084296), POINT (43.19181074516166 21.91744619247759), POINT (78.6998064478683 28.22619358146395), POINT (39.74310574754522 60.57609402289477), POINT (123.04662320725421 7.795508556020519), POINT (76.89786001207732 69.85942513105607), POINT (76.31742530446084 32.12544336011835), POINT (127.91395723412276 56.33513989770151), POINT (41.69518931757785 57.548561690027924), POINT (15.088371606675857 39.351053658116584), POINT (78.11503404106556 54.031172109566576), POINT (97.55968078955156 27.344179312843707), POINT (63.43623031922804 67.9563571044751), POINT (106.33241825308681 51.610539193132404), POINT (24.41792094776949 20.502891289217967), POINT (71.0288003863869 55.745698518145545), POINT (46.65649286165637 68.18206981769515), POINT (103.61568598003761 66.17793293203339), POINT (40.259762698526075 63.44704838697968), POINT (58.84673093355425 40.95909232919178), POINT (53.40030233311849 21.67306205974595), POINT (59.40192368071497 10.252649925535906), POINT (56.00743431476519 46.22190442393951), POINT (115.69886415064397 32.76407604079313), POINT (39.724593204999735 40.75041790075829), POINT (106.09234903836763 62.69561134190499), POINT (57.875954495843644 52.400176825801594), POINT (12.670980796267788 36.67565203171152), POINT (20.55344054035027 6.014439222117529), POINT (51.101754035293695 24.51239553914466), POINT (65.05231366905198 58.06838350181227), POINT (109.96572464501043 51.552050253992064), POINT (60.75088584041608 69.5700385080002), POINT (125.77005370989069 38.88381968247357), POINT (40.14694507590363 14.791752539472409), POINT (104.31392948686506 10.627053325212426), POINT (74.13074534976539 27.325914779581993), POINT (57.32804373115375 65.06035063927564), POINT (89.69158892963037 26.62364352581612), POINT (35.299481793575254 28.40809200114242), POINT (42.122194887866755 46.87143604224548), POINT (23.136091679836582 11.686749937311768), POINT (21.40227330375405 60.7883647593492), POINT (44.816541618210444 7.13154354007311), POINT (93.8098595608537 53.68511795811766), POINT (116.41454638112394 46.37336556272685), POINT (114.9262038079334 12.916295073271623), POINT (93.8778142071642 12.716617283444672), POINT (39.067169340753836 34.6786129127989), POINT (22.684582131403218 29.58046908789757), POINT (72.79127408804939 53.96022020132737), POINT (30.99266359846364 51.40924591968793), POINT (16.50172764138112 24.330128730165637), POINT (36.138250541078015 27.132051389942756), POINT (108.27696864312622 32.171790954042734), POINT (76.33378303732106 39.55738951743279), POINT (107.93143152642689 49.91114810249921), POINT (15.156473823335212 36.92548368283366), POINT (116.9254066529076 34.767006840955986), POINT (15.911209012467943 60.20914415917251), POINT (41.110118395108245 68.5603994685265), POINT (106.19374956859919 6.653434362401953), POINT (108.41126343996818 5.159624173707641), POINT (109.9723839094359 41.475084054485514), POINT (12.421466158003778 10.208940236582205), POINT (15.24828027098259 65.6044750230085), POINT (65.48933882378255 32.89142085857101), POINT (29.847076436066402 22.846220731012078), POINT (91.25990476111149 56.61030647549254), POINT (116.13634503215953 64.85875403797728), POINT (66.73850094400409 24.638180591711947), POINT (87.45584604095102 46.90900382369785), POINT (17.817284846221916 67.97959239182896), POINT (34.789568594442166 6.445170578269741), POINT (99.82078285700373 15.920350458705496), POINT (51.70084528089928 30.148755293393265), POINT (35.994073028546985 9.995386111730369), POINT (98.7939292683677 33.27642697721625), POINT (101.9743417074574 59.397246758791965), POINT (115.95769195568941 47.78295626815545), POINT (73.15379722795602 65.16847399900439), POINT (31.389197563433157 32.92839183149218), POINT (74.4590801307741 6.873717048064896), POINT (90.88717903817849 53.8157788226297), POINT (128.4395016999927 38.831200800399095), POINT (99.14758182019898 29.58016191619769), POINT (27.673638794083715 38.398187946587974), POINT (126.785535442564 23.755281404569164), POINT (81.37097901243874 26.251414799826428), POINT (112.55031646181288 19.68124222846002), POINT (23.66253380355625 13.080969413477463)";
        String[] strings = pointstr.split(", ");
        LOGGER.info(Arrays.toString(strings));
        Geometry[] geometries = new Geometry[strings.length];
        for (int i = 0; i < strings.length; i++) {
            try {
                geometries[i] = wktReader.read(strings[i]);
                LOGGER.info(GeoGebraUtil.compare(geometries[i]));
            } catch (ParseException e) {
                throw new RuntimeException(e);
            }
        }
        return geometries;
    }

    /**
     * 根据面生成随机点位
     * @param polygon 多边形
     * @param size 点的数量
     * @return 随机点数组
     */
    public Point[] test02(Polygon polygon, int size) {
        Envelope envelope = polygon.getEnvelopeInternal();

        // 获取 最大,最小XY
        double maxX = envelope.getMaxX();
        double minX = envelope.getMinX();
        double maxY = envelope.getMaxY();
        double minY = envelope.getMinY();

        Random random = new Random();
        Point[] points = new Point[size];
        for (int i = 0; i < size; i++) {
            double randomX1 = minX + (maxX - minX) * random.nextDouble();
            double randomY1 = minY + (maxY - minY) * random.nextDouble();
            Point point = geometryFactory.createPoint(new Coordinate(randomX1, randomY1));
            LOGGER.info(GeoGebraUtil.compare(point));
            points[i] = point;
        }

        return points;
    }
}

18:00:24.551 [main] INFO  pers.stu.index.IndexUse - 查询时间:1, 查询出多少个:22
18:00:24.553 [main] INFO  pers.stu.index.IndexUse - 查询时间:2, 查询出多少个:22
18:00:24.553 [main] INFO  pers.stu.index.IndexUse - 查询时间:0, 查询出多少个:35

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1218591.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【MySQL8】1130 - Host ‘***‘ is not allowed to connect to this MySOL server

问题描述 使用 Navicat 连接 MySQL8 报错&#xff1a; 1130 - Host *** is not allowed to connect to this MySOL server解决方案 use mysql;select host ,user from user; -- 将 root 用户的主机&#xff08;host&#xff09;值修改为 %&#xff0c;即允许从任何主机连接 …

电脑集中管理软件有哪些?电脑集中管控怎么做

电脑集中管理软件有哪些&#xff1f;电脑集中管控怎么做 电脑集中管理软件是指通过一种软件或系统&#xff0c;对多台电脑进行集中管理和控制的工具。这种软件通常具备远程控制、软硬件监控、自动部署等功能。可以方便企业或组织统一管理电脑资源&#xff0c;提高工作效率。今…

新版软考高项试题分析精选(四)

请点击↑关注、收藏&#xff0c;本博客免费为你获取精彩知识分享&#xff01;有惊喜哟&#xff01;&#xff01; 1、一般而言&#xff0c;大型软件系统中实现数据压缩功能&#xff0c;工作在OSI参考模型的&#xff08; &#xff09;。 A.应用层 B.表示层 C.会话层 D.网络层…

Odoo 15开发手册第七章 记录集 - 使用模型数据

在前面的章节中&#xff0c;我们概览了模型创建以及如何向模型加载数据。现在我们已有数据模型和相关数据&#xff0c;是时候学习如何编程与其进行交互了。 业务应用需要业务逻辑来计算数据、执行验证或自动化操作。Odoo框架API为开发者提供了工具用于实现这种业务逻辑。大多数…

有Mac或无Mac电脑通用的获取安卓公钥的方案

从2023年9月开始&#xff0c;所有上架应用市场的app都需要进行APP备案。 其中后端服务器在阿里云的可以在阿里云备案&#xff0c;后端服务器在腾讯云的可以在腾讯云备案。但无论你是在什么云厂商里做备案&#xff0c;无一例外的是&#xff0c;无论是上架安卓应用还是上架IOS应…

如何将图片转为excel或word?(客户端)

演示软件&#xff1a;金鸣表格文字识别大师3.6.1&#xff08;新版本界面可能会略有不同&#xff09; 第一部分 将图片转为excel或文表混合的word 一般的软件要将图片转为可编辑的excel&#xff0c;都需要待识别的图片要有明显清晰的表格线&#xff0c;但我们程序现已克服了这…

多线程概述及创建

什么是线程&#xff1f; 线程(thread)是一个程序内部的一条执行路径。 我们之前启动程序执行后&#xff0c;main方法的执行其实就是一条单独的执行路径。 程序中如果只有一条执行路径&#xff0c;那么这个程序就是单线程的程序。 多线程是什么&#xff1f; 多线程是指从软…

把GPT知识库当成记事本,非常有趣的玩法,很欢乐!

1. 笔者创建了一个“每天碎碎念”知识库&#xff0c;把重要的事情保存成文件记录&#xff0c;并进行训练。 2. 这样每当我记不清楚的时候 就开始灵魂发问~ 3. GPT最擅长胡编乱造&#xff0c;万一他忽悠我怎么办&#xff0c;别着急。查看“知识原文”就知道他是否忽悠你了。 这…

C# 实时监控双门双向门禁控制板源码

本示例使用设备&#xff1a;实时网络双门双向门禁控制板可二次编程控制网络继电器远程开关-淘宝网 (taobao.com) using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.…

通信原理板块——脉冲编码调制(PCM)

微信公众号上线&#xff0c;搜索公众号小灰灰的FPGA,关注可获取相关源码&#xff0c;定期更新有关FPGA的项目以及开源项目源码&#xff0c;包括但不限于各类检测芯片驱动、低速接口驱动、高速接口驱动、数据信号处理、图像处理以及AXI总线等 1、脉冲编码调制PCM原理 将模拟信号…

[Jenkins] Docker 安装Jenkins及迁移流程

系统要求 最低推荐配置: 256MB可用内存1GB可用磁盘空间(作为一个Docker容器运行jenkins的话推荐10GB) 为小团队推荐的硬件配置: 1GB可用内存50 GB 可用磁盘空间 软件配置: Java 8—无论是Java运行时环境&#xff08;JRE&#xff09;还是Java开发工具包&#xff08;JDK&#xff…

算法-链表-简单-相交、反转、回文、环形、合并

记录一下算法题的学习5 在写关于链表的题目之前&#xff0c;我们应该熟悉回忆一下链表的具体内容 什么是链表&#xff1a; 链表&#xff08;Linked list&#xff09;是一种常见的基础数据结构&#xff0c;是一种线性表&#xff0c;但是并不会按线性的顺序存储数据&#xff0c…

力扣第695题 岛屿的最大面积 C++ DFS BFS 附Java代码

题目 695. 岛屿的最大面积 中等 相关标签 深度优先搜索 广度优先搜索 并查集 数组 矩阵 给你一个大小为 m x n 的二进制矩阵 grid 。 岛屿 是由一些相邻的 1 (代表土地) 构成的组合&#xff0c;这里的「相邻」要求两个 1 必须在 水平或者竖直的四个方向上 相邻。你…

系列四、JVM的内存结构【本地接口(Native Interface)】

一、组成 本地接口由本地方法栈&#xff08;Native Method Stack&#xff09;、本地方法接口&#xff08;Native Interface&#xff09;、本地方法库组成。 二、本地接口的作用 本地接口的作用是融合不同的编程语言为Java所用&#xff0c;它的初衷是融合C/C程序&#xff0c;Jav…

CTFhub-RCE-过滤运算符

检查网页源代码发现如果用户输入 || &#xff08;逻辑或操作符&#xff09; 或者是 & &#xff08;按位与操作符&#xff09;&#xff0c;就不会执行。直接进行测试&#xff0c;在 URL 后输入本地 IP 进行 ping 命令测试&#xff0c;发现可以正常回显。检查网页源代码发现如…

C++基础从0到1入门编程(一)

系统学习C 方便自己日后复习&#xff0c;错误的地方希望积极指正 参考视频&#xff1a;黑马程序员匠心之作|C教程从0到1入门编程,学习编程不再难 1 第一个C程序-HelloWorld 编写一个C程序分为四个步骤&#xff1a; &#xff08;1&#xff09;创建项目 &#xff08;2&#xff…

Android开发APP显示头部Bar

Android开发显示头部Bar 需求&#xff1a; 显示如下图&#xff1a; 显示头部Bar&#xff0c;颜色也能自定义。 解决方案 这个修改是在如下三个文件里进行修改&#xff1a; 按顺序修改&#xff1a; themes.xml(night): <resources xmlns:tools"http://schemas.andr…

LeetCode(22)N 字形变换【数组/字符串】【中等】

目录 1.题目2.答案3.提交结果截图 链接&#xff1a; N 字形变换 1.题目 将一个给定字符串 s 根据给定的行数 numRows &#xff0c;以从上往下、从左到右进行 Z 字形排列。 比如输入字符串为 "PAYPALISHIRING" 行数为 3 时&#xff0c;排列如下&#xff1a; P A …

3.6 Windows驱动开发:内核进程汇编与反汇编

在笔者上一篇文章《内核MDL读写进程内存》简单介绍了如何通过MDL映射的方式实现进程读写操作&#xff0c;本章将通过如上案例实现远程进程反汇编功能&#xff0c;此类功能也是ARK工具中最常见的功能之一&#xff0c;通常此类功能的实现分为两部分&#xff0c;内核部分只负责读写…

滚雪球学Java(09-2):Java中的关系运算符,你真的掌握了吗?

咦咦咦&#xff0c;各位小可爱&#xff0c;我是你们的好伙伴——bug菌&#xff0c;今天又来给大家普及Java SE相关知识点了&#xff0c;别躲起来啊&#xff0c;听我讲干货还不快点赞&#xff0c;赞多了我就有动力讲得更嗨啦&#xff01;所以呀&#xff0c;养成先点赞后阅读的好…