geotools介绍

Geotools是一个基于Java的开源地理信息系统(GIS)工具包,可以用于处理和分析地理数据。

构建图形

我们地球上所说的两点之间的距离基本上都是弧长,所以要有弧长转换为弧度的基本知识,在一个圆形里2π弧长对应的弧度是360度,所以一弧度可以等于180/π大约等于57.32度

package com.bp.commons.utils;import com.alibaba.fastjson.JSONObject;
import org.geotools.geometry.jts.JTSFactoryFinder;
import org.locationtech.jts.geom.*;
import org.locationtech.jts.operation.buffer.BufferOp;
import org.locationtech.jts.operation.buffer.BufferParameters;
import org.locationtech.jts.util.GeometricShapeFactory;public class GeoUtils {/*** 定义地球半径(米)*/private static final double R_EARTH = 6371000;/*** 定义地球赤道周长(米)*/private static final double P_EARTH = 2 * Math.PI * R_EARTH;/*** 将Y轴的长度(米)转换成纬度** @param length* @return*/public static double parseYLengthToDegree(double length) {//将length长度转换为度数double yDegree = length / P_EARTH * 360;return yDegree;}/*** 根据圆形中心点经纬度、半径生成圆形(类圆形,32边多边形)** @param x      中心点经度* @param y      中心点纬度* @param radius 半径(米)* @return*/public static Polygon createCircle(double x, double y, final double radius) {//将半径转换为度数double radiusDegree = parseYLengthToDegree(radius);//生成工厂类GeometricShapeFactory shapeFactory = new GeometricShapeFactory();//设置生成的类圆形边数shapeFactory.setNumPoints(32);//设置圆形中心点经纬度shapeFactory.setCentre(new Coordinate(x, y));//设置圆形直径shapeFactory.setSize(radiusDegree * 2);//使用工厂类生成圆形Polygon circle = shapeFactory.createCircle();return circle;}/*** 根据中心点经纬度、长轴、短轴、角度生成椭圆** @param x* @param y* @param macroaxis* @param brachyaxis* @param direction* @return*/public static Polygon createEllipse(double x, double y, double macroaxis, double brachyaxis, double direction) {//将长短轴转换为度数double macroaxisDegree = parseYLengthToDegree(macroaxis);double brachyaxisDegree = parseYLengthToDegree(brachyaxis);//将夹角转换为弧度double radians = Math.toRadians(direction);GeometricShapeFactory shapeFactory = new GeometricShapeFactory();//设置中心点shapeFactory.setCentre(new Coordinate(x, y));//设置长轴长度shapeFactory.setWidth(macroaxisDegree);//设置短轴长度shapeFactory.setHeight(brachyaxisDegree);//设置长轴和X轴夹角shapeFactory.setRotation(radians);//生成椭圆对象Polygon ellipse = shapeFactory.createEllipse();return ellipse;}/*** 根据中心点经纬度、半径、起止角度生成扇形** @param x         经度* @param y         纬度* @param radius    半径(米)* @param bAngle    起始角度* @param eAngle    终止角度* @param pointsNum 点数* @return*/public static Polygon createSector(double x, double y, double radius, double bAngle, double eAngle, int pointsNum) {//将半径转换为度数double radiusDegree = parseYLengthToDegree(radius);//将起始角度转换为弧度double bAngleRadian = Math.toRadians(bAngle);//将终止角度-起始角度计算扇形夹角double angleRadian = Math.toRadians((eAngle - bAngle + 360) % 360);GeometricShapeFactory shapeFactory = new GeometricShapeFactory();//设置点数shapeFactory.setNumPoints(pointsNum);//设置中心点经纬度shapeFactory.setCentre(new Coordinate(x, y));//设置直径shapeFactory.setSize(radiusDegree * 2);//传入起始角度和扇形夹角,生成扇形Polygon sector = shapeFactory.createArcPolygon(bAngleRadian, angleRadian);return sector;}/*** 根据四个坐标画矩形注意正方形也是矩形** @param coords 一组经纬度点* @return*/public static Polygon createRectangle(Coordinate[] coords) {GeometryFactory geometryFactory = new GeometryFactory();/*Coordinate[] coords  =new Coordinate[] {new Coordinate(4, 0), new Coordinate(2, 2),new Coordinate(4, 4), new Coordinate(6, 2), new Coordinate(4, 0) };*/LinearRing ring = geometryFactory.createLinearRing(coords);LinearRing holes[] = null;Polygon polygon = geometryFactory.createPolygon(ring, holes);return polygon;}/**** @param line 需要缓冲的线段* @param distance 缓冲区的距离 正数时方向是左边 负数是右边* @return*/public static Geometry createBuffer(LineString line, Double distance) {// 定义缓冲参数(这里设置了单侧缓冲区的距离和方向)BufferParameters bufferParams = new BufferParameters();// 默认false指定缓冲区为单侧bufferParams.setSingleSided(true);// 指定缓冲区的精确度bufferParams.setQuadrantSegments(8);// 指定缓冲区两端端点的样式bufferParams.setEndCapStyle(BufferParameters.CAP_FLAT);// 指定缓冲区连接线段的样式bufferParams.setJoinStyle(BufferParameters.JOIN_MITRE);// 设置缓冲区的边角限制(多条线段连接时可以用这个保留连接时的角,默认会对线段接头作圆角处理 值可以根据相关)bufferParams.setMitreLimit(5.0);// 构建单侧缓冲区 1.第一种方式无法指定扩展参数是默认的,推荐第二种// Geometry buffer = line.buffer(distance);BufferOp bufferOp = new BufferOp(line, bufferParams);Geometry geometry = bufferOp.getResultGeometry(distance);return geometry;}

依赖可以点击链接在本文自取,最好是25版本的因为比较新

使用geotools构建特殊的多边形相关推荐

  1. Unity动态构建Mesh来绘制任意多边形(雷达图效果)

    由于很多同学没有做出来,特此补传一个Demo工程 (版本Unity2019.1.8f1) CSDN下载:https://download.csdn.net/download/linxinfa/1195 ...

  2. Unity动态绘制多边形

    使用场景: 原理 就是动态new一个Mesh,设置三角形和定点数据,然后赋值给MeshFilter,通过MeshRenderer绘制出来 步骤 1 把文章下面的脚本复制到工程中 2 在场景中创建一个空 ...

  3. GeoWave0.9.8开发人员指南

    GeoWave0.9.8开发人员指南 官方英文地址:http://s3.amazonaws.com/geowave/0.9.8/docs/devguide.html 介绍 什么是GeoWave Geo ...

  4. LabVIEW图像模式匹配(基础篇—11)

    目录 1.图像模式匹配概念 2.影响图像模式匹配的因素 3.灰度匹配 4.几何匹配 5.黄金模板比较 图像模式匹配是指通过分析模板图像和目标图像中灰度.边缘.外形结构以及对应关系等特征的相似性和一致性 ...

  5. ​哪些开发问题最让程序员“头秃”?我们分析了Stack Overflow的11000个问题

    作者 | Nick Roberts 编译 | AI科技大本营(ID:rgznai100) 自 2008 年成立以来,Stack Overflow 一直在拯救所有类型的开发人员.自那时以来,开发人员提出 ...

  6. google+stackoverflow_哪些开发问题最让程序员“头秃”?我们分析了Stack Overflow的11000个问题...

    作者 | Nick Roberts 编译 | AI科技大本营(ID:rgznai100) 自 2008 年成立以来,Stack Overflow 一直在拯救所有类型的开发人员.自那时以来,开发人员提出 ...

  7. Android--百度地图之基础地图(三)

    开发者可利用SDK提供的接口,使用百度为您提供的基础地图数据.目前百度地图SDK所提供的地图等级为3-21级,所包含的信息有建筑物.道路.河流.学校.公园等内容. V3.7.0起,地图支持缩放至21级 ...

  8. ​什么问题最让程序员头秃?我们分析了11种语言的11000个问题

    导读:自 2008 年成立以来,Stack Overflow 一直在拯救所有类型的开发人员.自那时以来,开发人员提出了数百万个关于开发领域的问题. 但是,迫使开发者转向 Stack Overflow ...

  9. 取代 JavaScript!Python 成 Stack Overflow 最受质疑编程语言

    对于开发人员来说,哪些编程语言最受欢迎?哪些框架.包.函数和方法被提问的次数最多?哪种数据类型使用起来最痛苦?各个编程语言之间的问题有何不同?--本文中汇总了数百万个各个开发领域内的不同问题,挑选了1 ...

最新文章

  1. mysql怎么实现事务序列化_MySQL 架构 - 事务处理
  2. Asp.net常用技巧
  3. php 请求url 返回json,php解析请求url并返回json数据
  4. Kconfig中的“depends on”和“select”
  5. macos 安装scala_如何在MacOS上安装Scala和Apache Spark
  6. 路飞学城django
  7. 自定义导航栏的背景、标题、返回按钮文字颜色[转]
  8. 大数据“矿工” 世界上最艰辛的IT人
  9. 2016中国地理信息产业百强企业公示名单(转)
  10. Python动态页面抓取超级指南
  11. 【韩顺平 零基础30天学会Java】(第一阶段)(自用)
  12. “舌尖上的安全”:基于区块链构建四位一体的食品安全社会共治体系
  13. java 实现屏幕录像_用JAVA捕获屏幕、屏幕录像、播放
  14. 面向对象的程序设计-地铁路线计算程序的设计、优化与测试
  15. 移动流量转赠给好友_手机包月流量用不完:教你如何转赠给好友使用
  16. 联想 ThinkPad E480无线网卡配置错误导致无法连接无线网解决方案
  17. 近期量子计算论文总结
  18. 图片站选择什么样的服务器好?
  19. LINUX JDK 安装与环境变量设置
  20. 没资源也能赚钱!跑跑步就能赚钱!

热门文章

  1. 敏捷运维的实操 -- 迭代内工作量
  2. 实际打印纸张的横向设置不起作用的问题
  3. IOS Swift 入门学习汇总 (更新中..)
  4. sequelize 向数据库插入数据,自增id该如何添加
  5. 阿里云视觉AI训练营_Class5_实践课:人脸动漫化搭建
  6. 微信小程序生成清晰海报并保存到本地
  7. python字典函数大全_python字典介绍
  8. python数据分析:使用lifetimes进行客户终身价值(CLV)探索
  9. 我赌你没有了解过——Python 图像加密
  10. 一家之言—通信专业IT男的弊端