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' );
这应该可以帮助您入门;有任何问题请大声疾呼。