3

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

4

3 回答 3

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 和分辨率

于 2013-07-15T10:45:57.137 回答
1

基于这个答案,我可以得到一个可以接受的结果。即使这不是最好的解决方案。

就我而言,我将 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 像素的邻居,以获得更高的采样率并提高精度。

这种方法还自动考虑缩放。

于 2016-06-08T19:32:55.530 回答
0

这不是准确的解决方案

您可以使用Leaflet 的Scale 控件。基本上,您会得到比例的值并计算一个像素适合多少米。

规模控制

/**
 * 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;
};
于 2016-02-09T16:40:09.543 回答