この最新バージョンでは、XMLファイル
<countries>
<country name="USA" lat="40.0" lng="-100.0" width="30.0"/>
<country name="France" lat="46.6" lng="2.7" width="10"/>
<country name="Germany" lat="51.1" lng="10.1" width="20"/>
</countries>
マップタイルの読み込みが完了するとすぐに読み込まれます。getProjection
タイルの読み込みが完了するのを待たないと、を正しく呼び出すことができませんでした。ドキュメントには、プロジェクションを取得するにはマップを初期化する必要があると記載されており、をリッスンすることをお勧めしprojection_changed
ます。どちらの方法でも機能しますが、tiles_loadedを聞く方が安全だと感じています。また、xmlの読み込みで問題が発生した場合、マップがかなりの量ズームまたはパンされると、再度呼び出されます。
var map;
var xmlLoaded = false;
function initialize() {
var mapOptions = { center: new google.maps.LatLng(30.0, 0.0), zoom: 2,
mapTypeId: google.maps.MapTypeId.ROADMAP };
map = new google.maps.Map(document.getElementById("map_canvas"), mapOptions);
google.maps.event.addListener(map, 'tilesloaded', loadData);
}
function loadData() {
if(!xmlLoaded) {
$.ajax({
type: "GET",
url: "co2data.xml",
dataType: "xml",
success: function(xml) {
var countries = xml.documentElement.getElementsByTagName("country");
for(var i = 0, country; country = countries[i]; i++) {
var name = country.getAttribute("name");
var lat = parseFloat(country.getAttribute("lat"));
var lng = parseFloat(country.getAttribute("lng"));
var point = map.getProjection().fromLatLngToPoint(new google.maps.LatLng(lat,lng));
// width is really an arbitrary unit, relative to CO2 tonnage.
// equals the side of the drawn square.
// it is measured in google maps points units.
var width = parseFloat(country.getAttribute("width"));
makeCO2Rect(name, point, width);
}
xmlLoaded = true;
}
});
}
}
長方形はポイント単位の幅で定義されるため(全世界は256x256ポイント)、中心を従来のLatLngに割り当てる場合は、ある程度の変換が必要です。
function rectParamsToBounds(point, width) {
var ctrX = point.x;
var ctrY = point.y;
var swX = ctrX - (width/2);
var swY = ctrY - (width/2);
var neX = ctrX + (width/2);
var neY = ctrY + (width/2);
return new google.maps.LatLngBounds(
map.getProjection().fromPointToLatLng(new google.maps.Point(swX, swY)),
map.getProjection().fromPointToLatLng(new google.maps.Point(neX, neY)));
}
最後に、 MarkerWithLabelに入る国名で長方形が作成されます(ここではv1.1.5を使用して、http: //google-maps-utility-library-v3.googlecode.com/svn/tags/markerwithlabel/にホットリンクできます。 1.1.5 / src / markerwithlabel_packed.jsですが、ローカルコピーを保存することをお勧めします)
長方形をドラッグすることは不可能に見えるので、その中央のマーカーはハンドルとして機能します。ドラッグすると、関連する長方形も一緒に移動します。
function makeCO2Rect(name, point, width) {
var rect = new google.maps.Rectangle({
map: map,
bounds: rectParamsToBounds(point, width)
});
var marker = new MarkerWithLabel({
map: map,
position: map.getProjection().fromPointToLatLng(new google.maps.Point(point.x, point.y)),
draggable: true,
raiseOnDrag: false,
labelContent: name,
labelAnchor: new google.maps.Point(30, 0),
labelClass: "labels", // the CSS class for the label
labelStyle: {opacity: 1.0}
});
google.maps.event.addListener(marker, 'drag', function(event) {
var newLatLng = event.latLng;
var newPoint = map.getProjection().fromLatLngToPoint(newLatLng);
rect.setBounds(rectParamsToBounds(newPoint, width));
});
}
google.maps.event.addDomListener(window, 'load', initialize);
ラベルのスタイル設定は、.labels CSSクラスとコンストラクターの両方で行う必要があり、長方形には、線の色、太さ、不透明度、塗りつぶしの色などのオプションがあります。