绘制谷歌折线,线宽设置为米

时间:2013-07-15 09:48:50

标签: google-maps google-polyline

我注意到,当您在谷歌地图中绘制折线时,您可以设置宽度(以像素为单位)(笔触宽度)。有没有办法可以用米来设置?

3 个答案:

答案 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。基本上,您可以获得比例的值并计算一个像素中适合的米数。

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;
};