我注意到,当您在谷歌地图中绘制折线时,您可以设置宽度(以像素为单位)(笔触宽度)。有没有办法可以用米来设置?
答案 0 :(得分:2)
不幸的是,我不知道有什么简单的方法可以做到这一点。 API似乎没有关于此的文档,我认为此功能不受支持。
一个问题是像素表示API内不同缩放级别的不同数量的米。因此,如果缩放级别发生变化,它将是一个动态数量。
一个选项可能是计算宽度(以像素为单位),以表示给定缩放级别的给定数量的米。为此,您必须根据每个缩放级别的地图比例编写自己的函数。这些数据似乎在这里可用:
http://webhelp.esri.com/arcgisserver/9.3/java/index.htm#designing_overlay_gm_mve.htm
20 : 1128.497220
19 : 2256.994440
18 : 4513.988880
17 : 9027.977761
16 : 18055.955520
15 : 36111.911040
14 : 72223.822090
13 : 144447.644200
12 : 288895.288400
11 : 577790.576700
10 : 1155581.153000
9 : 2311162.307000
8 : 4622324.614000
7 : 9244649.227000
6 : 18489298.450000
5 : 36978596.910000
4 : 73957193.820000
3 : 147914387.600000
2 : 295828775.300000
1 : 591657550.500000
然后,您可以根据您尝试表示的电平表和当前缩放级别动态设置像素值。
可能仍然存在问题,因为您生成的像素大小可能与屏幕像素大小不对应,具体取决于API处理屏幕DPI和分辨率的方式
答案 1 :(得分:1)
基于this answer,我可以获得可接受的结果。即使它不是最好的解决方案。
在我的情况下,我使用Android com.google.android.gms:play-services-location:8.4.0
。但最初的答案是JavaScript,所以我认为不难适应。
LatLng center = <get map center>.
float requiredWidth = 10; // in meters
Projection proj = googleMap.getProjection();
Point pointCenter = proj.toScreenLocation(center); // point in pixels
LatLng neighbor = proj.fromScreenLocation(new Point(pointCenter.x + 1000, pointCenter.y));
float[] distance = new float[1];
Location.distanceBetween(center.latitude, center.longitude, neighbor.latitude, neighbor.longitude, distance); // return distance in meters
float pixelsWidth = requiredWidth / (distance[0] / 1000f); // 10 meters conveted to pixels
myPolyline.setWidth(pixelsWidth);
我的答案与原作的区别在于我创建了1000像素距离的邻居,以获得更高的采样率并提高精度。
此方法也会自动考虑缩放。
答案 2 :(得分:0)
这不是准确的解决方案
您可以使用传单的Scale control。基本上,您可以获得比例的值并计算一个像素中适合的米数。
/**
* Returns number of meters in one pixel.
*
* @return Integer number of meters in one pixel
*/
var _metersInPixel = function () {
var pixels = $('.leaflet-control-scale-line').width();
var distance = $('.leaflet-control-scale-line').first().text();
var testRegExpKm = /(\d+)\skm/;
var testRegExpM = /(\d+)\sm/;
if (testRegExpKm.test(distance)) {
var match = testRegExpKm.exec(distance);
var meters = parseInt(match[1]) * 1000;
} else if (testRegExpM.test(distance)) {
var match = testRegExpM.exec(distance);
var meters = parseInt(match[1]);
} else {
throw "Unable to determine meters to pixels ratio";
}
var metersInPixels = Math.round(meters / parseInt(pixels));
return metersInPixels;
};