【问题标题】:Android Location Bias in autocomplete Rectangular Bounds自动完成矩形边界中的 Android 位置偏差
【发布时间】:2020-08-20 08:17:45
【问题描述】:

我希望自动完成结果显示距离用户位置仅 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?

【问题讨论】:

    标签: java android autocomplete location


    【解决方案1】:

    第一个问题,如果你看docs

    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))
    

    如果您仍然需要更精确的 1 公里距离并丢弃在该正方形 (bbox) 内但在半径为 1 公里的圆之外的点,您可以在返回结果或显示结果之前通过 checking the distance to the original point 过滤结果。

    出于好奇

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

    【讨论】:

    • 我尝试这样做:new LatLng(this.currentlocation.getLatitude()+1000.0, this.currentlocation.getLongitude()+1000.0), new LatLng(this.currentlocation.getLatitude()-1000.0 , this.currentlocation.getLongitude()-1000.0))) .build(this); startActivityForResult(意图,AUTOCOMPLETE_REQUEST_CODE);但它崩溃了:(知道我做错了什么吗?
    • 问题是如果你想要类似1km的东西这是错误的,latlng的单位与米无关,X轴的单位和Y轴的单位有很大不同。这就是为什么我写了一个方法来通过纬度和经度和米来获得更精确的东西
    • 关于崩溃我不知道你试图打开的意图是什么。是新活动吗?是否在清单中定义?您应该检查logcat 以了解导致崩溃的原因
    • 所以你不能+1000?
    • 我在 this.currentlocation 中添加了坐标更新,并添加了 1000m 以获取每个坐标。检查。如果坐标在mercator projection(不是LatLng),那么你可以按照你的方式做+1000,因为单位是米。这就是我想在临时演员中表达的好奇心。但既然他们不是你应该执行预测的变化,我认为在这种情况下它不值得。
    猜你喜欢
    • 2013-02-08
    • 2017-11-29
    • 1970-01-01
    • 2013-07-12
    • 1970-01-01
    • 2014-09-22
    • 1970-01-01
    • 1970-01-01
    • 2012-06-17
    相关资源
    最近更新 更多