[英]How does the Google Maps for Mobile “My Location” feature work?
我已经在支持位置API(JSR 179)的诺基亚N73上安装了Google Maps Java 2 ME应用程序,但没有内置GPS传感器。 “我的位置”功能可以正常运行,并且可以查明我在城市中的位置。
当我尝试访问CellID,LAC和其他相关数据时,我得到了空值。 那么,地图如何计算我的位置? 是因为他们的应用程序已使用证书签名吗? (不是)
它的作用是测量该区域内WiFi,3G和GSM基站/接入点的信号强度。 由于所有WiFi接入点都具有唯一的MAC地址,并且3G和GSM基站也具有唯一的标识,因此它现在可以根据强度知道您靠近哪个基站以及与它们之间的接近程度。
现在有几种找到距离的方法。 如果知道接入点/基站的位置,则可以根据信号强度对您的位置进行三角测量。 为此,它至少需要访问3个AP / BS。 使用GSM,它还可以使用Timer Advance,它可以估算出您距基站有多远,准确度约为1公里。 有了3G,情况会更好。
另一种方法(由Google和其他公司使用)是将所有信号强度数据发送到服务器。 如果您有GPS,则还会发送GPS信息。 然后,服务器可以在不同坐标处建立到不同AP / BS的信号强度图。 由于您没有GPS,因此现在它会比较您传递的信号强度,并尝试在其数据库中找到最接近的匹配项,然后找到该最接近点的位置。
使用JSR 179定义的API在J2ME中很容易做到这一点。 这里有一个简单的示例: JavaME Location API带有源代码的示例应用程序 (在编写本文时该页面已损坏;这是Google Cache版本 )。
该示例可在我的诺基亚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执行此操作。
请注意,示例应用程序不需要签名即可工作-手机将弹出提示,询问是否允许未签名的应用程序访问您的位置信息。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.