2014-02-11 95 views
2

我正在開發一個管理員可以添加屬性到他的項目頁面的房地產網站。現在他應該選擇的其中一個選項是添加他宣傳的房產的位置。在我的CMS平臺上,我有地圖,管理員將他的別針放到他的特定屬性,然後保存。之後,進入該網站的預期客戶將看到管理員之前放置的針。如何在標記上居中顯示google ap3地圖?

這裏是我的管理部分的代碼

HTML代碼

<!DOCTYPE html > 
    <head> 
    <meta name="viewport" content="initial-scale=1.0, user-scalable=no" /> 
    <meta http-equiv="content-type" content="text/html; charset=UTF-8"/> 
    <title>Google Maps JavaScript API v3 Example: Map Simple</title> 
    <script type="text/javascript" src="http://maps.googleapis.com/maps/api/js?sensor=true"></script> 
    <script type="text/javascript"> 
    var marker; 
    var infowindow; 

    function initialize() { 
     var latlng = new google.maps.LatLng(30.0599153,31.2620199,13); 
     var options = { 
     zoom: 13, 
     center: latlng, 
     mapTypeId: google.maps.MapTypeId.ROADMAP 
     } 
     var map = new google.maps.Map(document.getElementById("map-canvas"), options); 
     var html = "<table>" + 
       "<tr><td>Name:</td> <td><input type='text' id='name'/> </td> </tr>" + 
       "<tr><td>Address:</td> <td><input type='text' id='address'/></td> </tr>" + 
       "<tr><td>Type:</td> <td><select id='type'>" + 
       "<option value='bar' SELECTED>bar</option>" + 
       "<option value='restaurant'>restaurant</option>" + 
       "</select> </td></tr>" + 
       "<tr><td></td><td><input type='button' value='Save & Close' onclick='saveData()'/></td></tr>"; 
    infowindow = new google.maps.InfoWindow({ 
    content: html 
    }); 

    google.maps.event.addListener(map, "click", function(event) { 
     marker = new google.maps.Marker({ 
      position: event.latLng, 
      map: map 
     }); 
     google.maps.event.addListener(marker, "click", function() { 
      infowindow.open(map, marker); 
     }); 
    }); 
    } 

    function saveData() { 
     var name = escape(document.getElementById("name").value); 
     var address = escape(document.getElementById("address").value); 
     var type = document.getElementById("type").value; 
     var latlng = marker.getPosition(); 

     var url = "phpsqlinfo_addrow.php?name=" + name + "&address=" + address + 
       "&type=" + type + "&lat=" + latlng.lat() + "&lng=" + latlng.lng(); 
     downloadUrl(url, function(data, responseCode) { 
     if (responseCode == 200 && data.length <= 1) { 
      infowindow.close(); 
      document.getElementById("message").innerHTML = "Location added."; 
     } 
     }); 
    } 

    function downloadUrl(url, callback) { 
     var request = window.ActiveXObject ? 
      new ActiveXObject('Microsoft.XMLHTTP') : 
      new XMLHttpRequest; 

     request.onreadystatechange = function() { 
     if (request.readyState == 4) { 
      request.onreadystatechange = doNothing; 
      callback(request.responseText, request.status); 
     } 
     }; 

     request.open('GET', url, true); 
     request.send(null); 
    } 

    function doNothing() {} 
    </script> 
    </head> 

    <body style="margin:0px; padding:0px;" onload="initialize()"> 
    <div id="map-canvas" style="width: 800px; height: 600px"></div> 
    <div id="message"></div> 
    </body> 

</html> 

然後它涉及到PHP代碼管理將信息添加到數據庫的動態部分:

<?php 
// Gets data from URL parameters 
$name = $_GET['name']; 
$address = $_GET['address']; 
$lat = $_GET['lat']; 
$lng = $_GET['lng']; 
$type = $_GET['type']; 

mysql_connect("localhost", "root", "") or 
     die("Could not connect: " . mysql_error()); 
