1

我正在尝试使用 KmlLayer 向我的地图添加地标,但坐标映射不正确。我已经知道坐标是长的,纬度的顺序,问题是坐标似乎比地图缩小了,但相对于彼此,它们似乎被正确放置,最终结果是所有我的地标位于地图中间的集群中,而不是像应有的那样分布在整个地图上。我之前曾尝试手动创建 google.maps.Marker() 对象,并且当我这样做时坐标是正确的,所以我确定坐标是正确的。

我尝试设置一个 JSFiddle 来演示,但我似乎无法让它工作,所以我只是将您链接到实时页面。 在该页面上,地图在完全缩小时以坐标 (+/-64,+/-64) 为界,因为使用这些边界使标记放置更容易,而且显然,我不关心正确映射到任何真实世界的坐标。作为参考,最西南的心脏标记被指定为坐标(-59.75,-56.75),所以它应该几乎在地图的角落(在海湾最西南的船的甲板上,要精确的)。当我创建一个具有这些精确坐标的 google.maps.Marker() 对象时,它会准确地到达我想要的位置。那么,任何人都可以帮助我理解为什么 KmlLayer 坐标没有正确映射吗?

这是完整的 KML 文件

4

1 回答 1

1

KML 使用 WGS84 经度和纬度坐标。您正在使用不使用这些坐标的自定义地图投影。

当您使用 Maps API 创建标记时,它会通过自定义投影,但我认为 KML 图层不会这样做。

大概这个 KML 文件是您在服务器上或使用某些脚本自己生成的?然后,您可以在生成 KML 时根据需要投影坐标,以匹配 Maps API 代码中使用的投影。

如果这不方便或不可能,那么是否有必要使用 KML 层?因为它可以使用 Maps APIMarker对象,所以它可能只使用它运行。

这是一个相关的问题

在评论中跟进我们的对话,我认为最好的方法是使用 JSON 来存储标记数据。JSON 没有强加太多必需的结构;它有对象和数组,就像 JavaScript 一样,你可以用任何对你有用的方式把它们放在一起。这是您的 XML 文件可能看起来像 JSON 的一个版本:

