【问题标题】:How does the Google Maps for Mobile "My Location" feature work?谷歌手机地图“我的位置”功能如何运作?
【发布时间】:2009-08-29 14:16:52
【问题描述】:

我在Nokia N73 上安装了 Google Maps Java 2 ME 应用程序,它支持 Location API (JSR 179),但没有内置 GPS 传感器。 “我的位置”功能正常工作,并且能够精确定位我在城市中的位置。

当我尝试访问CellID, LAC 和其他相关数据时,我得到了空值。那么地图是如何计算我的位置的呢?是因为他们的应用程序是用证书签名的吗? (我的不是)

【问题讨论】:

  • 我相信 Symbian 手机没有 J2ME 版本的 Google 地图。在我的索尼爱立信 W960 上,我得到了 Symbian 版本
  • 是的,Symbian 手机很可能获得 Symbian C++ 版本,就像在我的 N73 上一样,而在我的旧索尼爱立信 W700i 上下载 Java 版本..

标签: java google-maps java-me mobile location


【解决方案1】:

它的作用是测量该区域内 WiFi、3G 和 GSM 基站/接入点的信号强度。由于所有 WiFi 接入点都有唯一的 MAC 地址,并且 3G 和 GSM 基站也有唯一的标识,因此它现在可以根据强度知道您靠近哪些基站以及您与它们的大致距离。

现在有几种方法可以找到距离。如果它知道接入点/基站的位置,那么它可以根据信号强度对您的位置进行三角测量。为此,它需要访问至少 3 个 AP/BS。通过 GSM,它还可以使用 Timer Advance,它可以估计您与基站的距离,精度约为 1 公里。有了 3G 就更好了。

另一种方法(由 Google 和其他公司使用)是将您的所有信号强度数据发送到服务器。如果您有 GPS,那么您的 GPS 信息也会一起发送。然后,服务器可以在不同坐标处构建到不同 AP/BS 的信号强度图。由于您没有 GPS,它现在会比较您传递的信号强度,并尝试在其数据库中找到最接近的匹配,然后找到该最近点的位置。

【讨论】:

  • 你所描述的一切都不能在 J2ME 中完成,所以这应该证明我的观点 - 使用的谷歌地图版本不是用 J2ME 编写的
  • Google Maps for Mobile 是用 C++ 编写的,Symbian OS 上的 C++ 是否会向应用程序公开 cellid、lac 和其他信息。
【解决方案2】:

使用JSR 179 定义的API 在J2ME 中很容易做到这一点。这里有一个简单的例子:JavaME Location API Example application with Source Code(在撰写本文时该页面已损坏;这里是Google Cache version)。

该示例在我的诺基亚 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);
}

@Marius 关于该技术的工作原理是正确的,但 JSR 179 API 对您隐藏了所有这些细节。 @JaanusSiim 是错误的,您不能从 J2ME 执行此操作。

请注意,示例应用程序不需要签名即可工作 - 手机会弹出提示询问是否允许未签名的应用程序访问您的位置信息。

【讨论】:

  • 您引用了“就像您的 N97”,但是我的手机是 N73...我在 N73 上尝试过示例程序,但它不起作用,我推断没有 cellid 和/或 lac手机无法计算位置。我认为谷歌这样做的方式是他们有一个 Symbian C++ 应用程序,我可以从 GUI 中看到,然后 Symbian 可能能够检索 Java ME 无法检索的值,或者谷歌可能已经在运营商处签署了他们的应用程序级别并获得对这些值的特定访问权限...
  • 对不起,我的意思是 N73,它确实支持 JSR 197 - 请参阅 forum.nokia.com/devices/N73 至于示例不起作用,在我的情况下,我已禁用“蓝牙 GPS”并在“设置”中启用“基于网络” / 常规 / 定位,我在“定位服务器”下配置了一个接入点和一个服务器(supl.nokia.com)。
  • 我猜你的意思是“JSR 179 Location API for J2ME™”。如果设备支持位置 API,是否可能能够使用 a 计算您的位置。外部 gps(通过蓝牙) b.内部 GPS C. cell id ...现在因为N73没有内部gps,所以留下了其他两个选项。如果您考虑阅读此链接,单元 ID 也将失效...library.forum.nokia.com/index.jsp?topic=/…...
  • 您的 E63 是 S60 第 3 版、Feature Pack 1 设备,而 N73 是第 3 版初始版本。但根据该链接,甚至不应在 FP1 设备上检索单元 ID,因此我想知道它在你的 E63 上是如何工作的
  • 据我所知,单元 ID 并不是很相关。 JSR 179 定义了一个用于检索您当前位置的纬度和经度的 API,这就是该代码示例所使用的。它不仅仅是手机 ID——我的手机通过使用@Marius 谈到的技术,在没有 GPS 的情况下将我的位置准确地跟踪到大约 50 码以内。我不知道 S60v3 original 和 S60v3 FP 1 在 JSR 179 方面是否存在显着差异,但诺基亚网站上没有明显的差异。你有工具/设置/常规/定位的等价物吗?
猜你喜欢
  • 2011-04-01
  • 2016-10-20
  • 1970-01-01
  • 2013-01-09
  • 1970-01-01
  • 1970-01-01
  • 2011-03-22
  • 1970-01-01
  • 2016-10-21
相关资源
最近更新 更多