mysql_select_db("arabia"); 

// Insert new row with user data 
$query = sprintf("INSERT INTO markers " . 
     " (id, name, address, lat, lng, type) " . 
     " VALUES (NULL, '%s', '%s', '%s', '%s', '%s');", 
     mysql_real_escape_string($name), 
     mysql_real_escape_string($address), 
     mysql_real_escape_string($lat), 
     mysql_real_escape_string($lng), 
     mysql_real_escape_string($type)); 

$result = mysql_query($query); 

if (!$result) { 
    die('Invalid query: ' . mysql_error()); 
} 

?> 

現在來到客戶部分。

其中有問題的客戶端部分的HTML,客戶端看到的地圖從這裏

<!DOCTYPE html > 
    <head> 
    <meta name="viewport" content="initial-scale=1.0, user-scalable=no" /> 
    <meta http-equiv="content-type" content="text/html; charset=UTF-8"/> 
    <title>map</title> 
    <script type="text/javascript" src="http://maps.googleapis.com/maps/api/js?sensor=false"></script> 
    <script type="text/javascript"> 
    //<![CDATA[ 

    var customIcons = { 
     restaurant: { 
     icon: 'http://labs.google.com/ridefinder/images/mm_20_blue.png' 
     }, 
     bar: { 
     icon: 'http://labs.google.com/ridefinder/images/mm_20_red.png' 
     } 
    }; 
    function load() { 
     var map = new google.maps.Map(document.getElementById("map"), { 
     center: new google.maps.LatLng(30.0599153,31.2620199,13)||map.setCenter(marker.getPosition()), 
     zoom: 13, 
     mapTypeId: 'roadmap' 
     }); 
     var infoWindow = new google.maps.InfoWindow; 

     // Change this depending on the name of your PHP file 
     downloadUrl("phpsqlajax_genxml.php", function(data) { 
     var xml = data.responseXML; 
     var markers = xml.documentElement.getElementsByTagName("marker"); 
     for (var i = 0; i < markers.length; i++) { 
      var name = markers[i].getAttribute("name"); 
      var address = markers[i].getAttribute("address"); 
      var type = markers[i].getAttribute("type"); 
      var point = new google.maps.LatLng(
       parseFloat(markers[i].getAttribute("lat")), 
       parseFloat(markers[i].getAttribute("lng"))); 
      var html = "<b>" + name + "</b> <br/>" + address; 
      var icon = customIcons[type] || {}; 
      var marker = new google.maps.Marker({ 
      map: map, 
      position: point, 
      icon: icon.icon 
      }); 
      bindInfoWindow(marker, map, infoWindow, html); 
     } 
     }); 
    } 

    function bindInfoWindow(marker, map, infoWindow, html) { 
     google.maps.event.addListener(marker, 'click', function() { 
     infoWindow.setContent(html); 
     infoWindow.open(map, marker); 
     }); 
    } 

    function downloadUrl(url, callback) { 
     var request = window.ActiveXObject ? 
      new ActiveXObject('Microsoft.XMLHTTP') : 
      new XMLHttpRequest; 

     request.onreadystatechange = function() { 
     if (request.readyState == 4) { 
      request.onreadystatechange = doNothing; 
      callback(request, request.status); 
     } 
     }; 

     request.open('GET', url, true); 
     request.send(null); 
    } 

    function doNothing() {} 

    //]]> 

    </script> 

    </head> 

    <body onload="load()"> 
    <div id="map" style="width: 500px; height: 300px"></div> 
    </body> 

</html> 

現在最後PHP部分女巫管理從數據庫中獲取數據:

<?php 

// Start XML file, create parent node 

$dom = new DOMDocument("1.0"); 
$node = $dom->createElement("markers"); 
$parnode = $dom->appendChild($node); 

// Opens a connection to a MySQL server 

mysql_connect("localhost", "root", "") or 
     die("Could not connect: " . mysql_error()); 
mysql_select_db("arabia"); 

// Select all the rows in the markers table 

