【问题标题】:Convert Latitude and Longitude values to a custom sized grid将纬度和经度值转换为自定义大小的网格
【发布时间】:2014-08-04 08:18:39
【问题描述】:

我正在制作一个 java 程序,它将一组 lat/lng 坐标分类为自定义大小的特定矩形,因此实际上,将地球表面映射到自定义网格中并能够识别哪个矩形/多边形重点在于。

我正在研究的方法是使用地图投影(可能是墨卡托)。

例如,假设我想将 long/lat 分类为 100m x 100m 的“正方形”,

44.727549, 10.419704 和 44.727572, 10.420460 将分类到区域 X

44.732496、10.528092 和 44.732999、10.529465 将分类到区域 Y,因为它们之间的距离在 100m 以内。 (这当然假设它们位于同一边界内)

我不太担心失真,因为我不需要显示地图,但我确实需要能够判断一组坐标属于哪个多边形。

这可能吗?欢迎任何建议。谢谢。

编辑

省略极点的投影也是可接受的损失

【问题讨论】:

  • 您可能不担心失真,但您需要担心两极的边缘情况。
  • 我正在做一些非常相似的事情。你实施了吗?你能分享一些代码示例吗?
  • @performanceuser 刚刚为您发布了答案
  • 您可能想要使用的是en.wikipedia.org/wiki/Military_Grid_Reference_System。 MGRS 是为基于位置的数据实现缓存的有效关键,这就是我假设您的最终目标。

标签: java map projection


【解决方案1】:

这是我的最终解决方案(在 PHP 中),为每平方 100m 创建一个 bin:

function get_static_pointer_table_id($lat, $lng)
{
    $earth_circumference = 40000; // km

    $lat_bin = round($lat / 0.0009);
    $lng_length = $earth_circumference * cos(deg2rad($lat));
    $number_of_bins_on_lng = $lng_length * 10;
    $lng_bin = round($number_of_bins_on_lng * $lng / 360);
    //the 'bin' unique identifier
    return $lat_bin . "_" . $lng_bin;

}

【讨论】:

    【解决方案2】:

    如果我理解正确,您正在寻找

    1. 一种将地球表面划分为大约 100m x 100m 正方形的方法
    2. 一种找到点所在正方形的方法

    问题 1 对正方形来说是不可能完成的任务,但对于多边形则更是如此。创建多边形的一种非常简单的方法是使用坐标本身。如果每个多边形的纬度和经度为 0.0009°,赤道上将有大约 100m x 100m 的正方形网格,靠近两极的地方切片会变得很薄。

    问题 2 取决于用于解决上述挑战的近似值。如果您使用上面非常简单的方法,那么将每个坐标放入 bin 中只是除以 0.0009(并向下舍入到最接近的整数)。

    所以,首先你必须决定你可以妥协什么。多边形中的面积相等、纵向距离相等、纬度距离相等等重要吗?多边形中有四个角很重要吗?在两极和赤道附近有相似或几乎相似的多边形是否重要?一旦您了解了应用程序设置的限制,选择投影就变得更容易了。

    【讨论】:

    • 我考虑过将纬度的一小部分四舍五入,但正如你所问的,这使得两极的面积非常小,而赤道的面积很大。我需要每个多边形的大小大致相同(大约 100m 就可以了),四个角不是必需的,但会让生活更轻松,所以形状不需要保持不变。两极本身(以及两边的几度)是可以否定的。感谢回复
    • 好吧。如果您可以在两极旁边折腾最后一个度数,并且如果您的网格不需要有公共节点(角点),那么有一个相对简单的方法。将地球的纬度除以 0.0009°。现在你有 200000 个条纹,每个 100 m 宽。将每个条纹分成 n 个正方形,其中 n 是条纹的长度(纬度的余弦)除以 100 m 并四舍五入到最接近的整数。因此,在赤道,您将有 400000 个正方形,在 60°,您将拥有 200000 个正方形。
    • 我将纬度划分为一个表示纬度0.0009的整数但是这句话如何“将每个条纹划分为n个正方形,其中n是条纹的长度(纬度的余弦)除以100 m 并四舍五入到最接近的整数”工作?这种方法没有提到以任何方式解析经度。你能举一个长/纬度的具体例子吗?干杯。
    • 我们试试吧。如果纬度是 60.127,它在 60.1269 和 60.1278 之间(条带的中心在 60.12735。这个经度的长度是 40 000 km x cos(60.12735°) = 19922.95 km,所以应该有 199230 个 bin。知道后这个,取格林威治以西的经度(比如 56.234°),计算 56.234° / 360° x 199230 = 31120.83,即 bin 编号 31120.83。
    • 另外,如果你能接受这样一个事实,即你有几个(几十万分之一)矩形比其他矩形小,你可以使用简单的数学:经度 x cos(纬度) x 40000 km / 100 m 并将其向下舍入(或最近或向上或任何地方)。
    【解决方案3】:

    您在这里尝试做的是投影到椭圆体的平面上。因此,只要您的点靠得很近,而且,您不介意回答稍有错误,您就可以假设您的投影平面与您的点集合的中心相交,并且,纬度和经度的每个度数都是恒定的米数。那么问题就是简单的平面计算。

    当然,这是错误的。我实际上建议您查看地图投影,选择一个有意义的,然后去做。请记住,您可以将投影的中心移动到您的一组点的中心,这将减少失真。

    我怀疑 PROJ.4 可能会在库方面对您有所帮助。还必须有一个好的 Java,但这不是我的专长。

    最后你可以假设地球是一个球体并在球体上进行计算。或者,如果你真的想把它弄对,你可以选择一个标准的地球椭球并对其进行计算。

    【讨论】:

      猜你喜欢
      • 2021-09-26
      • 2022-10-18
      • 2017-10-01
      • 1970-01-01
      • 2022-11-26
      • 1970-01-01
      • 1970-01-01
      • 2021-10-20
      • 2010-11-11
      相关资源
      最近更新 更多