繁体   English   中英

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

[英]I'm having trouble getting accurate GPS locations from the Google Maps API for use on Android

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

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

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

GeoPoint point = mapView.getMapCenter();

平移视图后,返回不正确的GPS坐标。 将这些点渲染为新视图时,它们会始终显示在同一位置,该位置与互联网上针对相同GPS坐标的Google地图视图之间具有很好的相关性。 我们已经对软件进行了广泛的调试,当从mapView.getMapCenter();返回时,坐标具有错误的地图位置/ GPS坐标mapView.getMapCenter();

因为我们担心

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

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

另外,需要明确的是,这与GPS传感器的精度无关。

如果我们可以在平移后刷新/重新初始化地图视图,则可能会很尴尬,但这将是对当前问题的一种改进。 同时,转移到其他地图软件将花费很多时间,并且可能会有自己的问题。

我做类似的事情,并且在准确性方面没有问题。 我怀疑这是您放置十字准线的方式。 我使用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属性可确保十字线和地图视图使用同一中心。

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

恐怕你让我难过

更新资料

我将应用程序更改为显示正常小数点后6位小数,并在伦敦附近的一家超市中选择了一个停车位交叉点。 我按照您的建议做了,并在开始时从模拟器上以最大缩放比例拍摄了屏幕快照,然后平移,缩放并平移回了原始位置,而没有像我那样看显示的纬度/经度。 。 这些是典型的结果

开始 开始

结束 在此处输入图片说明

1微度的纬度变化大约只有11厘米,经度的变化只有6厘米,因此我认为这在我准确摇摄的能力范围内。

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

火腿切点

在以下位置有其位置的示意图:

草图

和此站点上的照片(螺栓在狗的右前爪下方):

触发点照片

如果您查看我的应用程序对该位置进行地理定位的屏幕截图

在此处输入图片说明

您会看到Google在离码头边缘6英尺处有一个不错的位置,并且将在涨潮时进入水中。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM