Intereting Posts
Как написать запрос fql, чтобы перечислить друзей в определенном месте Увеличить интервал сетки в android ActionBar выбрасывает NullPointerException Есть ли безопасный способ управления ключами API? Как обращаться с намерением, у которого нет данных при первом вызове какого-либо действия? WebView с https loadUrl показывает пустую страницу Jenkins & Android эмулятор: эмулятор не запускался; сдаваться Устранение намерений для URL-адреса иногда является нулевым, генерирует исключение NullPointerException Обработчик событий с длинным нажатием OpenGL «Недопустимая операционная ошибка» После того, как функция glDrawElements на телефоне Android Разница между упакованным переключателем и разреженным переключателем dalvik opcode Метод add (int, Fragment, String) в типе FragmentTransaction не применим для аргументов (int, Fragment, String) Пользовательские разрешения Android – Marshmallow Как использовать пользовательские шрифты в DrawerLayout и NavigationView Как я могу безопасно управлять транзакциями транзакций в приложении на внешнем сервере?

Android – построение графика gps на пользовательской карте

У меня есть активность в моем приложении, где есть изображения, которые я использую в качестве карт. Если изображение «привязано к сетке» к картам google, тогда, когда я использую верхние левые и нижние правые углы карты, которые я получаю из googlemaps онлайн, я могу превратить пользователей gps в x и y на экране. Однако, если карта не «выравнивается по сетке» и находится под углом, чем значения, которые возвращает моя математика, позиция пользователя отключается от экрана. Очевидно, что мне не хватает части о том, как обрабатывать угол карты, поэтому, если кто-то может пролить свет на то, как это сделать, это будет очень полезно.

Я знаю, что мне нужно будет выяснить угол в радианах и сделать какое-то преобразование, но я не знаю, с чего начать. Это то, что я использую для получения x и y для построения на холсте до сих пор.

public double[] getPositionGPS(Location upperLeft, Location lowerRight, Location current){ try{ double hypotenuse = upperLeft.distanceTo(current); double bearing = upperLeft.bearingTo(current); double currentDistanceY = Math.cos(bearing * Math.PI / OneEightyDeg) * hypotenuse; // "percentage to mark the position" double totalHypotenuse = upperLeft.distanceTo(lowerRight); double totalDistanceY = totalHypotenuse * Math.cos(upperLeft.bearingTo(lowerRight) * Math.PI / OneEightyDeg); double currentPixelY = currentDistanceY / totalDistanceY * ImageSizeH; double hypotenuse2 = upperLeft.distanceTo(current); double bearing2 = upperLeft.bearingTo(current); double currentDistanceX = Math.sin(bearing2 * Math.PI / OneEightyDeg) * hypotenuse2; // "percentage to mark the position" double totalHypotenuse2 = upperLeft.distanceTo(lowerRight); double totalDistanceX = totalHypotenuse2 * Math.sin(upperLeft.bearingTo(lowerRight) * Math.PI / OneEightyDeg); double currentPixelX = currentDistanceX / totalDistanceX * ImageSizeW; return new double[]{currentPixelX, currentPixelY}; }catch(Exception e){ e.printStackTrace(); return new double[]{0,0}; } 

Возможно, я ошибаюсь, но думаю, что это способ получить угол поворота (или, может быть, 4 угла):

  1. Получите угол альфа между lowerRight и upperLeft. Я думаю, что это равно 180 - lowerRight.bearingTo(upperLeft) EDIT (это уравнение должно зависеть от квадранта экрана)
  2. Используйте координаты X, Y (экран), чтобы получить угол тета между гипотенузой и нижним краем. Я думаю (опять же) синус этого угла равен: (height) / ((height^2) + (width^2))^1/2
  3. Теперь угол поворота равен theta - alpha

Если вы хотите визуализировать это:

бла

Во-первых, сопоставьте свою координацию карты Google с вашим пользовательским изображением, как будто изображение НЕ под углом. Здесь вы в основном имеете дело с масштабированием и смещением. Предположим, что вы получите координату (x, y) .

Затем поверните координату в соответствии с этой матрицей: поверните точку вокруг источника . Поскольку вы уже знаете угол, вы знаете / можете вычислить координату центра, чтобы ваша пользовательская карта вращалась вокруг. Предположим, что это (a, b) . В частности:

1) превратите (0,0) карты (x, y) в (0,0) основе (0,0) , (xa, yb) ,

2) вращайтесь с использованием этой матрицы, и у вас есть новая координата (x', y') ,

