Как заставить компас указывать на мое конкретное местоположение широты долготы на основе моего текущего местоположения? [дубликат]
На этот вопрос уже есть ответ здесь:
Я разрабатываю приложение для android, где я хочу, чтобы компас указывал на определенную широту и долготу вместо обычного Северного местоположения. Может кто-нибудь подсказать, как это осуществить. Я разработал приложение что указывает на северное направление.
Заранее спасибо за то, как это осуществить. Любое демонстрационное приложение, которое делает это, было бы очень полезно.
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