Подшипник GPS на какой шкале
В каком масштабе
location.getBearing()
возвращает угол, от 0 до 360 в градусах к востоку от северного направления или в каком-то другом масштабе.Должен ли курс моего телефона с истинным севером совпадать с этим направлением, если мой телефон расположен параллельно направлению движения?
Я рассчитываю азимут с SensorManager.getOrientation(rotationMatrix,vals)
функция и добавил склонение GPS к нему, чтобы получить устройство курс на истинный север.
2 ответа
Да, азимут измеряется (и доставляется) в градусах от истинного севера по часовой стрелке. Некоторые описывают это как градусы к востоку от севера. Диапазон составляет 0 - 359,9999. Так что 0 градусов это север.
2) Обратите внимание, что математические углы имеют 0° на востоке и увеличиваются против часовой стрелки. В зависимости от кода вы должны конвертировать между географическими углами в математические.
Дальнейшее объяснение 2): Если вы посмотрите на карту, то север направлен вверх, восток направо, это соответствует нашей 2-й декартовой системе координат, которую мы всегда использовали в школе:
Пространство x,y:
В этом пространстве положительное значение x находится в направлении вправо, которое является востоком на большинстве карт, положительное значение y в верхнем направлении или северное направление на картах, отрицательные значения - запад и юг.
При преобразовании координат долготы по широте в декартову x,y для использования более простой школьной математики, такой как вычисление углов, расстояния и т. Д., Необходимо учитывать, что все математические операции основаны на декартовой x,y мире. И в этом мире 0° в направлении положительной оси X (восток на карте). +90° (математический угол) в направлении у достижения. в то время как географическое направление +90 находится в восточном направлении, что обозначено x-achsis. Таким образом, математические углы поднимаются против часовой стрелки, а компасная роза (= геоиграфические углы) поднимается по часовой стрелке.
При трансформации между этими волдами вы должны учитывать это.
Однако для некоторых применений вам не нужно переходить между сферическим и декартовым миром, но, возможно, вам придется это делать при использовании датчиков ускорения и гироскопа.
Это то, что я сделал, вы можете сослаться на этот код.
onSensorChanged
@Override
public void onSensorChanged(SensorEvent event) {
// TODO Auto-generated method stub
if (event.sensor.getType() == Sensor.TYPE_MAGNETIC_FIELD)
mGeomagnetic = event.values;
if (event.sensor.getType() == Sensor.TYPE_ACCELEROMETER)
mGravity = event.values;
if (mGravity != null && mGeomagnetic != null) {
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);
azimut = orientation[0]; // orientation contains:
// azimut, pitch and roll
rotateCompass(azimut);
}
}
}
Рассчитать подшипник
private void rotateCompass(final float azimut) {
float azimuth = (float) Math.round(Math.toDegrees(azimut));
Location currentLoc = new Location("");
currentLoc.setLatitude(curr_lat);
currentLoc.setLongitude(curr_long);
Location target = new Location("");
target.setLatitude(dest_lat);
target.setLongitude(dest_lng);
float bearing = currentLoc.bearingTo(target); // (it's already in degrees)
if (bearing < 0) {
bearing = bearing + 360;
}
float direction = (float) (bearing - azimuth);
// If the direction is smaller than 0, add 360 to get the rotation clockwise.
if (direction < 0) {
direction = direction + 360;
}
showToast("" + direction);
rotateImageView(imgCompass, R.drawable.pin_finder, direction);
}
Повернуть изображение в соответствии с направлением в градусах
private void rotateImageView(ImageView imageView, int drawable, float rotate) {
// Decode the drawable into a bitmap
Bitmap bitmapOrg = BitmapFactory.decodeResource(getResources(),
drawable);
// Get the width/height of the drawable
DisplayMetrics dm = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(dm);
int width = bitmapOrg.getWidth(), height = bitmapOrg.getHeight();
// Initialize a new Matrix
Matrix matrix = new Matrix();
// Decide on how much to rotate
rotate = rotate % 360;
// Actually rotate the image
matrix.postRotate(rotate, width, height);
// recreate the new Bitmap via a couple conditions
Bitmap rotatedBitmap = Bitmap.createBitmap(bitmapOrg, 0, 0, width,
height, matrix, true);
// BitmapDrawable bmd = new BitmapDrawable( rotatedBitmap );
// imageView.setImageBitmap( rotatedBitmap );
imageView.setImageDrawable(new BitmapDrawable(getResources(),
rotatedBitmap));
imageView.setScaleType(ScaleType.CENTER);
}