我正在我的Rails应用视图中显示Google地图,并将使用标记/叠加层。
坐标数据将来自手机(GPS)并存储在我的Rails应用程序的数据库中。
问题是,我不希望在我的网页源中看到精确的纬度/经度...即我想标记一个大致的位置而不给出真正的纬度/经度。
如何舍入/截断纬度/经度值以使它们仍然准确(例如,在一英里内) - 但不是太准确?
(例如:你将如何围绕35.2827524,-120.6596156?)
答案 0 :(得分:9)
最简单的方法是将两个坐标四舍五入到一定数量的小数位,或者在坐标上添加随机抖动:
lat = Math.floor(lat*1000+0.5)/1000; (round within 0.001)
或
dither=0.001;
lat = lat + (Math.random()-0.5)*dither;
如果你真的想要在一定里程数内,你需要做更复杂的数学运算,可能是使用极坐标。
答案 1 :(得分:0)
查看我的解决方案,该解决方案不涉及随机数,并将在查询之间提供一致的结果:
答案 2 :(得分:0)
这可以相当简单地完成。如果您要四舍五入到网格,那么纬度会在地球上的所有点上以恒定量变化。根据你离赤道的距离,经度会有不同的变化。
以下代码将纬度和经度捕捉到任意网格大小
double EARTH_RADIUS_KM = 6371;
double GRID_SIZE_KM = 1.6; // <----- Our grid size in km..
double DEGREES_LAT_GRID = Math.toDegrees(GRID_SIZE_KM / EARTH_RADIUS_KM);
// ^^^^^^ This is constant for a given grid size.
public Location snapToGrid(Location myLoc) {
double cos = Math.cos(Math.toRadians(myLoc.latitude));
double degreesLonGrid = DEGREES_LAT_GRID / cos;
return new Location (
Math.round(myLoc.longitude / degreesLonGrid) * degreesLonGrid,
Math.round(myLoc.latitude / DEGREES_LAT_GRID) * DEGREES_LAT_GRID);
}
请注意,在您处于极点的情况下(当cos函数接近零时),这将失败。根据您的网格大小,当您接近+/- 90度的纬度时,结果将变得不可预测。处理这是一个留给读者的练习:)
答案 3 :(得分:-3)
尝试舍入到小数点后两位。