起初,我认为最简单的方法是查看是否可以使用Google地图来绘制用户位置,然后只需将我的自定义建筑地图“叠加”在Google地图之上,这样我就不必处理任何GPS信息或映射的复杂性,只需适当缩放我的“叠加”,使用户在建筑物的正确房间中显示即可。我想知道是否有人能够提供我如何实现此目标的任何信息,或者是否有更简单的方法来完成我的地图。任何信息都有帮助!
您可以通过自定义视图来实现此目标,该视图显示您的建筑平面图并知道建筑物每个角落的精确坐标。
当您接收到位置更新时,您可以通过将现实世界的位置转换为图像中的位置来向自定义视图添加标记,使用类似以下的伪代码:
伪代码:
markerX = realWorldX - mapStartX;
markerY = realWorldY - mapStartY;
if( isOnMap( markerX, markerY ) )
{
drawMarker( markerX, markerY );
}
无法使用比标准GMap(即浏览器中看到的)更接近的缩放级别。另一个问题是谷歌使用基于基本微度数的GeoPoint类来绘制覆盖层,其精度太低。 您可以查看jGarminImg - 这是Java库 - 不幸的是针对使用Swing编写,但应该相对容易使它能够与Android一起使用。 另一方面-你必须制作自己的地图。 您可以使用标准覆盖层,也可以使用kml格式制作地图并使用this示例进行显示。
您想要... Google地图视图
...更具体地说,您可能会希望阅读适当命名为"第2部分:添加叠加项"的子部分。
编辑:糟糕!对不起,我误读了你的问题...如果您想在地图上叠加项目,那么您需要阅读这一部分。抱歉...
可以在Google MapView上叠加位图图像。
你只需要子类化Overlay类,重写draw方法,并在画布上绘制。你需要提供一个GeoPoints的矩形(可能是左上角和右下角),以便将建筑位图锚定在MapView的顶部。你可以使用mapView.getProjection()将纬度和经度转化为画布上的xy坐标。
我认为drawBitmap(Bitmap bitmap, Rect src, RectF dst, Paint paint) 在这里会很有用。请记住src和paint可以为空。如果你使用的GeoPoints是准确的,位图将自动调整到平移和缩放,尽管在用户放大太多时可能会出现像素化。
编辑:我不确定Google地图在不同的缩放级别下是否会保持建筑物在完全相同的GeoPoints上,所以你可能需要为不同的缩放级别调整这些值。
我会这样做:
在谷歌地图上放置标记以指示建筑物的位置。
点击建筑物后,将您的建筑物地图作为自定义视图加载。在自定义视图上绘制用户位置。
我认为尝试在谷歌地图上叠加您的建筑物地图虽然可能是可行的,但比通过自定义视图实现更复杂。
此外,在最低缩放级别上叠加您的建筑物地图不会给您足够的分辨率,除非您有一个非常大的建筑物。整个街区相当小。
您可能已经考虑过的一个问题是,当设备在建筑物内部时,它会恢复到使用蜂窝塔和WiFi来定位,从而给您提供不太准确的位置修复。