将纬度和经度值转换为自定义大小的网格

时间:2014-06-13 17:37:23

标签: java map projection

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

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

例如,假设我想将long / lat分类为100m x 100m的'square',

44.727549,10.419704和44.727572,10.420460将归类为X区

44.732496,10.528092和44.732999,10.529465将分类为区域Y,因为它们相距100米。 (这假设它们当然位于同一边界内)

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

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

修改

忽略杆的投射也是可接受的损失

3 个答案:

答案 0 :(得分:4)

这是我的最终解决方案(在PHP中),为每平方米100米创建一个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;

}

答案 1 :(得分:1)

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

  1. 一种将地球表面划分为大约100m×100m正方形的方法
  2. 找到一个点所在的正方形的方法
  3. 问题1是使用正方形不可能执行的任务,但使用多边形则不太可能。创建多边形的一种非常简单的方法是使用坐标本身。如果每个多边形在纬度和经度上都是0.0009°,那么在赤道上将有大约100m×100m的方格,放置的切片将变得非常接近极点。

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

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

答案 2 :(得分:1)

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

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

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

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