首页 > 解决方案 > 自动完成矩形边界中的 Android 位置偏差

问题描述

我希望自动完成结果显示距离用户位置仅 1 公里。RectangularBounds 有一种方法:

setLocationBias(RectangularBounds.newInstance(
new LatLng(-33.880490, 151.184363),
new LatLng(-33.858754, 151.229596)))
  1. 这里只有2点。它是如何制作一个矩形的?

  2. 如果用户 Latlng 是例如 32.0000000, 30.0000000 ,我怎样才能在他周围做一个 1 公里的 RectangularBounds?

标签: javaandroidautocompletelocation

解决方案


对于第一个问题,如果您查看文档

RectangularBounds newInstance(LatLng 西南,LatLng 东北)

是矩形的,因为它代表两个坐标:西南和东北,通常称为边界框(或缩写为 bbox)并表示这两个坐标内的区域。

第二个问题不那么简单,有不止一种方法可以做到。

一种方法是找到一种将距离添加到坐标的方法,这种方法总是近似的。对于这个 LatLng 地理坐标,您可以使用:

public static LatLng getCoordinate(double lat0, double lng0, long dy, long dx) {
    double lat = lat0 + (180 / Math.PI) * (dy / 6378137);
    double lng = lng0 + (180 / Math.PI) * (dx / 6378137) / Math.cos(lat0);
    return new LatLng(lat, lng);
}

其中 lat0 和 long0 是原始坐标,dx 和 dy 是以米为单位的距离(因为地球半径以米为单位设置 6378137)。

现在您可以创建一个原始点 +- 1000 米的近似边界框。假设您设置为起点的点位于纬度 -33.869622 和经度 151.206979,bbox 将是:

RectangularBounds.newInstance(
    getCoordinate(-33.869622, 151.206979, -1000, -1000),
    getCoordinate(-33.869622, 151.206979, 1000, 1000))

那是您可以用于 api 调用的 bbox。

如果您有一个名为 currentlocation 的实例变量,它将是:

RectangularBounds.newInstance(
    getCoordinate(this.currentlocation.getLatitude(), this.currentlocation.getLongitude(), -1000, -1000),
    getCoordinate(this.currentlocation.getLatitude(), this.currentlocation.getLongitude(), 1000, 1000))

如果您仍然需要更精确的 1km 距离并丢弃该正方形 (bbox) 内但半径为 1km 的圆之外的点,您可以通过在返回结果或显示之前检查到原始点的距离来过滤结果.

作为好奇心

我能想到的另一种方法是将坐标的投影更改为另一个以使计算更容易,如果将坐标转换为墨卡托,x 值加 1000 会增加 1 公里,y 值加 1000 也会增加 1 公里,因为它使用米作为单位,但是您应该转换回原始投影(使用 LatLng),因为它是 api 正在使用的投影,所以我认为它不值得,但它也应该可以工作。


推荐阅读