Как работает функция «Мое местоположение» в Картах Google для мобильных устройств? - PullRequest
1 голос
/ 29 августа 2009

Я установил Google Maps Java 2 ME на моем Nokia N73 , который поддерживает API определения местоположения (JSR 179), но не имеет встроенного датчика GPS , Функция «Мое местоположение» работает правильно и способна точно определить мою позицию в городе.

Когда я попытался получить доступ к CellID, LAC и другим связанным данным, я получил нулевые значения. Так как же Карты могут рассчитать мою позицию? Это потому, что их приложение подписано сертификатом? (мой нет)

Ответы [ 2 ]

2 голосов
/ 29 августа 2009

Измерение уровня сигнала базовых станций WiFi, 3G и GSM в точках доступа. Поскольку все точки доступа Wi-Fi имеют уникальный MAC-адрес, а базовые станции 3G и GSM также имеют уникальные идентификаторы, теперь он знает, с какими базовыми станциями вы находитесь и насколько они близки, исходя из их силы.

Теперь есть несколько способов найти расстояние. Если он знает, где находится точка доступа / базовая станция, он может выполнить триангуляцию вашей позиции на основе уровня сигнала. Чтобы это работало, он должен иметь доступ как минимум к 3 AP / BS. С GSM он также может использовать функцию Timer Advance, которая показывает, насколько далеко вы находитесь от базовой станции, с точностью около 1 км. С 3G еще лучше.

Другой подход (используемый Google и другими) заключается в том, что все ваши данные об уровне сигнала отправляются на сервер. Если у вас есть GPS, то ваша информация GPS также отправляется вместе. Затем сервер может построить карту уровней сигналов для разных AP / BS в разных координатах. Поскольку у вас нет GPS, он теперь сравнивает уровни пройденного сигнала и пытается найти наиболее близкое совпадение в своей базе данных, а затем находит местоположение в этой ближайшей точке.

1 голос
/ 16 октября 2009

Это легко сделать в J2ME с помощью API, определенных как JSR 179 . Вот простой пример: Пример приложения JavaME Location API с исходным кодом (эта страница не работает на момент написания; вот версия Google Cache ).

Этот образец отлично работает на моем Nokia E63, который, как ваш N97 N73, не имеет GPS, но поддерживает позиционирование на основе ячеек. Вот суть этого:

public void checkLocation() throws Exception
{
    String string;
    Location l;
    LocationProvider lp;
    Coordinates c;

    // Set criteria for selecting a location provider:
    // accurate to 500 meters horizontally
    Criteria cr = new Criteria();
    cr.setHorizontalAccuracy(500);

    // Get an instance of the provider
    lp = LocationProvider.getInstance(cr);

    // Request the location, setting a one-minute timeout
    l = lp.getLocation(60);
    c = l.getQualifiedCoordinates();

    if(c != null ) {
      // Use coordinate information
      double lat = c.getLatitude();
      double lon = c.getLongitude();
      string = "\nLatitude : " + lat + "\nLongitude : " + lon;

    } else {
        string ="Location API failed";
    }
    midlet.displayString(string);
}

@ Мариус прав в том, как работает технология, но API JSR 179 скрывают от вас все эти детали. @JaanusSiim не прав, что вы не можете сделать это из J2ME.

Обратите внимание, что образец приложения не требует подписи для работы - на телефоне появится сообщение с вопросом, разрешить ли неподписанному приложению доступ к информации о вашем местоположении.

...