2012-05-21 69 views
0

首先,我對Javascript很新,很抱歉,如果我的問題遇到很差。谷歌地圖中的動態矩形

我在Flash中創建一個應用程序,以幫助用戶計算他們的電氣成本。然後我將這個數字寫入一個xml文件。

現在我正在打開一個網頁並顯示一個谷歌地圖,並且在地圖上繪製了一個矩形,它是從先前生成的數字中動態生成的,並存儲在xml文件中。

我完全失去了打開如何實現這個目標的地方。我已經將自己的地圖放到了我的頁面上,並且按照我的意願縮放了100%,但我根本找不到動態矩形部分。任何想法或指針在正確的方向非常讚賞。

回答

1

In this latest version,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; 
     } 
    }); 
    } 
    } 

該矩形是通過在點寬度限定(全世界是256×256個點),所以分配它們的中心到更常規的經緯度時,需要一些轉換。

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類和構造函數來完成這兩個和矩形有一個像筆觸顏色,厚度,透明度選項,並填充顏色。

+0

哇,謝謝你這樣深入的迴應! 哎呀,不是故意張貼尚未:), 這看起來像它的工作,但我的問題是,我會處理從Flash應用程序單號。我如何將它轉換成經度和緯度點?如何保持適當的比例,以便您可以比較不同的數字。 (我不希望在同一地圖上創建多個輸出,但我打算上打印這些或發佈至Facebook讓人們可以看到他們如何達到其他用戶。) – Quill

+0

@Quill你能不能給這樣一些例子從Flash?我不明白。這是一個分數嗎?它真的代表世界座標嗎?或者發佈你的XML在問題中的樣子。 Google地圖需要放置矩形的位置。你的意思是把許多矩形並排地代表一個人嗎?如果你改變你的問題,在這裏寫另一個評論,所以我得到通知。 –

+0

對不起,我沒有XML代碼的示例。這是來自項目的不同部分,而不是我正在研究的部分。據我所知,至今還沒有弄清楚,我知道這可能會阻礙任何人幫助我的能力。它的碳足跡可視化即時通訊尋找。因此,Flash應用程序會告訴人們他們輸出了多少噸二氧化碳,然後即時創建一個矩形來表示地圖上的這個區域,所以他們有一個想法,基於他們所知道的一個真實世界圖像它實際上是大的。所以我會收到的數字將是類似9tonnes – Quill

1

如果您只是想在地圖上放置一個矩形形狀,您可以創建一個google.maps.Rectangleapi-doc。如果要在地圖上創建矩形標籤,則可能對InfoBox公用程序庫wiki-page更感興趣。

+0

這不是我想要創建的標籤,更多的是數據可視化。我想從Flash應用程序中獲取數字,並在Google地圖上直觀地顯示人們有多大的區域。儘管歡呼的迴應! – Quill

+0

矩形是我答案中的第一個選項;第二個是創建一個標籤。但追求@ Heitor的答案;它有更多的細節。 +1 Heitor- –

+0

我瀏覽了一下矩形API文檔,但不幸的是,它似乎只是指向創建一個靜態矩形,而不是一個會根據寫入到外部文件的數據而改變的矩形。 – Quill