在Google Map静态API中绘制一个圆形路径

时间:2019-02-13 18:47:57

标签: android google-maps android-maps-v2 google-static-maps

我正在使用Android中的地图静态API开发应用程序

这是业务逻辑,请从Google静态API获取具有此位置的用户位置请求,并在该位置周围画一个圆

这是我正在使用的代码

https://maps.googleapis.com/maps/api/staticmap?center=29.31166,47.481766&zoom=7&size=600x300&maptype=roadmap&key=My Key

现在的问题是如何在它周围画一个圆,我进行了搜索,发现它是使用路径完成的,但是不知道如何获取该路径

请任何人可以帮助,非常感谢

2 个答案:

答案 0 :(得分:1)

您只需要像Developers Guide中那样绘制路径:

http://maps.googleapis.com/maps/api/staticmap?center=29.31166,47.48177&zoom=7&size=600x300&path=color:0x0000FFFF|weight:3|fillcolor:0x0000FF77|<FIRST_POINT_LAT>,<FIRST_POINT_LNG>|<SECOND_POINT_LAT>,<SECOND_POINT_LNG>|...|<LAST_POINT_LAT>,<LAST_POINT_LNG>&key=<YOUR_API_KEY>

其中<FIRST_POINT_LAT>,<FIRST_POINT_LNG>|<SECOND_POINT_LAT>,<SECOND_POINT_LNG>|...|<LAST_POINT_LAT>,<LAST_POINT_LNG>是您的圆弧路径的坐标。对于它的计算,您可以使用如下方法:

private List<LatLng> getCirclePoints(LatLng center, double radius) {
    List<LatLng> circlePoints = new ArrayList<>();

    // convert center coordinates to radians
    double lat_rad = Math.toRadians(center.latitude);
    double lon_rad = Math.toRadians(center.longitude);
    double dist = radius / 6378137;

    // calculate circle path point for each 5 degrees
    for (int deg = 0; deg < 360; deg += 5) {
        double rad = Math.toRadians(deg);

        // calculate coordinates of next circle path point
        double new_lat = Math.asin(Math.sin(lat_rad) * Math.cos(dist) + Math.cos(lat_rad) * Math.sin(dist) * Math.cos(rad));
        double new_lon = lon_rad + Math.atan2(Math.sin(rad) * Math.sin(dist) * Math.cos(lat_rad), Math.cos(dist)
                - Math.sin(lat_rad) * Math.sin(new_lat));

        // convert new lat and lon to degrees
        double new_lat_deg = Math.toDegrees(new_lat);
        double new_lon_deg = Math.toDegrees(new_lon);

        circlePoints.add(new LatLng(new_lat_deg, new_lon_deg));
    }

    return circlePoints;
}

您可以通过以下方式设置静态地图API网址的格式:

private String buildStaticApiUrlWithCircle(LatLng mapCenter, int zoom, int width, int height,
                                           LatLng circleCenter, double circleRadius, int pathWeight, String pathColor, String fillColor) {

    List<LatLng> circlePoints =getCirclePoints(circleCenter, circleRadius);

    StringBuilder url = new StringBuilder();
    url.append("http://maps.googleapis.com/maps/api/staticmap?");
    url.append(String.format("center=%8.5f,%8.5f", mapCenter.latitude, mapCenter.longitude));
    url.append(String.format("&zoom=%d", zoom));
    url.append(String.format("&size=%dx%d", width, height));

    // set circle path properties
    url.append(String.format("&path="));
    url.append(String.format("color:%s", pathColor));
    url.append(String.format("|weight:%d", pathWeight));
    url.append(String.format("|fillcolor:%s", fillColor));

    // add circle path points
    for (LatLng point : circlePoints) {
        url.append(String.format("|%8.5f,%8.5f", point.latitude, point.longitude));
    }

    // add API key to URL
    url.append(String.format("&key=%s", <YOUR_API_KEY>)));
    return url.toString();
}

圆形路径和填充颜色应以String格式设置为"0xRRGGBBAA",其中RR-红色通道的值,GG-绿色通道的值,{{ 1}}-蓝色通道的值,BB-alpha通道的值(例如AA-不透明的纯蓝色,"0x0000FFFF"-50%透明的纯红色,依此类推。) / p>

以这种方式使用"0xFF000077"时:

buildStaticApiUrlWithCircle()

其中... int mapZoom = 7; int mapWidth = 600; int mapHeight = 300; LatLng mapCenter = new LatLng(29.31166, 47.481766); LatLng circleCenter = new LatLng(29.376297, 47.976379); double circleRadiusMerers = 35000; String circlePathColor = "0x0000FFFF"; String circleFillColor = "0x0000FF99"; String mapUrl = buildStaticApiUrlWithCircle(mapCenter, mapZoom, mapWidth, mapHeight, circleCenter, circleRadiusMerers, 3, circlePathColor, circleFillColor); try { Bitmap mapBitmap = new GetStaticMapAsyncTask().execute(mapUrl).get(); mMapImageView.setImageBitmap(mapBitmap); } catch (InterruptedException e) { e.printStackTrace(); } catch (ExecutionException e) { e.printStackTrace(); } ... 是:

GetStaticMapAsyncTask

您会得到类似的东西:

Static map with circle path

此外,您可以使用Google Maps Lite Mode代替静态地图API(精简模式支持绘图圆)。甚至,如果您需要在地图中心精确地绘制圆,请直接在位图画布上绘制。例如,您可以通过以下方式修改private class GetStaticMapAsyncTask extends AsyncTask<String, Void, Bitmap> { protected void onPreExecute() { super.onPreExecute(); } protected Bitmap doInBackground(String... params) { Bitmap bitmap = null; HttpURLConnection connection = null; try { URL url = new URL(params[0]); connection = (HttpURLConnection) url.openConnection(); connection.setRequestMethod("GET"); connection.connect(); int responseCode = connection.getResponseCode(); InputStream stream = connection.getInputStream(); bitmap = BitmapFactory.decodeStream(stream); } catch (MalformedURLException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } finally { if (connection != null) { connection.disconnect(); } } return bitmap; } @Override protected void onPostExecute(Bitmap result) { super.onPostExecute(result); } } 中的doInBackground()

GetStaticMapAsyncTask

答案 1 :(得分:0)

如果我正确理解你 您只需要在onMapReady()中的on方法上添加此

Circle circle = map.addCircle(new CircleOptions()
     .center(new LatLng(latitude, longitude))
     .radius(10000)
     .strokeColor(Color.RED)
     .fillColor(Color.BLUE));

Googlemap类中的地图