使用 GeoTools 计算两点之间的大距离

2023-12-07

GeoTools 和 GIS 新手,我正在尝试使用 GeoTools 库计算孟买和德班之间的距离。我正在接近小距离的准确结果,但是当我去更大的距离时,计算结果偏离了 2000 公里,我不完全理解 CRS 系统。下面是我计算孟买和德班之间距离的代码

    Coordinate source = new Coordinate(19.0760, 72.8777);   ///Mumbai Lat Long
    Coordinate destination1 = new Coordinate(-29.883333, 31.049999); //Durban Lat Long

    GeometryFactory geometryFactory = new GeometryFactory();
    Geometry point1 = geometryFactory.createPoint(source);
    Geometry point2 = geometryFactory.createPoint(destination1);

    CoordinateReferenceSystem auto = auto = CRS.decode("AUTO:42001,13.45,52.3");
    MathTransform transform = CRS.findMathTransform(DefaultGeographicCRS.WGS84, auto);

    Geometry g3 = JTS.transform(point1, transform);
    Geometry g4 = JTS.transform(point2, transform);

    double distance = g3.distance(g4);

这就是当你从 stackexchange 盲目复制代码时会发生的情况问题没有阅读question它基于哪个解释了原因。

我一直回答这个问题(并且发布这样的代码)提问者试图使用以度为单位的纬度/经度坐标来测量以米为单位的短距离。您问题中显示的技巧会创建一个自动 UTM 投影,以“AUTO:42001”位(在您的情况下为 52N 13E)之后指定的位置为中心 - 这需要是您感兴趣的区域的中心,因此在您的无论如何,这些值可能是错误的。

But您对孟买到德班的一个小区域不感兴趣,这是绕地球的一条重要路线,因此您需要考虑到地球表面的曲率。此外,您也不会尝试做一些困难的事情,而 JTS 是唯一的进程来源(例如缓冲)。在这种情况下,您应该使用GeodeticCalculator它使用 C. F. F. Karney, Algorithms for geodesics, J. Geodesy 87, 43–55 (2013) 的库考虑地球的形状。

无论如何,足够的解释将来没有人会读,这里是代码:

  public static void main(String[] args) {
    DefaultGeographicCRS crs = DefaultGeographicCRS.WGS84;
    if (args.length != 4) {
      System.err.println("Need 4 numbers lat_1 lon_1 lat_2 lon_2");
      return;
    }
    GeometryFactory geomFactory = new GeometryFactory();
    Point[] points = new Point[2];
    for (int i = 0, k = 0; i < 2; i++, k += 2) {
      double x = Double.valueOf(args[k]);
      double y = Double.valueOf(args[k + 1]);
      if (CRS.getAxisOrder(crs).equals(AxisOrder.NORTH_EAST)) {
        System.out.println("working with a lat/lon crs");
        points[i] = geomFactory.createPoint(new Coordinate(x, y));
      } else {
        System.out.println("working with a lon/lat crs");
        points[i] = geomFactory.createPoint(new Coordinate(y, x));
      }

    }

    double distance = 0.0;

    GeodeticCalculator calc = new GeodeticCalculator(crs);
    calc.setStartingGeographicPoint(points[0].getX(), points[0].getY());
    calc.setDestinationGeographicPoint(points[1].getX(), points[1].getY());

    distance = calc.getOrthodromicDistance();
    double bearing = calc.getAzimuth();

    Quantity<Length> dist = Quantities.getQuantity(distance, SI.METRE);
    System.out.println(dist.to(MetricPrefix.KILO(SI.METRE)).getValue() + " Km");
    System.out.println(dist.to(USCustomary.MILE).getValue() + " miles");
    System.out.println("Bearing " + bearing + " degrees");
  }

Giving:

working with a lon/lat crs
POINT (72.8777 19.076)
POINT (31.049999 -29.883333)
7032.866960793305 Km
4370.020928274692 miles
Bearing -139.53428618565218 degrees
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 GeoTools 计算两点之间的大距离 的相关文章