3) верните его обратно (a, b) основе координат (x'+a, y'+b) .

Я не уверен, понял ли я ваш вопрос, но не можете ли вы получить (X, Y) местоположение из API, как это?

 // myMap is a GoogleMap instance and location is a Location instance Projection projection = myMap.getProjection(); LatLng latlng = new LatLng(location.getLatitude(), location.getLongitude()); Point pointInTheScreen = projection.toScreenLocation(latlng); 

Дополнительную информацию см. В API GoogleMap .

Да, вы можете нарисовать точки, которые не находятся на видимой карте. Обходите это, создавая LatLngBounds. Затем отобразите карту для LatLngBounds. Вы также можете переместить карту, чтобы отобразить LatLngBounds. Здесь нет ничего сложного в том, что нет тангенсов или склонов или гиперболической кривизны земли. Все, о чем заботится точка, находящаяся в градусах, не должна думать о вашем решении. Если вы повернете карту, точки будут поворачиваться вместе с ней. Поэтому добавьте свои точки на карту, найдите границы и наклоните камеру. Наклоните камеру назад, и все точки будут по-прежнему на экране! Это позволит вам начать все точки на экране.

Точно так же, как образцы получают ссылку на карту google.

 private void setUpMapIfNeeded() { // Do a null check to confirm that we have not already instantiated the // map. if (mMap == null) { // Try to obtain the map from the SupportMapFragment. // mMap = mMapFragment.getMap(); // // Check if we were successful in obtaining the map. // Try to obtain the map from the SupportMapFragment. mMap = ((SupportMapFragment) getSupportFragmentManager() .findFragmentById(R.id.map)).getMap(); // use the settings maptype // Check if we were successful in obtaining the map. if (mMap != null) { setUpMap(); } } } 

Давайте начнем поиск границ карты.

 import com.google.android.gms.maps.model.LatLng; import com.google.android.gms.maps.model.LatLngBounds; 

Поле для LatLngBounds и LatLngBounds.Builder

 private LatLngBounds bounds; private LatLngBounds.Builder myLatLngBuilder; 

Инициализировать LatLngBounds.Builder

 myLatLngBuilder = new LatLngBounds.Builder(); 

Для каждой точки вашей карты.

 LatLng myLatLng = new LatLng(latitude, longitude); myLatLngBuilder.include(myLatLng); 

Затем, когда ваши конечные точки добавления строят вашу границу.

 bounds = myLatLngBuilder.build(); 

Теперь у меня есть границы всех точек на моей карте, и я могу отобразить только эту область карты. Этот код я снял с образцов карты.

 final View mapView = getSupportFragmentManager().findFragmentById( R.id.map).getView(); if (mapView.getViewTreeObserver().isAlive()) { mapView.getViewTreeObserver().addOnGlobalLayoutListener( new OnGlobalLayoutListener() { @SuppressWarnings("deprecation") // We use the new method when supported @SuppressLint("NewApi") // We check which build version we are using. @Override public void onGlobalLayout() { if (Build.VERSION.SDK_INT < Build.VERSION_CODES.JELLY_BEAN) { mapView.getViewTreeObserver() .removeGlobalOnLayoutListener(this); } else { mapView.getViewTreeObserver() .removeOnGlobalLayoutListener(this); } mMap.moveCamera(CameraUpdateFactory .newLatLngBounds(bounds, 50)); } }); } 

Это, по существу, то, как мое приложение Bestrides KML Reader отображает карты, поэтому никакие очки не отображаются на экране.

Удачи Danny117

Вы можете использовать датчик магнитного поля (aka Compass), чтобы получить ориентацию устройства и с этим «выровнять по горизонтали» свой пользовательский вид на вашей карте.