#java #android #google-maps-api-3
#java #Android #google-maps-api-3
Вопрос:
Буду ли я использовать стандартный map API? Причина, по которой я спрашиваю, заключается в том, что я хотел бы, чтобы карта была пользовательским изображением моего кампуса, которое я сделал в Photoshop. Я обнаружил, что кто-то в другом университете сделал нечто подобное. Как бы я мог создать что-то подобное?
http://s3.appbrain.com/screen?id=2110362890445967243amp;i=1
Должно ли что-то подобное быть отключено? Может ли оно по-прежнему указывать ваше текущее географическое местоположение? Спасибо.
Ответ №1:
Я делал это в прошлом, это не слишком сложно.
Забудьте о Map API. Вам просто нужно точно масштабированное изображение области, которую вы хотите нанести на карту.
Вам просто нужны долгота и широта четырех углов, а также ширина и высота изображения. Получив его, вы можете выполнить относительно простую математику для преобразования GPS-координат телефона в точки X, Y на изображении.
Я сделал это с мультяшным изображением Грант-парка в Чикаго для приложения Android Lollapalooza в 2010 году. На самом деле моя проблема была немного сложнее, потому что карта была сжата по вертикали и слегка сдвинута на несколько градусов, поэтому моя математика добавила, чтобы приспособиться к этому. Если вы просто создаете прямой снимок сверху, это должно быть довольно просто.
Вот служебная функция, которую я использовал для преобразования значений длины / широты в точку. Это будет не совсем то, что вам нужно, потому что у него были определенные значения, которые были связаны с изображением, которое я использовал, но, возможно, оно поможет вам двигаться в правильном направлении.
public static PointF GPSToMap(double latitude, double longitude,
double minLat, double minLon, double maxLat, double maxLon,
long width, long height, String xExpr, String yExpr)
{
double numerator;
double denominator;
numerator = latitude - minLat;
denominator = maxLat - minLat;
double x = width - ((numerator/denominator*width));
numerator = longitude - minLon;
denominator = maxLon - minLon;
double y = height - ((numerator/denominator*height));
Double dblX = new Double(x (y*0.434026)-((x-100)*0.180));
Double dblY = new Double(y*0.99);
MathEval math = new MathEval();
dblY = math.evaluate(yExpr); //-40
dblX = math.evaluate(xExpr); //-15
return new PointF(dblX.floatValue(), dblY.floatValue());
}
Комментарии:
1. Просто подумал, что я бы добавил, xExpr и yExpr, где строковые значения, состоящие из математической формулы. Это было сделано для того, чтобы, добравшись до Грант-парка, я мог прогуляться по парку, снять показания GPS и скорректировать свою математическую формулу на лету без необходимости повторного развертывания приложения.
2. Класс MathEval находится здесь www.softwaremonkey.org/Code/src/MathEval.java
3. Спасибо, что поделились этим кодом, он наверняка поможет людям.
4. К вашему сведению, мой класс MathEval недавно был значительно обновлен и улучшен.