【JTS Topology Suite】Java对二维几何进行平移、缩放、旋转等坐标变换

news2024/9/22 21:25:08

JTS介绍

Github项目地址:https://github.com/locationtech/jts

Maven库地址:https://mvnrepository.com/artifact/org.locationtech.jts

JTS Topology Suite是一个用于创建和操作二维矢量几何的Java库。

JTS有对应的.NET版本NetTopologySuite库,因此JTS和NTS的相关功能能够方便地转化和迁移(一方的功能在另一方基本都能找到对应的功能类)。

创建一个几何,并对其进行平移、旋转

以JDK1.8为测试环境,先通过Maven安装JTS库:

        <dependency>
            <groupId>org.locationtech.jts</groupId>
            <artifactId>jts-core</artifactId>
            <version>1.19.0</version>
        </dependency>

平移工具类

该平移是在原坐标x、y基础上,分别增加一个参数dx和dy。

import org.locationtech.jts.geom.CoordinateSequence;
import org.locationtech.jts.geom.CoordinateSequenceFilter;
public class GeoOffset implements CoordinateSequenceFilter {
    @Override
    public void filter(CoordinateSequence coordinateSequence, int i) {
        coordinateSequence.setOrdinate(i, 0, coordinateSequence.getX(i) + dx);
        coordinateSequence.setOrdinate(i, 1, coordinateSequence.getY(i) + dy);
    }

    private double dx;
    private double dy;

    public GeoOffset(double dx, double dy)
    {
        this.dx = dx;
        this.dy = dy;
    }
    @Override
    public boolean isDone() {
        return false;
    }

    @Override
    public boolean isGeometryChanged() {
        return false;
    }
}

平移测试用例

    public void testGeoOffset() throws Exception {

        WKTReader r = new WKTReader();
        Geometry g = r.read("polygon((0 0,0 1,1 1,1.5 0,1 -1, 0 0))");

        GeoOffset geooffset = new GeoOffset(2, -0.5);
        g.apply(geooffset);
        System.out.println(g.toText());//POLYGON ((2 -0.5, 2 0.5, 3 0.5, 3.5 -0.5, 3 -1.5, 2 -0.5))
    }

平移前后图形示意图:

在这里插入图片描述

缩放

缩放工具类

该缩放时是在原坐标基础上乘以一个系数scale。

import org.locationtech.jts.geom.CoordinateSequence;
import org.locationtech.jts.geom.CoordinateSequenceFilter;

public class GeoScale implements CoordinateSequenceFilter {
    @Override
    public void filter(CoordinateSequence coordinateSequence, int i) {
        coordinateSequence.setOrdinate(i, 0, coordinateSequence.getX(i) * scale);
        coordinateSequence.setOrdinate(i, 1, coordinateSequence.getY(i) * scale);
    }

    private double scale;

    public GeoScale(double scale)
    {
        this.scale = scale;
    }
    @Override
    public boolean isDone() {
        return false;
    }

    @Override
    public boolean isGeometryChanged() {
        return false;
    }
}

缩放测试用例

    public void testGeoScale() throws Exception {

        WKTReader r = new WKTReader();
        Geometry g = r.read("polygon((0 0,0 1,1 1,1.5 0,1 -1, 0 0))");

        GeoScale geoScale = new GeoScale(2);
        g.apply(geoScale);
        System.out.println(g.toText());//POLYGON ((0 0, 0 2, 2 2, 3 0, 2 -2, 0 0))
    }

在这里插入图片描述

其他变换

可以根据需要,自定义需要的坐标变换,方法是:

先创建一个类并实现CoordinateSequenceFilter 接口,然后自定义filter函数。

例如平移时的filter函数:

    @Override
    public void filter(CoordinateSequence coordinateSequence, int i) {
        coordinateSequence.setOrdinate(i, 0, coordinateSequence.getX(i) + dx);
        coordinateSequence.setOrdinate(i, 1, coordinateSequence.getY(i) + dy);
    }

旋转时的filter函数:

    @Override
    public void filter(CoordinateSequence coordinateSequence, int i) {
        coordinateSequence.setOrdinate(i, 0, coordinateSequence.getX(i) * scale);
        coordinateSequence.setOrdinate(i, 1, coordinateSequence.getY(i) * scale);
    }

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

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