{
    "groups": [
        {
            "type": "heartPiece",
            "icon": "heartpiece.png",
            "markers": [
                {
                        "id": "p1",
                        "name": "Heart Piece #1",
                        "lat": -11.5,
                        "lng": 3.5
                },
                {
                        "id": "p2",
                        "name": "Heart Piece #2",
                        "lat": 5.75,
                        "lng": 58
                },
                {
                        "id": "p3",
                        "name": "Heart Piece #3",
                        "lat": 28.25,
                        "lng": 60.75
                },
                {
                        "id": "p4",
                        "name": "Heart Piece #4",
                        "lat": -58.75,
                        "lng": -16.25
                },
                {
                        "id": "p5",
                        "name": "Heart Piece #5",
                        "lat": -35,
                        "lng": -14
                },
                {
                        "id": "p6",
                        "name": "Heart Piece #6",
                        "lat": -11.25,
                        "lng": -30.25
                },
                {
                        "id": "p7",
                        "name": "Heart Piece #7",
                        "lat": -40,
                        "lng": -9.5
                },
                {
                        "id": "p8",
                        "name": "Heart Piece #8",
                        "lat": -5.75,
                        "lng": 9.75
                },
                {
                        "id": "p9",
                        "name": "Heart Piece #9",
                        "lat": -5,
                        "lng": 0.5
                },
                {
                        "id": "p10",
                        "name": "Heart Piece #10",
                        "lat": 2.75,
                        "lng": -10.25
                },
                {
                        "id": "p11",
                        "name": "Heart Piece #11",
                        "lat": 28.75,
                        "lng": 19.75
                },
                {
                        "id": "p12",
                        "name": "Heart Piece #12",
                        "lat": -54.75,
                        "lng": 45.75
                },
                {
                        "id": "p13",
                        "name": "Heart Piece #13",
                        "lat": -39.75,
                        "lng": 5.25
                },
                {
                        "id": "p14",
                        "name": "Heart Piece #14",
                        "lat": -56.75,
                        "lng": -59.75
                },
                {
                        "id": "p15",
                        "name": "Heart Piece #15",
                        "lat": -60.25,
                        "lng": 23
                },
                {
                        "id": "p16",
                        "name": "Heart Piece #16",
                        "lat": 64,
                        "lng": 0
                },
                {
                        "id": "p17",
                        "name": "Heart Piece #17",
                        "lat": -52.25,
                        "lng": 60.75
                },
                {
                        "id": "p18",
                        "name": "Heart Piece #18",
                        "lat": 48.25,
                        "lng": 31.25
                },
                {
                        "id": "p19",
                        "name": "Heart Piece #19",
                        "lat": 60.5,
                        "lng": 20.5
                },
                {
                        "id": "p20",
                        "name": "Heart Piece #20",
                        "lat": 22.75,
                        "lng": 24.5
                },
                {
                        "id": "p21",
                        "name": "Heart Piece #21",
                        "lat": 61.25,
                        "lng": 10.75
                },
                {
                        "id": "p22",
                        "name": "Heart Piece #22",
                        "lat": 40,
                        "lng": 56.5
                },
                {
                        "id": "p23",
                        "name": "Heart Piece #23",
                        "lat": -14.25,
                        "lng": 32.25
                },
                {
                        "id": "p24",
                        "name": "Heart Piece #24",
                        "lat": 29.75,
                        "lng": -61.25
                },
                {
                        "id": "p25",
                        "name": "Heart Piece #25",
                        "lat": 60.25,
                        "lng": -40.25
                },
                {
                        "id": "p26",
                        "name": "Heart Piece #26",
                        "lat": 63,
                        "lng": -44
                },
                {
                        "id": "p27",
                        "name": "Heart Piece #27",
                        "lat": 28.25,
                        "lng": -27.25
                }
            ]
        },
        {
            "type": "heartContainer",
            "icon": "heartcontainer.png",
            "markers": [
                {
                        "id": "c1",
                        "name": "Heart Container #1",
                        "lat": -2.75,
                        "lng": 56
                },
                {
                        "id": "test",
                        "name": "Test",
                        "lat": -90,
                        "lng": -90
                }
            ]
        }
    ]
}

下面是一些未经测试的示例代码,用于加载 JSON 数据并创建标记:

$.getJSON( 'markers.json', function( json ) {
    json.groups.forEach( function( group ) {
        group.markers.forEach( function( mark ) {
            mark.group = group;
            addMarker( mark );
        });
    });
});

function addMarker( mark ) {
    var marker = new google.maps.Marker({
        map: map,
        icon: '/images/icons/' + mark.group.icon,
        position: new google.maps.LatLng( mark.lat, mark.lng ),
        title: mark.name
    });
}

此代码将转到您现在创建 KML 图层的位置。该代码使用 jQuery$.getJSON()下载 JSON 文件。如果您不想为此使用 jQuery,可以使用任意数量的等效函数,例如Maps API 示例downloadUrl()中的函数。你可以像这样使用它:

downloadUrl( 'markers.json', function( data ) {
    var json = JSON.parse( data );
    json.groups.forEach(...
        ...
    });
});

JSON 数据的另一种选择是简单地将其转换为脚本。如果你把那个 JSON 文件放在loadMarkers(开头,在 first 之前{,放在)最后,放在 last 之后},现在 JSON 文件是一个可执行脚本,它调用一个全局loadMarkers()函数并将 JSON 数据传递给它。调用文件markers.js而不是markers.json,然后您可以使用downloadScript()上面链接的 Maps API 示例中非常简单的函数,如下所示:

loadMarkers = function( json ) {
    json.groups.forEach(...
        ...
    });
};
downloadScript( 'markers.js' );

这应该可以帮助您入门;有任何问题请大声疾呼。

于 2013-07-05T00:21:30.260 回答