Как заставить компас указывать на мое конкретное местоположение широты долготы на основе моего текущего местоположения? [дубликат]



На этот вопрос уже есть ответ здесь:



Я разрабатываю приложение для android, где я хочу, чтобы компас указывал на определенную широту и долготу вместо обычного Северного местоположения. Может кто-нибудь подсказать, как это осуществить. Я разработал приложение что указывает на северное направление.

Заранее спасибо за то, как это осуществить. Любое демонстрационное приложение, которое делает это, было бы очень полезно.

441   2  

2 ответов:

Ознакомьтесь с этим руководством. Это должно помочь вам начать работу в правильном направлении учебник по компасу Также Вот еще один хороший Второй компас учебник

Вы можете реализовать простой компас изздесь . Он явно указывает на север, но для того, чтобы компас указывал на определенное место или координаты, вы можете сделать что-то вроде этого.

Добавьте этот метод в свою деятельность, он находит пеленг между двумя координатами.
    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;
}

В методе onSensorChanged в классе Compass выполните следующее

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

Широта, долгота - > ваша текущая широта, долгота 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();
        }
    }
}

Comments

    Ничего не найдено.