相关文章

PyQt6--Python桌面开发(34.QStatusBar状态栏控件)

QStatusBar状态栏控件 self.statusBar.showMessage(q.text()菜单选项被点击了,5000)

HP Laptop 15s-fq2xxx,15s-fq2706TU原厂Win11系统镜像下载

惠普星15青春版原装Windows11系统&#xff0c;恢复出厂开箱状态oem预装系统&#xff0c;带恢复重置还原 链接&#xff1a;https://pan.baidu.com/s/1t4Pc-Q0obApLkG8o_9Kkkw?pwdduzj 提取码&#xff1a;duzj 适用型号&#xff1a;15s-fq2xxx&#xff0c;15s-fq2000 15s-f…

垃圾回收机制及算法

文章目录 概要对象存活判断引用计数算法可达性分析算法对象是否存活各种引用 垃圾收集算法分代收集理论复制算法标记清除算法标记-整理算法 概要 垃圾收集&#xff08;Garbage Collection&#xff0c; 下文简称GC&#xff09;&#xff0c;其优缺点如下&#xff1a; 优点&#…

从“反超”到“引领”,中国卫浴品牌凭何遥遥领先?

作者 | 曾响铃 文 | 响铃说 前不久&#xff0c;第28届中国国际厨房、卫浴设施展览会(以下简称“中国国际厨卫展”)在上海如期举行&#xff0c;就结果来说真的让人大开眼界。 冲水声比蚊子声更小的马桶、能化身无感交互平台的魔镜柜、可以语音交互的淋浴器&#xff0c;这些“…

揭秘章子怡成功之路:她是如何征服世界的?

章子怡的演艺生涯可谓是一部传奇❗❗❗ 从一个普通工人家庭的女孩&#xff0c;到如今的国际巨星 她的每一步都充满了努力和汗水 她的舞蹈基础为她日后的演艺事业奠定了坚实的基础 而她对戏剧和电影的热爱更是让她在演艺道路上不断前行 从《我的父亲母亲》到《卧虎藏龙》&…

VS Code添加高亮缩进功能

当代码缩进层次较多时&#xff0c;为了视觉上容易识别&#xff0c;一般希望可以多个缩进以不同颜色进行高亮显示&#xff0c; VS Code 中 indent-rainbow 插件可以实现这个功能。

【C++练级之路】【Lv.21】C++11——列表初始化和声明

快乐的流畅&#xff1a;个人主页 个人专栏&#xff1a;《算法神殿》《数据结构世界》《进击的C》 远方有一堆篝火&#xff0c;在为久候之人燃烧&#xff01; 文章目录 引言一、列表初始化1.1 内置类型1.2 结构体或类1.3 容器 二、声明2.1 auto2.2 decltype2.3 nullptr 三、STL的…

海外链游地铁跑酷全自动搬砖挂机掘金变现项目,号称单窗口一天收益30+(教程+工具)

一、项目概述 地铁跑酷海外版国外版自动搬砖挂机掘金项目是一款结合了地铁跑酷元素的在线游戏&#xff0c;为玩家提供一个全新的游戏体验&#xff0c;使得玩家可以轻松地进行游戏&#xff0c;无需手动操作&#xff0c;节省时间和精力。 二、游戏特点 1. 自动化操作&#xff1…

爬虫案例:有道翻译python逆向

pip install pip install requestspip install base64pip install pycrytodome tools 浏览器的开发者工具&#xff0c;重点使用断点&#xff0c;和调用堆栈 工具网站&#xff1a;https://curlconverter.com/ 简便请求发送信息 flow 根据网站信息&#xff0c;preview,respon…

2024 年 5 个 GO REST API 框架

什么是API&#xff1f; API是一个软件解决方案&#xff0c;作为中介&#xff0c;使两个应用程序能够相互交互。以下一些特征让API变得更加有用和有价值&#xff1a; 遵守REST和HTTP等易于访问、广泛理解和开发人员友好的标准。API不仅仅是几行代码&#xff1b;这些是为移动开…

【MAC】Spring Boot 集成OpenLDAP(含本地嵌入式服务器方式)

目录 一、添加springboot ldap依赖&#xff1a; 二、本地嵌入式服务器模式 1.yml配置 2.创建数据库文件&#xff1a;.ldif 3.实体类 4.测试工具类 5.执行测试 三、正常连接服务器模式 1.yml配置 2.连接LDAP服务器配置类&#xff0c;初始化连接&#xff0c;创建LdapTem…

springboot社区助老志愿服务系统-计算机毕业设计源码96682

摘要 大数据时代下&#xff0c;数据呈爆炸式地增长。为了迎合信息化时代的潮流和信息化安全的要求&#xff0c;利用互联网服务于其他行业&#xff0c;促进生产&#xff0c;已经是成为一种势不可挡的趋势。在图书馆管理的要求下&#xff0c;开发一款整体式结构的社区助老志愿服务…

洗地机十大品牌排名:2024十大值得入手的洗地机盘点

随着生活水平的提高&#xff0c;智能清洁家电已经成为日常生活中的必需品。洗地机之所以在家庭清洁中大受欢迎&#xff0c;主要是因为它的多功能特性。传统的清洁方式通常需要扫帚、拖把和吸尘器分别进行操作&#xff0c;而洗地机将这些功能集成在一个设备中&#xff0c;使清洁…

MHDDoS:一个包含了56种技术的DDoS测试工具

关于MHDDoS MHDDoS是一款功能强大的DDoS服务器/站点安全测试工具&#xff0c;该工具包含56种技术&#xff0c;可以帮助广大研究人员对自己的服务器或网站执行DDoS安全测试。 工具技术 Layer7 GET | GET 泛洪 POST | POST 泛洪 OVH | 绕过OVH RHEX | 随机HEX STOMP | 绕过chk_…

Mysql-根据字段名查询字段在哪些表里

SELECT * FROM information_schema.COLUMNS WHERE COLUMN_NAMElabel_name;

【Qt 学习笔记】Qt窗口 | 工具栏 | QToolBar的使用及说明

博客主页&#xff1a;Duck Bro 博客主页系列专栏&#xff1a;Qt 专栏关注博主&#xff0c;后期持续更新系列文章如果有错误感谢请大家批评指出&#xff0c;及时修改感谢大家点赞&#x1f44d;收藏⭐评论✍ Qt窗口 | 工具栏 | QToolBar的使用及说明 文章编号&#xff1a;Qt 学习…

Spring AI实战之二:Chat API基础知识大串讲(重要)

欢迎访问我的GitHub 这里分类和汇总了欣宸的全部原创(含配套源码)&#xff1a;https://github.com/zq2599/blog_demos Spring AI实战全系列链接 Spring AI实战之一&#xff1a;快速体验(OpenAI)Spring AI实战之二&#xff1a;Chat API基础知识大串讲(重要)SpringAIOllama三部曲…

将本地项目上传到 gitee 仓库

1、创建 gitee 仓库 到 gitee 官网&#xff0c;新建仓库 配置新建仓库 完成仓库的创建 项目上传到仓库 上传项目需要安装git git官方下载地址&#xff1a;git下载地址 安装完成&#xff0c;前往本地项目所在文件夹&#xff0c;右击选择 Git Bash Here 刚下载完成需要配置G…

Quartus 联合 ModelSim 仿真 IP 核(RAM)

文章目录 ModelSim 路径设置创建 RAM进行仿真 本文主要介绍如何在包含 IP 核的 Quartus 项目中使用 Modelsim 进行仿真&#xff0c;本文基于 IP 核 RAM: 2-PORT&#xff0c;其他 IP 核类似。 ModelSim 路径设置 点击 Tools->Options 点击 EDA Tool Options&#xff0c;设置…

一张图片中有多个一样的目标物体,分别进行识别定位分割(Python实现)

需求&#xff1a; 一张图片中有多个目标物体&#xff0c;将多个目标物体进行识别分割定位 import cv2 import numpy as npdef show_photo(name,picture):cv2.imshow(name,picture)cv2.waitKey(0)cv2.destroyAllWindows()img_path r"test3.png" img cv2.imread(img…