- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在开发一个在 android 中使用 map 静态 api 的应用程序
这是业务逻辑,使用这个位置从 google static api 获取用户位置请求并围绕这个位置画一个圆圈
这是我使用的代码
https://maps.googleapis.com/maps/api/staticmap?center=29.31166,47.481766&zoom=7&size=600x300&maptype=roadmap&key=My Key
现在的问题是如何围绕它画一个圆圈,我搜索了一下,发现它是使用路径完成的,但无法理解如何获得该路径
最佳答案
你只需要像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;
}
您可以用这种方式格式化静态 map API URL:
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
- 红色 channel 的值,GG
- 绿色 channel 的值(value),BB
- 蓝色 channel 的值和AA
- alpha channel 的值(例如 "0x0000FFFF"
- 没有透明度的纯蓝色,"0xFF000077"
- 50% 透明的纯红色等等)。
当您使用 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
是:
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);
}
}
你会得到类似的东西:
此外,您可以使用 Google Maps Lite Mode而不是静态 map API(精简模式支持绘制圆圈)。或者,如果您需要在 map 的中心精确绘制圆圈 - 直接在位图 Canvas 上绘制。例如你可以修改 doInBackground()
的 GetStaticMapAsyncTask
这样:
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 mapBitmap = BitmapFactory.decodeStream(stream);
Paint locaionMarkerPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
locaionMarkerPaint.setColor(Color.BLUE);
bitmap = Bitmap.createBitmap(mapBitmap.getWidth(), mapBitmap.getHeight(), Bitmap.Config.ARGB_8888);
Canvas canvas = new Canvas(bitmap);
canvas.drawBitmap(mapBitmap,0,0, null);
canvas.drawCircle(mapBitmap.getWidth()/ 2, mapBitmap.getHeight() / 2, 20, locaionMarkerPaint);
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
if (connection != null) {
connection.disconnect();
}
}
return bitmap;
}
关于android - 在google map static api中绘制圆形路径,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54677349/
我是 F# 的菜鸟,目前正在阅读 F# 3.0 中的专家。 它是我学习的第一种编译语言(我只知道用 R 编程) 在第 6 章第 117 页,我们没有太多仪式性地介绍 静态让和静态成员。我真的不明白它是
我很迷茫。我已经花几个小时广泛地复习了我的两个类(class)。没有什么是静态的,没有什么是静态引用的,但我无法摆脱这个错误。 A 类文件 (ClassA.php) privateVariable =
关于类公共(public)类声明,请看这两段代码: public class Helper { public static void CallMeganFox(string phoneNumb
我如何使用“super”关键字从父类(super class)(类“aa”)引用“a1” class aa { protected static int a1 = 2; } public class
class Perkusja { boolean talerze = true; boolean beben = true; void zagrajNaBebnie() { Sys
我试图在编译 C++ 程序时静态链接库。 g++ (GCC) 4.8.5 20150623(红帽 4.8.5-4) $ g++ -std=c++11 -I/home/jerry/Desktop/tin
$ javac TestFilter.java TestFilter.java:19: non-static variable this cannot be referenced from a sta
这个问题在这里已经有了答案: How do I create a global, mutable singleton? (7 个答案) How can you make a safe static
“覆盖”静态数组时我遇到了一个棘手的问题。我有静态数组(为简单起见),它们在不同的派生类中具有固定长度,但在编译时仍然知道所有大小。我在基类中也有一个虚函数,但我不知道如何解决在派生类中覆盖这些数组和
我刚刚在遗留代码中发现了这一点。我知道使用宏,每当使用名称时,它都会被宏的内容替换。它们最常用于为数字常量提供符号名称。我所知道的是预处理没有类型安全、范围的概念。 这样做的真正好处是什么? #def
将 Singleton 实例声明为 static 还是声明为 static final 更好? 请看下面的例子: 静态版本 public class Singleton { private s
问题: 我观察到的行为是 TypeScript 的预期行为吗? 我观察到的行为是 ECMAScript 6 的预期行为吗? 是否有一种简单的方法可以返回继承层次结构以处理每个级别的“myStatic”
在php中,访问类的方法/变量有两种方法: 1. 创建对象$object = new Class(),然后使用”->”调用:$object->attribute/functi
我尝试向 ExpandoObject 添加一个动态方法,该方法会返回属性(动态添加)给它,但它总是给我错误。 我在这里做错了吗? using System; using System.Collecti
我试图获得一个静态链接到我的程序的音频库。我用 this灵活的包。为了让它运行,我必须按照描述构建 soloud 库 here .下载后不久,我在“build”文件夹中运行了“genie --with
这是我的webpack.prod.config.js代码 const path = require('path'); const { CleanWebpackPlugin } = require('c
我想知道什么时候应该对变量和(或)方法使用静态、最终、静态最终参数。据我了解: final:类似于c++中的const参数。它基本上意味着值(或在方法中 - 返回值)不会改变。 静态:这意味着值(或方
我一直在阅读有关使用静态对象作为锁的内容,最常见的示例如下: public class MyClass1 { private static final Object lock = new Obje
在 Visual Basic 2008 中,我知道有两种不同的方法可以完成同一件事: 成员(member)级别的 Dim: Dim counter1 as integer = 0 Dim counte
static public final int i = 0; public static final int i = 0; 两者都工作正常。 为什么同样的事情可以用两种不同的风格来完成? 最佳答案 因
我是一名优秀的程序员,十分优秀!