$query = "SELECT * FROM markers WHERE 1"; 
$result = mysql_query($query); 
if (!$result) { 
    die('Invalid query: ' . mysql_error()); 
} 

header("Content-type: text/xml"); 

// Iterate through the rows, adding XML nodes for each 

while ($row = @mysql_fetch_assoc($result)){ 
    // ADD TO XML DOCUMENT NODE 
    $node = $dom->createElement("marker"); 
    $newnode = $parnode->appendChild($node); 
    $newnode->setAttribute("name",$row['name']); 
    $newnode->setAttribute("address", $row['address']); 
    $newnode->setAttribute("lat", $row['lat']); 
    $newnode->setAttribute("lng", $row['lng']); 
    $newnode->setAttribute("type", $row['type']); 
} 

echo $dom->saveXML(); 

?> 

現在一切運行良好,使用此代碼,整個問題都在客戶端視圖中心的HTML代碼行中:

新 google.maps.LatLng(30.0599153,31.2620199,13)|| map.setCenter(marker.getPosition()),

,我需要它的引腳管理員之前戴上中心。

+0

看來我誤解了你的問題。你從數據庫中讀取了多少個標記。一個還是很多?如果你有很多標記,你怎麼知道哪一個用於中心?你使用'type'屬性嗎? –

+0

@AntoJurković您從數據庫中讀取了多少個標記?對於每個項目將是一張地圖,所以項目將通過項目ID讀取一張地圖。 – Mikky

回答

0

更新:這部分的回答僅對管理員端有效。

更新地圖點擊處理與map.setCenter(event.latLng);

google.maps.event.addListener(map, "click", function(event) { 
    marker = new google.maps.Marker({ 
     position: event.latLng, 
     map: map 
    }); 

    map.setCenter(event.latLng); 

    google.maps.event.addListener(marker, "click", function() { 
     infowindow.open(map, marker); 
    }); 
}); 

更新:這個答案的一部分是客戶端。

地圖有一個像被初始化:

var map = new google.maps.Map(document.getElementById("map"), { 
    center: new google.maps.LatLng(30.0599153,31.2620199,13), 
    zoom: 13, 
    mapTypeId: 'roadmap' 
    }); 

如果你有比你應該使用方法setCenter()像(for環路的一部分)只有一個標誌:

  var marker = new google.maps.Marker({ 
      map: map, 
      position: point, 
      icon: icon.icon 
      }); 
      map.setCenter(point); 

如果你有很多的標記比你可以使用方法fitBounds(),更改for循環:

var latlngBounds = new google.maps.LatLngBounds(); 

    for (var i = 0; i < markers.length; i++) { 
      var name = markers[i].getAttribute("name"); 
      var address = markers[i].getAttribute("address"); 
      var type = markers[i].getAttribute("type"); 
      var point = new google.maps.LatLng(
       parseFloat(markers[i].getAttribute("lat")), 
       parseFloat(markers[i].getAttribute("lng"))); 
      var html = "<b>" + name + "</b> <br/>" + address; 
      var icon = customIcons[type] || {}; 
      var marker = new google.maps.Marker({ 
      map: map, 
      position: point, 
      icon: icon.icon 
      }); 

      latlngBounds.extend(point); 

      bindInfoWindow(marker, map, infoWindow, html); 
    } 

    map.fitBounds(latlngBounds); 

將設置該方式地圖,以便所有標記都可見。

+0

我做到了,但沒有運氣我用你的代碼編輯了兩個文件客戶端和管理員,但仍然沒有得到中間的標記 – Mikky

+0

我仍然看到它放在同一個經緯線上,我把這條線 'new google .maps.LatLng(30.0599153,31.2620199,13)'我將此行替換爲'center:new google.maps.LatLng(30.0599153,31.2620199,13)|| map.setCenter(event.latLng),' – Mikky

+0

I don'不知道你把那條線放在哪裏?作爲地圖初始化的「中心:」?你只能在那裏使用有效的latLng。 –

相關問題