【问题标题】:How to make compass point to my particular latitude longitude location based on my current location? [duplicate]如何根据我当前的位置使指南针指向我的特定纬度经度位置? [复制]
【发布时间】:2011-12-04 15:06:39
【问题描述】:

我正在开发一个 android 应用程序,我希望指南针指向特定的纬度经度位置,而不是通常的北方位置。任何人都可以建议如何实现这一点。我开发了一个指向北方的应用程序。
提前感谢如何实现这一点。任何这样做的演示应用程序都会有很大帮助。

【问题讨论】:

    标签: java android compass-geolocation


    【解决方案1】:

    您可以从here 实现简单的指南针。 它显然指向北方,但为了使指南针指向某个位置或坐标,您可以这样做。

    在你的activity中添加这个方法,它会找到两个坐标之间的方位。

        protected double bearing(double startLat, double startLng, double endLat, double endLng){
           double longitude1 = startLng;
           double longitude2 = endLng;
           double latitude1 = Math.toRadians(startLat);
           double latitude2 = Math.toRadians(endLat);
           double longDiff= Math.toRadians(longitude2-longitude1);
           double y= Math.sin(longDiff)*Math.cos(latitude2);
           double x=Math.cos(latitude1)*Math.sin(latitude2)-Math.sin(latitude1)*Math.cos(latitude2)*Math.cos(longDiff);
    
        return (Math.toDegrees(Math.atan2(y, x))+360)%360;
    }
    

    在 Compass 类的 onSensorChanged 方法中,这样做

    azimuth -= bearing(yourlatitude, yourlongitude, latWhereToPoint, lngWhereToPoint);
    

    latitude, longitude -> 您当前的纬度,经度 latWhereToPoint, lngWheretoPoint -> 你想指向的位置。

    最后你的 onSensorChanged 会是这样的。

    @Override
    public void onSensorChanged(SensorEvent event) {
        final float alpha = 0.97f;
    
        synchronized (this) {
            if (event.sensor.getType() == Sensor.TYPE_ACCELEROMETER) {
    
                mGravity[0] = alpha * mGravity[0] + (1 - alpha)
                        * event.values[0];
                mGravity[1] = alpha * mGravity[1] + (1 - alpha)
                        * event.values[1];
                mGravity[2] = alpha * mGravity[2] + (1 - alpha)
                        * event.values[2];
    
                // mGravity = event.values;
    
                // Log.e(TAG, Float.toString(mGravity[0]));
            }
    
            if (event.sensor.getType() == Sensor.TYPE_MAGNETIC_FIELD) {
                // mGeomagnetic = event.values;
    
                mGeomagnetic[0] = alpha * mGeomagnetic[0] + (1 - alpha)
                        * event.values[0];
                mGeomagnetic[1] = alpha * mGeomagnetic[1] + (1 - alpha)
                        * event.values[1];
                mGeomagnetic[2] = alpha * mGeomagnetic[2] + (1 - alpha)
                        * event.values[2];
                // Log.e(TAG, Float.toString(event.values[0]));
    
            }
    
            float R[] = new float[9];
            float I[] = new float[9];
            boolean success = SensorManager.getRotationMatrix(R, I, mGravity,
                    mGeomagnetic);
            if (success) {
                float orientation[] = new float[3];
                SensorManager.getOrientation(R, orientation);
                // Log.d(TAG, "azimuth (rad): " + azimuth);
                azimuth = (float) Math.toDegrees(orientation[0]); // orientation
                azimuth = (azimuth + 360) % 360;
    
                azimuth -= bearing(yourlatitude, yourlongitude, latWhereToPoint, lngWhereToPoint);
                // Log.d(TAG, "azimuth (deg): " + azimuth);
                adjustArrow();
            }
        }
    }
    

    【讨论】:

    • 轴承方法是我目前找到的最好的版本。我发现它不是 100% 准确的。你真的应该将结果四舍五入到 0 精度数字,因为它在度数的分数方面是不准确的。最好是整数。
    【解决方案2】:

    查看本教程。它应该让您朝着正确的方向开始Compass Tutorial 还有一个不错的Second Compass tutorial

    【讨论】:

    • 这些例子似乎没有回答这个问题。这些只是创建了一个指向北方的指南针,而不是自定义位置,不是吗?
    猜你喜欢
    • 1970-01-01
    • 2011-07-14
    • 2013-01-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多