目录

写在前面

一、长度(米)转换为经纬度

二、将圆形、椭圆、扇形用Geometry对象表示

表示圆形

表示椭圆

表示扇形

效果展示

三、判断线段与图形是否相交


写在前面

因为项目需要,做了些地理信息的开发工作,主要包括三部分:
1、将长度(米)转换成经纬度的度数;
2、将圆形、椭圆、矩形、扇形用Java对象表示:用到com.vividsolutions.jts.util.GeometricShapeFactory工厂类和com.vividsolutions.jts.geom.Geometry对象;
3、判断线段与上述图形在地图上是否相交。

一、长度(米)转换为经纬度

长度和经纬度转换中,纬度转换容易,因为所有纬线等长,可是不同位置经线长度不同,导致不同位置经度转换不同。下面我整理经度和纬度转换两种方式:

 /*** 定义地球半径(米)*/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 / EARTH_RADIUS * 360;
//        return yDegree;//使用Y轴做计量 会形成一个椭圆弧 这里在X轴也组处理暂时 没有找到方案Double degree = ((2 * Math.PI * 3959 ) * 1609) / 360.0;Double dpmLat = 1 / degree;Double radiusLat = dpmLat * length;return radiusLat;}
    /*** 根据所在纬度,将X轴的长度(米)转换成经度* (因为不同纬度下,1°经度代表的长度不同)* @param y 所在纬度* @param length 线段长度* @return*/public static double parseXLengthToDegree(double y,double length){//将角度(纬度)转换为弧度double latRadian = Math.toRadians(y);//计算当前纬度地球周长double latPEarth = P_EARTH * Math.cos(latRadian);//将length长度转换为度数double xDegree = length / latPEarth * 360;return xDegree;}

二、将圆形、椭圆、扇形用Geometry对象表示

输入参数为中心点的经纬度、半径(米),先将半径转换为经纬度单位,使用com.vividsolutions.jts.util包,生成GeometricShapeFactory工厂类对象,设置相应参数,生成Geometry圆形对象。

 import com.vividsolutions.jts.geom.*;import com.vividsolutions.jts.util.GeometricShapeFactory;/*** 根据圆形中心点经纬度、半径生成圆形(类圆形,32边多边形)* @param x 中心点经度* @param y 中心点纬度* @param radius 半径(米)* @return*/public static Polygon createCircle(double x, double y, final double radius) {//将半径转换为度数double radiusDegree = parseYLengthToDegree(radius);//生成工厂类private static GeometricShapeFactory shapeFactory = new GeometricShapeFactory();//设置生成的类圆形边数shapeFactory.setNumPoints(32);//设置圆形中心点经纬度shapeFactory.setCentre(new Coordinate(x, y));//设置圆形直径shapeFactory.setSize(radiusDegree * 2);//使用工厂类生成圆形Polygon circle = shapeFactory.createCircle();return circle;}

输入参数为:中心点经纬度、长轴长度(米)、短轴长度(米)、长轴和X轴夹角(度)。
首先将长轴和短轴转换为经纬度,
然后将夹角转换为弧度,
为GeometricShapeFactory工厂类设置相关属性,生成Geometry椭圆对象。

    /*** 根据中心点经纬度、长轴、短轴、角度生成椭圆* @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);//设置中心点shapeFactory.setCentre(new Coordinate(x,y));//设置长轴长度shapeFactory.setWidth(macroaxisDegree);//设置短轴长度shapeFactory.setHeight(brachyaxisDegree);//设置长轴和X轴夹角shapeFactory.setRotation(radians);//生成椭圆对象Polygon ellipse = shapeFactory.createEllipse();return ellipse;}

输入参数:中心点经纬度、扇形半径(米)、起始角度、终止角度;
首先将半径转换为经纬度度数,
然后将起始角度和终止角度转换为弧度,
为GeometricShapeFactory工厂类设置相关属性,生成Geometry扇形对象。

      /*** 根据中心点经纬度、半径、起止角度生成扇形* @param x 经度* @param y 纬度* @param radius 半径(公里)* @param bAngle 起始角度(X轴正方向为0度,逆时针旋转)* @param eAngle 终止角度* @param pointsNum 点数(往上参考可以给32)* @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);//设置点数shapeFactory.setNumPoints(pointsNum);//设置中心点经纬度shapeFactory.setCentre(new Coordinate(x, y));//设置直径shapeFactory.setSize(radiusDegree * 2);//传入起始角度和扇形夹角,生成扇形Polygon sector = shapeFactory.createArcPolygon(bAngleRadian,angleRadian);return sector;}

效果展示



三、判断线段与图形是否相交

先创建一个线段对象:

String lineStr = "LINESTRING(123.22 35.22,127.32 38.23)";
WKTReader wktReader = new WKTReader();
LineString line = (LineString) wktReader.read(strLine);

然后通过线段对象的方法来判断:

//判断线段是否包含在椭圆中
line.within(ellipse)
//判断线段与椭圆是否相交
line.crosses(ellipse)

其他形状同理。

地理信息-圆形、椭圆、扇形的表示方法及相关判断相关推荐

  1. Android绘图机制(二)——自定义View绘制形, 圆形, 三角形, 扇形, 椭圆, 曲线,文字和图片的坐标讲解

    Android绘图机制(二)--自定义View绘制形, 圆形, 三角形, 扇形, 椭圆, 曲线,文字和图片的坐标讲解 我们要想画好一些炫酷的View,首先我们得知道怎么去画一些基础的图案,比如矩形,圆 ...

  2. 光子筛matlab,一种振幅调制器件产生椭圆涡旋光的方法与流程

    本发明涉及衍射光学领域,具体涉及一种振幅型仿螺旋光子筛. 背景技术: 所谓涡旋光束即具有连续螺旋相位的光束,换句话说,光束的波阵面既不是平面,也不是球面,而是像旋涡状,具有奇异性.涡旋光束具有柱对称的 ...

  3. 【sketchup 2021】草图大师的基础使用【矩形与橡皮擦、直线与圆、手绘线与多边形、圆形与扇形、推拉工具】

    文章目录 矩形与橡皮擦 矩形普通使用 矩形进阶使用[画立面和分割面] 擦除 连续擦除 选中后不想删除了... 隐藏/显示边线 柔化边线/取消柔化 另一种擦除:删除 直线与圆 直线工具 鼠标绘制 默认绘 ...

  4. Flutter实现圆形头像的几种方法

    Flutter的ClipRect的使用场景 ClipRect可以用来裁剪容器内部的子元素,以避免超出容器的范围而溢出.常见的应用场景有: 将一个图像裁剪成不同形状,如圆形.方形.椭圆等: 将一个复杂的 ...

  5. Android实现圆形图像的两种方法(Glide和Picasso)

    Android实现圆形图像的两种方法 先上效果图 Glide Picasso CircleTransform.java(圆形图片工具类) 先上效果图 Glide 在app的build.gradle中引 ...

  6. matlab 随机骨料程序,基于matlab的混凝土三维圆形骨料模型随机投放方法.pdf

    一试验研究 斑楚遽1村 2Ol2年 基于matlab的混凝土三维圆形骨料模型 随机投放 方法 张海波 ,.何军拥. (1.广州航海高等专科学校,广东 广州 510330:2.广东工贸职业技术学院,广东 ...

  7. matlab 随机骨料程序,基于matlab的混凝土三维圆形骨料模型随机投放方法

    2012 年■ 试验研究 基于 matlab 的混凝土三维圆形骨料模型随机投放方法 张海波 1,何军拥 2 (1.广州航海高等专科学校,广东广州 510330: 2.广东工贸职业技术学院,广东广州 5 ...

  8. 基于C/C++的椭圆等间距离散方法

    基于C/C++的椭圆等间距离散方法 参考文档与博客: https://blog.csdn.net/baidu_38621657/article/details/87907829 https://blo ...

  9. 山东省地理信息时空大数据中心建设方法

    山东省地理信息时空大数据中心建设方法 刘现印 山东省国土测绘院,山东 济南 250013 摘要:大数据时代对地理信息数据管理.应用和服务提出了新的要求.分析了我国地理信息数据管理及应用存在的问题,以山 ...

最新文章

  1. 【研究】大脑如何在“知道”与“无知”之间做出决定
  2. go语言编程之字符串操作
  3. Linux中将pip 源切换至国内镜像~亲测可用
  4. 在Dictionary使用foreach的注意
  5. 这份网约车安全乘车指南,请务必收下!
  6. Asp.net高效导出excel篇之Aspose导出excel
  7. 路由器的四根指针怎么放?
  8. Volume Shadow Copy Service(VSS)如何工作
  9. 啊哈算法—解救小哈(深度优先搜索)
  10. Docker基本管理--docker基本操作、镜像制作方法、私有仓库搭建、端口映射、容器互联、数据卷与数据卷容器
  11. 光标快速移动到文档尾部_在Word文档中,把光标移动到文件尾部的快捷键是__________。...
  12. verilog刷题笔记007
  13. 【干货】旺季营销婚纱摄影行业这么做广告,转化效果能提高50%!
  14. web全栈工程师技能介绍
  15. 华为手机录制屏幕视频的详细操作
  16. 常见的电脑运行卡顿原因及解决方法
  17. day08 操作索引脏读、幻读、不可重复读 python复习
  18. MySQL TRUNCATE
  19. Markdown / KaTex数学公式汇总
  20. PowerBuilder中图片文件的处理

热门文章

  1. Java并发(五)——锁
  2. 西瓜书+实战+吴恩达机器学习(十七)规则学习(序贯覆盖)
  3. 西瓜书+实战+吴恩达机器学习(十一)监督学习之集成学习
  4. D37 682. Baseball Game
  5. [bzoj 2768][bzoj 1877]
  6. LeetCode刷题(39)--Set Matrix Zeros
  7. LeetCode刷题(28)
  8. android studio生产签名文件,Android Studio生成keystore签名文件步骤讲解
  9. jupyter notebook 安装教程
  10. Eclipse快速创建Bottom Up类型的Web Service服务端