如何使用 GeoTools 创建具有纬度、经度和半径的圆?

2024-02-04

现在我有:

Polygon circle = geometryBuilder.circle(
myLong,
myLat, 
radiusInMeters, 10);

它创建(纬度=28.456306,长=-16.292034,半径=500)一个具有巨大纬度和经度的无意义多边形,例如:

POLYGON ((483.678055 28.482505000000003, 388.1865521874737 -265.4101211462366, 138.1865521874737 -447.04575314757676, -170.8304421874737 -447.0457531475768, -420.8304421874737 -265.41012114623663, -516.321945 28.482504999999943, -420.83044218747375 322.3751311462365, -170.8304421874738 504.01076314757677, 138.18655218747358 504.0107631475768, 388.18655218747364 322.3751311462367, 483.678055 28.482505000000003))

我期望在我提供的中心点附近有十对带有经纬度的坐标。

任何帮助都会更有帮助。提前致谢!

EDIT

除了@iant的答案之外,我还必须创建一个Point as a Feature

//build the type
SimpleFeatureType TYPE = null;
try {
    TYPE = DataUtilities.createType("", "Location", "locations:Point:srid=4326," + "id:Integer" // a
            // number
            // attribute
            );
} catch (Exception e1) {
    // TODO Auto-generated catch block
    e1.printStackTrace();
}

SimpleFeatureBuilder featureBuilder = new SimpleFeatureBuilder(TYPE);
GeometryFactory geometryFactory = JTSFactoryFinder.getGeometryFactory();
com.vividsolutions.jts.geom.Point point = geometryFactory.createPoint(
        new Coordinate(
                currentDevicePosition.getLongitude(), 
                currentDevicePosition.getLatitude()
                )
        );
featureBuilder.add(point);
SimpleFeature feature = featureBuilder.buildFeature( "fid.1" ); // build the 1st feature

正如iant的要点中所解释的:https://gitlab.com/snippets/17558 https://gitlab.com/snippets/17558和这里:http://docs.geotools.org/ http://docs.geotools.org/,哦,而且我还缺少一个依赖项,如此处解释的java中的Schema异常 https://stackoverflow.com/questions/19356113/schemaexception-in-java


对此有两种解决方案:

  1. 将半径(米)转换为度并将问题视为平面问题

  2. 将纬度/经度点转换为米,计算局部平面投影中的圆,然后重新投影回纬度/经度。

对于 1 ,你可以做类似的事情,这对于赤道附近的小半径来说是很好的:

GeodeticCalculator calc = new  GeodeticCalculator(DefaultGeographicCRS.WGS84);
  calc.setStartingGeographicPoint(point.getX(), point.getY());
  calc.setDirection(0.0, 10000);
  Point2D p2 = calc.getDestinationGeographicPoint();
  calc.setDirection(90.0, 10000);
  Point2D p3 = calc.getDestinationGeographicPoint();

  double dy = p2.getY() - point.getY();
  double dx = p3.getX() - point.getX();
  double distance = (dy + dx) / 2.0;
  Polygon p1 = (Polygon) point.buffer(distance);

我将展示第二个的一些代码,因为它更通用(即它工作得更好并且半径范围更大)。

首先需要找到本地投影,GeoTools提供了“伪”投影AUTO42001,x,y这是以 X,Y 为中心的 UTM 投影:

public SimpleFeature bufferFeature(SimpleFeature feature, Measure<Double, Length> distance) {
    // extract the geometry
    GeometryAttribute gProp = feature.getDefaultGeometryProperty();
    CoordinateReferenceSystem origCRS = gProp.getDescriptor().getCoordinateReferenceSystem();

    Geometry geom = (Geometry) feature.getDefaultGeometry();
    Geometry pGeom = geom;
    MathTransform toTransform, fromTransform = null;
    // reproject the geometry to a local projection
    if (!(origCRS instanceof ProjectedCRS)) {

      double x = geom.getCoordinate().x;
      double y = geom.getCoordinate().y;

      String code = "AUTO:42001," + x + "," + y;
      // System.out.println(code);
      CoordinateReferenceSystem auto;
      try {
        auto = CRS.decode(code);
        toTransform = CRS.findMathTransform(DefaultGeographicCRS.WGS84, auto);
        fromTransform = CRS.findMathTransform(auto, DefaultGeographicCRS.WGS84);
        pGeom = JTS.transform(geom, toTransform);

      } catch (MismatchedDimensionException | TransformException | FactoryException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
      }

    }

So now pGeom是以米为单位的点。缓冲现在很容易

  Geometry out = bufferFeature(pGeom, distance.doubleValue(SI.METER)); 

然后我们使用之前查找的反向变换投影回 WGS84(纬度/经度):

  retGeom = JTS.transform(out, fromTransform); 

然后,需要稍微修改一下要素类型,以反映我们返回的是多边形而不是点的事实。完整代码在此gist https://gitlab.com/snippets/17558.

当我运行它时,我得到以下输出:

POINT (10.840378413128576 3.4152050343701745)
POLYGON ((10.84937634426605 3.4151876838951822, 10.849200076653755 3.413423962919184, 10.84868480171117 3.4117286878605766, 10.847850322146979 3.4101670058279794, 10.846728706726902 3.4087989300555464, 10.845363057862208 3.407677033830687, 10.843805855306746 3.406844430298736, 10.84211693959797 3.406333115754347, 10.840361212705258 3.4061627400701946, 10.838606144204721 3.4063398515107184, 10.836919178768184 3.4068576449605277, 10.835365144548726 3.4076962232621035, 10.834003762019957 3.408823361646906, 10.832887348980522 3.410195745914279, 10.832058809914859 3.411760636805914, 10.831549986992338 3.4134578966399034, 10.831380436105858 3.4152223003379722, 10.831556675029052 3.416986042039048, 10.832071932633442 3.4186813409639054, 10.832906408849936 3.4202430463705085, 10.834028035422469 3.4216111414662183, 10.835393708241908 3.422733050021835, 10.836950943907517 3.4235656570147763, 10.838639896841123 3.424076965623486, 10.840395659406198 3.4242473268789406, 10.842150756595839 3.4240701947133396, 10.843837739370569 3.4235523773972796, 10.845391776937724 3.4227137757216988, 10.846753148314034 3.4215866180136185, 10.847869537398722 3.4202142214154887, 10.848698043354238 3.4186493270628633, 10.849206829051935 3.4169520731645546, 10.84937634426605 3.4151876838951822))
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何使用 GeoTools 创建具有纬度、经度和半径的圆? 的相关文章

  • 无法在 Android 10 中创建目录

    我无法在 android 10 中创建目录 它可以在 android Oreo 之前的设备上运行 我尝试了两种创建文件夹的方法 Using File mkdir File f new File Environment getExternal
  • Java Try Catch Final 没有 Catch 的情况下会阻塞

    我正在审查一些新代码 该程序只有一个 try 和一个 finally 块 既然排除了 catch 块 那么如果 try 块遇到异常或任何可抛出的内容 它如何工作 它直接进入finally块吗 如果 try 块中的任何代码可以引发已检查异常
  • 添加动态数量的监听器(Spring JMS)

    我需要添加多个侦听器 如中所述application properties文件 就像下面这样 InTopics Sample QUT4 Sample T05 Sample T01 Sample JT7 注意 这个数字可以多一些 也可以少一些
  • 禁用 Eclipse Java 调试器的热代码替换 [重复]

    这个问题在这里已经有答案了 可能的重复 如何在 Eclipse 中禁用热代码替换 https stackoverflow com questions 2594408 how do i disable hot code replace in
  • 如何使用 SimpleDateFormat 解析多种格式的日期

    我正在尝试解析文档中的一些日期 用户似乎以类似但不完全相同的格式输入了这些日期 以下是格式 9 09 9 2009 09 2009 9 1 2009 9 1 2009 尝试解析所有这些内容的最佳方法是什么 这些似乎是最常见的 但我想让我困扰
  • 来自数据库的 jfreechart 散点图

    如何使用java中的jfreechart绘制mysql数据库表中数据的散点图 我使用过 Swing 库 任何链接都会有帮助 我搜索了谷歌但找不到理解的解决方案 如果您有代码 请提供给我 实际上我确实做了条形图并使用 jfreechart 绘
  • Java:使用 HttpURLConnection 的 HTTP PUT

    如何执行 HTTP PUT 我正在使用的类似乎认为它正在执行 PUT 但端点将其视为我执行了 GET 我做错了什么吗 URL url new URL https HttpURLConnection conn HttpURLConnectio
  • Condition 接口中的 signalAll 与对象中的 notificationAll

    1 昨天我才问过这个问题条件与等待通知机制 https stackoverflow com questions 10395571 condition vs wait notify mechanism 2 我想编辑相同的内容并在我的问题中添加
  • 如何从 Retrofit2 获取字符串响应?

    我正在做 android 正在寻找一种方法来执行超级基本的 http GET POST 请求 我不断收到错误 java lang IllegalArgumentException Unable to create converter for
  • 如何获取 WebElement 的父级[重复]

    这个问题在这里已经有答案了 我试过了 private WebElement getParent final WebElement webElement return webElement findElement By xpath 但我得到
  • Java 服务器-客户端 readLine() 方法

    我有一个客户端类和一个服务器类 如果客户端向服务器发送消息 服务器会将响应发送回客户端 然后客户端将打印它收到的所有消息 例如 如果客户端向服务器发送 A 则服务器将向客户端发送响应 1111 所以我在客户端类中使用 readLine 从服
  • 隐式超级构造函数 Person() 未定义。必须显式调用另一个构造函数?

    我正在开发一个项目 但收到错误 隐式超级构造函数 Person 未定义 必须显式调用另一个构造函数 我不太明白它 这是我的人物课程 public class Person public Person String name double D
  • Cloudfoundry:如何组合两个运行时

    cloundfoundry 有没有办法结合两个运行时环境 我正在将 NodeJS 应用程序部署到 IBM Bluemix 现在 我还希望能够执行独立的 jar 文件 但应用程序失败 APP 0 bin sh 1 java not found
  • Linux 上有关 getBounds() 和 setBounds() 的 bug_id=4806603 的解决方法?

    在 Linux 平台上 Frame getBounds 和 Frame setBounds 的工作方式不一致 这在 2003 年就已经有报道了 请参见此处 http bugs java com bugdatabase view bug do
  • 将图像添加到自定义 AlertDialog

    我制作了一个 AlertDialog 让用户可以从我显示的 4 个选项中选择一个 前 3 个让他们在单击号码时直接拨打号码 第 4 个显示不同的视图 现在看起来是这样的 由于第四个选项的目的是不同的任务 我想让它看起来不同 因为用户可能会感
  • Java:拆箱整数时出现空指针异常?

    此代码导致空指针异常 我不知道为什么 private void setSiblings PhylogenyTree node Color color throws InvalidCellNumberException PhylogenyTr
  • 挂钩 Eclipse 构建过程吗?

    我希望在 Eclipse 中按下构建按钮时能够运行一个简单的 Java 程序 目前 当我单击 构建 时 它会运行一些 JRebel 日志记录代码 我有一个程序可以解析 JRebel 日志文件并将统计信息存储在数据库中 是否可以编写一个插件或
  • 哪个集合更适合存储多维数组中的数据?

    我有一个multi dimensional array of string 我愿意将其转换为某种集合类型 以便我可以根据自己的意愿添加 删除和插入元素 在数组中 我无法删除特定位置的元素 我需要这样的集合 我可以在其中删除特定位置的数据 也
  • JSON 到 hashmap (杰克逊)

    我想将 JSON 转换为 HashMapJackson http jackson codehaus org 这是我的 JSON String json Opleidingen name Bijz trajecten zorg en welz
  • JAXB - 列表<可序列化>?

    我使用 xjc 制作了一些课程 public class MyType XmlElementRefs XmlElementRef name MyInnerType type JAXBElement class required false

随机推荐

  • 让 Visual Studio 在每次构建时运行 T4 模板

    如何让 T4 模板在每次构建时生成输出 就像现在一样 只有当我对模板进行更改时 它才会重新生成它 我还发现了其他类似的问题 Visual Studio 中的 T4 转换和构建顺序 https stackoverflow com questi
  • Outlook 中的网址中的双斜杠

    您的搜索页面的 URL 是这样构建的 http www example com results name John city Miami gender Male这将显示迈阿密所有名为约翰的男性 当其中一个过滤器留空时 网址将如下所示 htt
  • 获取视频文件的尺寸

    python 有没有办法获取视频文件或其他库的尺寸来实现这一点 相当于一个Media Info或者其他的东西 如果我理解正确的话 你指的是视频的分辨率 例如 768x432 这可以简单地使用 python 中的 opencv 来完成 imp
  • 在 XmlDocument 中加载 xml 文件时出错

    您好 我有下面的 xml 文件 我正在尝试使用下面的代码将其加载到 xml 文档中 XmlDocument Doc new XmlDocument Doc LoadXml C MappingFiles InputFile xml 但它抛出错
  • 如何从我的应用程序打开网页?

    我想让我的 WPF 应用程序打开默认浏览器并转到某个网页 我怎么做 对于 NET 桌面版本 System Diagnostics Process Start http www webpage com 对于 NET Core 默认为Proce
  • C++ 中的自定义事件?

    是否可以在 C 中创建自定义事件 例如 假设我有变量 X 和变量 Y 每当 X 发生变化时 我想执行一个将 Y 设置为 3X 的函数 有没有办法创建这样的触发器 事件 触发器在某些数据库中很常见 这基本上是观察者模式的一个实例 正如其他人提
  • Pandas groupby 和多索引

    pandas 是否有机会通过 MultiIndex 对数据进行分组 我的意思是不仅传递给 groupby 函数键 还传递键和值来预定义数据帧列 a np array foo foo foo bar bar foo foo dtype obj
  • 未找到数据源名称且未指定默认驱动程序

    我被要求将使用 MVP 模式的 WinForms 应用程序移植到网页上 除其他外 该应用程序将 CSV 文件上传到数据表 然后执行一些工作 CSV文件上传到服务器OK然后用下面的代码读取 string connectionString Dr
  • 在函数作用域末尾执行代码的简单方法[重复]

    这个问题在这里已经有答案了 在测试代 码中 我偶尔想设置 模拟一些全局变量 在测试 范围结束时我想恢复这些变量 例如 BOOST AUTO TEST CASE HttpClientCsrf std string csrfSave Http
  • 反序列化 PHP 会话数据

    我正在使用 CodeIgniter 3 x 和数据库会话驱动程序 我想访问data列那BLOB类型 这是我的 blob 数据 ci last regenerate i 1435420891 identity s 13 email prote
  • 匿名共享内存?

    是否有一种 POSIX y 方法来分配不与特定文件名绑定的共享内存 IE 仅通过 UNIX 域套接字传递 SCM RIGHTS 消息才能在进程之间共享内存 None
  • Asp.net 单元测试中缺少对 System.Web.Mvc 的引用?

    我最近为我的 Asp NET MVC 应用程序做了一些单元测试 或者我尝试这样做 它一直告诉我 类型 System Web Mvc Controller 是在未引用的程序集中定义的 您必须添加引用程序集 System Web Mvc 版本
  • 在 AJAX 请求期间显示微调框?

    展示旋转器的最佳方式是什么 我准备了一个 div id spinner 它在加载过程中应该是可见的 你使用 jQuery 吗 如果是这样你可以使用 ajaxStart 和 ajaxStop http docs jquery com Ajax
  • 迭代 String.prototype

    我知道for in循环可以帮助迭代对象 原型和集合的属性 事实是 我需要迭代String prototype 虽然console log String prototype 当我这样做时显示完整的原型 for var prop in Stri
  • 如何在 ASP.Net 应用程序中使用 HTTPS

    我想在 ASP NET Web 应用程序中使用 HTTPS 但仅限于 Login aspx 页面 如何才能做到这一点 首先获取或创建证书 获取 SecureWebPageModule 模块http www codeproject com A
  • Fluent nhibernate:如何映射具有类型为接口的属性的实体?

    我有一个像这样的实体 public class Employee public int ID get set public IAccountManager AccountManager get set 我还为 DefaultAccountM
  • WP8.1 HttpClient Stream 仅获取 65536 字节数据

    我正在尝试在 Windows 运行时为 win8 1 和 wp8 1 的 MediaElement 编写一个实时 flv 流解复用器 我已经完成了解复用代码 flv 文件可以正确解复用为 h264 和 aac 标签数据 当我尝试播放网络文件
  • Xcode 斯威夫特。如何在基于视图的 NSTableView 中以编程方式选择单元格

    我可以单击一个单元格并编辑其内容 但是 可以通过编程方式选择单元格 而不是单击 选择单元格 基本上为单元格焦点提供准备编辑的机会 StackOverflow 上有人问了关于 UITableView 的同样问题 给出的答案是 let inde
  • 如何从 Python 执行程序? os.system 由于路径中的空格而失败[重复]

    这个问题在这里已经有答案了 我有一个Python脚本需要执行外部程序 但由于某种原因失败了 如果我有以下脚本 import os os system C Temp a b c Notepad exe raw input 然后它失败并出现以下
  • 如何使用 GeoTools 创建具有纬度、经度和半径的圆?

    现在我有 Polygon circle geometryBuilder circle myLong myLat radiusInMeters 10 它创建 纬度 28 456306 长 16 292034 半径 500 一个具有巨大纬度和经