- PVSM.RU - https://www.pvsm.ru -
Доброго времени суток. В нашем проекте так сложилось, что мы для нашей гео-вики стали использовать OSM а не GM. В ходе написания мобильного клиента под андроид был использован стандартный компонент MapView. Но, в ходе тестирования выявились расхождения в координатах OSM и GM, которые, в некоторых случаях, достигали 30 метров. Таким образом было решено переходить с карт гугла на OSM для чего и была найдена соответствующая библиотека osmdroid [1]. О том, как переехать на эту библиотеку, расскажу под катом.
/**
*
* @param x view coord relative to left
* @param y view coord relative to top
* @param vw MapView
* @return GeoPoint
*/
public static GeoPoint geoPointFromScreenCoords(int x, int y, MapView vw){
if (x < 0 || y < 0 || x > vw.getWidth() || y > vw.getHeight()){
return null; // coord out of bounds
}
// Get the top left GeoPoint
Projection projection = vw.getProjection();
GeoPoint geoPointTopLeft = (GeoPoint) projection.fromPixels(0, 0);
Point topLeftPoint = new Point();
// Get the top left Point (includes osmdroid offsets)
projection.toPixels(geoPointTopLeft, topLeftPoint);
// get the GeoPoint of any point on screen
GeoPoint rtnGeoPoint = (GeoPoint) projection.fromPixels(x, y);
return rtnGeoPoint;
}
/**
*
* @param gp GeoPoint
* @param vw Mapview
* @return a 'Point' in screen coords relative to top left
*/
public static Point pointFromGeoPoint(GeoPoint gp, MapView vw){
Point rtnPoint = new Point();
Projection projection = vw.getProjection();
projection.toPixels(gp, rtnPoint);
// Get the top left GeoPoint
GeoPoint geoPointTopLeft = (GeoPoint) projection.fromPixels(0, 0);
Point topLeftPoint = new Point();
// Get the top left Point (includes osmdroid offsets)
projection.toPixels(geoPointTopLeft, topLeftPoint);
rtnPoint.x-= topLeftPoint.x; // remove offsets
rtnPoint.y-= topLeftPoint.y;
if (rtnPoint.x > vw.getWidth() || rtnPoint.y > vw.getHeight() ||
rtnPoint.x < 0 || rtnPoint.y < 0){
return null; // gp must be off the screen
}
return rtnPoint;
}
В данный момент приложение проходит тестирование, в результате которого могут быть выявлены какие-то новые проблемы с этой библиотекой.
В ходе тестирования выяснилось, что если сначала выставлять координаты через setCenter(..), а потом приближать зум — попадали не в нужную точку (похоже на проблемы с точностью). В обратном случае всё работает отлично
Автор: Terranz
Сайт-источник PVSM.RU: https://www.pvsm.ru
Путь до страницы источника: https://www.pvsm.ru/android/6746
Ссылки в тексте:
[1] osmdroid: http://code.google.com/p/osmdroid/
[2] MarkerClusterer: http://code.google.com/p/android-playground-erdao/
Нажмите здесь для печати.