Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/219.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 自动完成矩形边界中的Android位置偏差_Java_Android_Autocomplete_Location - Fatal编程技术网

Java 自动完成矩形边界中的Android位置偏差

Java 自动完成矩形边界中的Android位置偏差,java,android,autocomplete,location,Java,Android,Autocomplete,Location,我希望自动完成结果显示距离用户位置仅1公里。 有一种使用矩形边界的方法: setLocationBias(RectangularBounds.newInstance( new LatLng(-33.880490, 151.184363), new LatLng(-33.858754, 151.229596))) 这里只有两点。它是如何形成一个长方形的 例如,如果用户Latlng是32.0000000,30.0000000,我如何在他周围做1公里的矩形边界 对于第一个问题,如果你看 矩形边界新实

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

setLocationBias(RectangularBounds.newInstance(
new LatLng(-33.880490, 151.184363),
new LatLng(-33.858754, 151.229596)))
  • 这里只有两点。它是如何形成一个长方形的

  • 例如,如果用户Latlng是32.0000000,30.0000000,我如何在他周围做1公里的矩形边界


  • 对于第一个问题,如果你看

    矩形边界新实例(拉特宁西南、拉特宁东北)

    是矩形的,因为它表示两个坐标:西南和东北,通常称为边界框(或缩写为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的圆外的点,您可以在返回结果或显示结果之前对结果进行过滤

    出于好奇


    我可以想到的另一种方法是将坐标的投影更改为另一个投影,以简化计算,如果将坐标转换为墨卡托坐标,则将1000添加到x值将增加1km,将1000添加到y值也将增加1km,因为它使用米作为单位,但随后应转换回(使用LatLng)因为它是api正在使用的一个,所以我认为它不值得,但它也应该可以工作。

    如果您查看

    矩形边界新实例(拉特宁西南、拉特宁东北)

    是矩形的,因为它表示两个坐标:西南和东北,通常称为边界框(或缩写为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的圆外的点,您可以在返回结果或显示结果之前对结果进行过滤

    出于好奇


    我可以想到的另一种方法是将坐标的投影更改为另一个投影,以简化计算,如果将坐标转换为墨卡托坐标,则将1000添加到x值将增加1km,将1000添加到y值也将增加1km,因为它使用米作为单位,但随后应转换回(使用LatLng)因为它是api正在使用的一个,所以我认为它不值得,但它也应该可以工作。

    我尝试过这样做:新的LatLng(this.currentlocation.getLatitude()+1000.0,this.currentlocation.getLatitude()+1000.0),新的LatLng(this.currentlocation.getLatitude())-1000.0,this.currentlocation.getLongitude()-1000.0)).build(this);startActivityForResult(意图、自动完成请求代码);但它崩溃了:(你知道我做错了什么吗?问题是如果你想要类似于1km的东西,这是错误的,latlng的单位与米无关,X轴的单位与Y轴的单位非常不同。这就是为什么我写了一个方法,通过纬度、经度和米来获得更高精度的东西ut崩溃我不知道您试图打开的目的是什么。是一个新活动吗?它在清单中定义了吗?您应该检查以了解是什么导致了崩溃所以您不能做+1000?我在这个.currentlocation中添加了一个坐标更新,并添加1000m以获得每个坐标。检查它。如果坐标在(不是在LatLng中)然后你可以做+1000,就像你做的那样,单位是米。这是我作为一个好奇在附加说明中试图说的。但既然不是,你应该执行投影的更改,我认为在这种情况下不值得。我试着这样做:新的LatLng(this.currentlocation.getLatitude()+1000.0,this.currentlocation.getLongitude()+1000.0),新LatLng(this.currentlocation.getLatitude()-1000.0,this.currentlocation.getLongitude()-1000.0))。构建(this);startActivityForResult(意图,自动完成请求代码);但它崩溃了:(知道我做错了什么吗?问题是,如果你想要类似于1km的东西,这是错误的,latlng的单位与米无关,X轴的单位与Y轴的单位非常不同。这就是为什么我写了一个方法,将经纬度和米传递给