我无法从Google Maps API获取准确的GPS位置,以便在Android上使用

时间:2011-03-29 18:51:37

标签: java android google-maps gps

我们正在开发一个应用程序,让人们使用Android手机(2.1及更高版本)在Google地图上标记区域(单点,线和多边形)。他们将获得一个Google地图视图,并通过将屏幕置于他们想要创建点的位置,然后按GUI上的按钮在该位置添加点来输入线的点。

输入一个点后,他们将屏幕重新定位到下一个点的位置,然后再次按下创建点按钮。输入该形状的所有点后,它们会切换到另一个视图,在该视图中输入一些描述性信息并将信息发送到中央数据库。

不幸的是,这些点相对于它们应该标记的位置移动了一小部分。如果用户从摘要视图切换回点编辑视图,则所有点都将移位,一些点仅移动一英尺,一些点移动多达10或15英尺。问题似乎是那个

GeoPoint point = mapView.getMapCenter();
平移视图后,

返回不准确的GPS坐标。当这些点呈现为全新视图时,它们始终显示在相同的位置,与相同的GPS坐标的互联网上的Google地图视图相关联。我们已经对软件进行了大量调试,当从mapView.getMapCenter();

返回时,坐标的地图位置/ GPS坐标错误

因为我们担心

Point p = new Point();
mapView.getProjection().toPixels(mapView.getMapCenter(), p); 

可能不会返回screenWidth / 2screenHeight / 2位置,我们实际上会显示用于在toPixels位置放置点的十字准线,并且新创建的点与十字准线完全匹配最初创建。在更改为摘要屏幕并返回后,它们将以其真实GPS坐标重新渲染。

另外,要明确的是,这与GPS传感器的准确性无关。

如果我们可以在平移后刷新/重新初始化地图视图,它可能会很尴尬,但它会比我们当前的问题有所改进。 与此同时,转移到其他地图软件需要花费很多时间,并且可能有自己的问题。

2 个答案:

答案 0 :(得分:1)

我做了类似的事情,没有不准确的麻烦。我怀疑这是你放置十字准线的方式。我使用Unicode字符在main.xml中定义我的,并使用以下代码段将其固定到视图中心:

<RelativeLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:background="#0000ff"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content">
    <include
        layout="@layout/googlemap"/>
    <Button
        android:text='\u25ce'
        android:id="@+id/BullseyeButton"
        android:background="@android:color/transparent"
        android:layout_centerInParent="true"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textSize="24pt"
        android:typeface="monospace"
        android:textColor="#afffff00"></Button>
    <include
        layout="@layout/infobar"/>
</RelativeLayout>

centerInParent属性保证十字准线和mapview使用相同的中心。

u25ce对我来说是一个很好的指标。还有其他一些你可能会找到更好的。

更新

我用处理程序每​​秒更新一次应用程序的信息栏。我添加了这个在处理程序中调用的测试方法

protected void backAndForth(MapView mv){
    GeoPoint centreGpt = mv.getMapCenter();
    int inLon = centreGpt.getLongitudeE6();
    int inLat = centreGpt.getLatitudeE6();
    Point p = new Point();
    mv.getProjection().toPixels(centreGpt, p);
    GeoPoint backGpt = mv.getProjection().fromPixels(p.x, p.y);
    int outLat = backGpt.getLatitudeE6();
    int outLon = backGpt.getLongitudeE6();
    String res = "In lat " + inLat + " In lon " + inLon 
                + " Out lat " + outLat + " Out lon " + outLon;
    Log.d("POS_TAG", res);
}

无论我如何平移和缩放,进出坐标都完美匹配。使用反向地理编码器,从芝加哥跳到伦敦到柏林,我从测试方法得到输出:

In lat 41878113 In lon -87629798 Out lat 41878113 Out lon -87629798
In lat 41878113 In lon -87629798 Out lat 41878113 Out lon -87629798
In lat 51500152 In lon -126236 Out lat 51500152 Out lon -126236
In lat 51500152 In lon -126236 Out lat 51500152 Out lon -126236
In lat 51500152 In lon -126236 Out lat 51500152 Out lon -126236
In lat 52523405 In lon 13411399 Out lat 52523405 Out lon 13411399
In lat 52523405 In lon 13411399 Out lat 52523405 Out lon 13411399
In lat 52523405 In lon 13411399 Out lat 52523405 Out lon 13411399

我害怕你让我难过

更新

我改变了我的应用程序,从正常的5位显示了6位小数,并选择了伦敦附近一家超市的停车位。我按照你的建议做了,并且在开始时我的模拟器以最大变焦进行了屏幕截图,然后我平移并放大并尽可能接近地回到原始位置,而不是看着显示的Lat / Lon,因为我做了它。这些是典型的结果

开始 Start

结束 enter image description here

纬度变化只有11微米左右,纬度变化只有6厘米左右,所以我认为这几乎是我准确平移的能力。

谷歌地图本身似乎有更大的固有显示错误。例如,英国的测绘机构(The Ordnance Survey)在全国范围内保留了许多三角测量点。这些通过WGS84基准上的卫星参考固定在亚毫米精度内。它们通常是四分之一英寸的铜螺柱,镶嵌在混凝土中。我们可以与谷歌地图视图相关联的是

Ham trig point

有关其位置的草图:

Sketch

和这个网站上的照片(螺栓在狗的右前爪下):

Trig point photo

如果您查看我的应用地理位置固定到该位置的屏幕截图

enter image description here

你可以看到谷歌在码头边缘6英尺处有一个好位置,并且在涨潮时会在水中。

总之,我认为我在重复性方面看到的任何错误都被谷歌对坐标解释所固有的错误所淹没。这可能是预期的,因为我知道它们使用的是地球表面的简单球形投影,而不是GPS系统所基于的更精确的椭圆形投影。

答案 1 :(得分:0)

我们最终使用来自InKnowledge的Android SDK在我们的Android应用程序中用Bing Maps替换了Google Maps。他们为地图视图的中心提供精确的GPS坐标,我们用它来构建多边形,折线和图钉形状。