5

我需要在我的应用程序中进行检查,以确定给定坐标是否位于 Google 地图中的道路上。

Google Maps API 中是否有任何功能可以帮助我解决这个问题?

提前致谢!

4

1 回答 1

15

据我所知,这无法使用 Google Maps API 完成。

我认为您最好的选择是使用众包数据集,例如OpenStreetMap (OSM)

您需要建立自己的空间数据库(例如PostGIS)并将 OSM 数据导入数据库。

然后,您将创建一个服务器端 API(托管在TomcatGlassfish等 Web 服务器中)来接收手机的当前位置,以一定的半径缓冲该位置以给您一个圆形多边形,并进行空间查询通过 PostGIS确定缓冲区是否与任何道路相交(例如,带有“highway=primary”或“highway=secondary”标签的方式,具体取决于您要包含的道路类型 - 请参阅此站点),并返回 true 或 false对电话的回应。

编辑 2015 年 8 月

现在在android-maps-utils 库中有一个名为的方法,PolyUtil.isLocationOnPath()它允许您在 Android 应用程序本身内进行这种类型的计算,假设您有一组构成道路(或任何其他线)的点。

这是库中代码的样子

   /**
     * Computes whether the given point lies on or near a polyline, within a specified
     * tolerance in meters. The polyline is composed of great circle segments if geodesic
     * is true, and of Rhumb segments otherwise. The polyline is not closed -- the closing
     * segment between the first point and the last point is not included.
     */
    public static boolean isLocationOnPath(LatLng point, List<LatLng> polyline,
                                           boolean geodesic, double tolerance) {
        return isLocationOnEdgeOrPath(point, polyline, false, geodesic, tolerance);
    }

要使用此库,您需要将该库添加到您的build.gradle

dependencies {
    compile 'com.google.maps.android:android-maps-utils:0.4+'
}

然后,当你有你的观点和你的路径时,你需要将你的纬度/经度转换为LatLng对象(特别是,分别是 aLatLng pointList<LatLng> line),然后在你的代码调用中:

double tolerance = 10; // meters
boolean isLocationOnPath = PolyUtil.isLocationOnPath(point, line, true, tolerance);

...查看您的点是否在您的线的 10 米范围内。

有关如何使用它的更多信息,请参阅此库的入门指南。

于 2012-11-06T16:14:22.290 回答