随机推荐

  • 使用 RxJS 和 twitter-stream-api 模块订阅流

    好吧 我是 Rx 的初学者 不幸的是 我对 js 和 js 中的流也很陌生 我用这个https github com trygve lie twitter stream api连接到 Twitter 流 api 并接收带有推文的 json
  • 在 OpenCV 中求椭圆的成本

    我正在使用基于的代码这个例子并想知道是否有任何方法可以找出椭圆拟合的 好 程度 我有一些椭圆 它们只非常适合我的数据 我想去掉它们 而有些椭圆几乎是完美的 我想保留非常合身的款式 去掉不合身的款式 我怎样才能做到这一点opencv 您可以在
  • 无法将类型“System.Windows.Forms.Control”转换为“T”

    我正在尝试创建通用 FindControl 方法 但出现以下错误 无法将类型 System Windows Forms Control 转换为 T Code public T Control
  • Heroku 静态文件未加载,Django

    我正在努力推动我的 Django 项目到 Heroku 但它没有加载静态文件 I used this设置这些东西 一切都很好 但我无法解决静态文件的问题 我的目录结构是这样的 help the needy help the needy in
  • 为什么附加到小书签中的innerHTML 会覆盖整个页面?

    我有这个小书签 javascript document getElementsByTagName div 0 innerHTML Chuck Norris 现在很明显supposed采取第一个div在页面上 并将 Chuck Norris
  • 将 MKMapView 上的距离转换为 UIView 的距离

    如何将 MKMapView 上的距离 例如 400 米 转换为 UIView 的距离 我想显示取决于 MKMapView 上当前缩放级别的 MKAnnotationView 首先 创建一个长度为 400 米的区域 MKCoordinateR
  • 我无法在 Android 中从 GCM onMessage 打开对话框

    当使用谷歌云消息发送消息到我的android应用程序时 我不知道如何打开是或否对话框 如javasrcript确认框 如果他们点击 是 则在浏览器中打开一个网站 如果点击 是 则不执行任何操作不 我花了太多时间 不愿意向您展示这个基本代码
  • 动态路线的routes.rb中的Rails访问请求

    我们的网站应该允许显示与给定 url 相关的不同内容 类似于 wordpress 中的多站点 我们只有一个安装并根据 url 提供内容 因为有必要使用正确的语言来路由 所以我想使用 动态路由 方法来提供正确的内容 我现在的问题是 如果路由是
  • 在netbeans中使用Ant在构建过程中动态获取外部库的最新版本

    我真的是一个蚂蚁新手 这是我的问题 我在 netbeans 中有一个项目 它使用当前位于 lib 目录中的几个外部库 我希望我的 netbeans 在尝试构建项目时动态获取这些库的最新版本 这是可行的还是我走在完全错误的道路上 我有每个外部
  • AWS Lambda 使用 firebase-admin 初始化应用程序超时

    我使用 Lambda 到 Firebase 消息 我参考this 但 lambda 函数仍然超时 因为它无法连接到谷歌服务器 处理程序 js START imports const firebase require firebase adm
  • 通过 HTTPS 读取使用 HTTP 设置的 cookie

    使用HTTP设置的cookie可以使用HTTPS读取吗 仅当通过安全方式 HTTPS 连接时 浏览器才会发送使用 Secure 关键字设置的 Cookie 除此之外没有区别 如果不存在 secure 则 cookie 可能会通过不安全的连接
  • 使用 UIWebView 搜索以突出显示 PDF 中的文本

    我是 ios 开发的新手 我有 UIWebView 用于显示来自 URL 的 Pdf 页面文章 我需要搜索字符串或文本并突出显示 我无法使用 UIWebView 搜索并突出显示 PDF 中的文本 Pdf 加载正常 但搜索文本未突出显示 它仅
  • 用户点击时使用 JavaScript 将 HTML 页面导出为 PDF

    当用户单击 GeneratePDF 按钮时 我需要将 html 页面导出到 PDF 文件中 我成功地将 HTML 页面导出到 PDF 文件 但只有第一次单击时 我才能将数据下载到 PDF 文件中 但第二次单击后 我无法将数据下载到 PDF
  • 我可以将关联数组作为参数传递给 ReflectionMethod::invokeArgs 吗?

    是否可以将参数作为关联数组传递ReflectionMethod invokeArgs 这将允许我以与声明不同的顺序传递参数 例如 class A public function someMethod a b return sprintf a
  • iOS6 上的 IOHIDEventSystemCreate 失败

    IOHIDEventSystemCreate 在 iOS6 上始终返回 NULL 在 iOS5 上工作正常 有人知道为什么吗 iPhoneDevWiki 上的示例 include
  • 带管道的 Perl 正则表达式

    我不完全是一个 Perl 僧侣 所以如果你能帮助我理解这个正则表达式 如果它是一个 的作用是什么 my pathHere some path to file my pathThere some path pathHere s pathThe
  • 客户端-服务器同步模式/算法?

    我有一种感觉 一定存在客户端 服务器同步模式 但我完全没能在谷歌上找到一个 情况非常简单 服务器是中心节点 多个客户端连接并操作相同的数据 数据可以被分割成原子 如果发生冲突 服务器上的任何内容都具有优先权 以避免让用户陷入冲突解决 由于可
  • Keras模型输入形状错误

    我有一个 keras 模型 其布局如下 def keras model x train y train x test y test model Sequential model add Dense 128 input dim x train
  • Wordpress XML-RPC 和特色图像

    我目前正在为客户端开发一个插件 该插件每小时获取一个 xml feed 并将其发布到 wordpress 中 但我在将特色图像发送到帖子时遇到问题 我可以很好地发布到 WordPress 但我发布特色图像的所有尝试都失败了
  • 使用 GeoTools 计算两点之间的大距离

    GeoTools 和 GIS 新手 我正在尝试使用 GeoTools 库计算孟买和德班之间的距离 我正在接近小距离的准确结果 但是当我去更大的距离时 计算结果偏离了 2000 公里 我不完全理解 CRS 系统 下面是我计算孟买和德班之间距离