End XML file
echo '</markers>';
Now you can add the display map page to webERP.
Create a file called displaymap.php.
You need to set the API key again.
You need to set the centre of the map to where your business is, and the zoom level.
You also need to set the google map height and width to suit your screen resolution.
<?
$PageSecurity = 3;
include ('includes/session.inc');
$title = _('Geocoded Customer Branches Report');
var iconBlue = new GIcon();
var iconRed = new GIcon();
iconRed.image = '
http://labs.google.com/ridefinder/images/mm_20_red.png'∞;
iconRed.shadow = '
http://labs.google.com/ridefinder/images/mm_20_shadow.png'∞;
iconRed.iconSize = new GSize(12, 20);
iconRed.shadowSize = new GSize(22, 20);
iconRed.iconAnchor = new GPoint(6, 20);
iconRed.infoWindowAnchor = new GPoint(5, 1);
var customIcons = [];
customIcons["commercial"] = iconBlue;
customIcons["domestic"] = iconRed;
function load() {
if (
GBrowserIsCompatible()) {
var map = new
GMap2(document.getElementById("map"));
map.addControl(new
GSmallMapControl());
map.addControl(new
GMapTypeControl());
map.setCenter(new
GLatLng(-37.813465, 144.878143), 10);
GDownloadUrl("geocode_genxml.php", function(data) {
var xml = GXml.parse(data);
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 GLatLng(parseFloat(markers[i].getAttribute("lat")),
parseFloat(markers[i].getAttribute("lng")));
var marker = createMarker(point, name, address, type);
map.addOverlay(marker);
}
});
function createMarker(point, name, address, type) {
var marker = new GMarker(point, customIcons[type]);
var html = "<b>" + name + "</b> <br/>" + address;
GEvent.addListener(marker, 'click', function() {
marker.openInfoWindowHtml(html);
});
return marker;
]]>
</script>
</head>
<body onload="load()" onunload="GUnload()">
<p>
<center><div align="center" id="map" style="width: 1300px; height: 600px"></div></center>
</p>
</body>
<?
include ('includes/footer.inc');
</html>
You can add a menu link to the google map by modifying webERP's index.php
from line 171, add
<tr>
<tr>
<td class="menu_group_item">
<?php echo "<A HREF='" . $rootpath . '/displaymap.php?' . SID . "'><LI>" . _('Geo Map of Customers') . '</LI></A>'; ?>
</td>
</tr>
Edited on 2008-02-07 15:29:34 by EmDee
Additions:
You need to get your own google maps API key.
First update your custbranch table to add the fields required:
Then add a new script, named geocode.php, modify the config variables to suit your setup:
This script when run will update all your customer branches with the latitude and longitude, and output any errors.
<?php
require("config.php");
Set the weberp database name
$database = 'your weberp database name';
define("MAPS_HOST", "maps.google.com");
Remember to set your own API key
define("KEY", "your google maps api key");
Opens a connection to a MySQL server
$connection = mysql_connect("localhost", $dbuser, $dbpassword);
if (!$connection) {
die("Not connected : " . mysql_error());
}
Set the active MySQL database
$db_selected = mysql_select_db($database, $connection);
if (!$db_selected) {
die("Can\'t use db : " . mysql_error());
}
Select all the rows in the custbranch table
$query = "SELECT * FROM custbranch WHERE 1";
$result = mysql_query($query);
if (!$result) {
die("Invalid query: " . mysql_error());
}
Initialize delay in geocode speed
$delay = 0;
$base_url = "http://"∞ . MAPS_HOST . "/maps/geo?output=xml" . "&key=" . KEY;
Iterate through the rows, geocoding each address
while ($row = @mysql_fetch_assoc($result)) {
$geocode_pending = true;
while ($geocode_pending) {
$address = $row["braddress1"] . ", " . $row["braddress2"] . ", " . $row["braddress3"] . ", " . $row["braddress4"];
$id = $row["branchcode"];
$debtorno =$row["debtorno"];
$request_url = $base_url . "&q=" . urlencode($address);
$xml = simplexml_load_file($request_url) or die("url not loading");
$status = $xml->Response->Status->code;
if (strcmp($status, "200")
0) {
Successful geocode
$geocode_pending = false;
$coordinates = $xml->Response->Placemark->Point->coordinates;
$coordinatesSplit = split(",", $coordinates);
Format: Longitude, Latitude, Altitude
$lat = $coordinatesSplit[1];
$lng = $coordinatesSplit[0];
$query = sprintf("UPDATE custbranch " .
" SET lat = '%s', lng = '%s' " .
" WHERE branchcode = '%s' " .
" AND debtorno = '%s' LIMIT 1;",
mysql_real_escape_string($lat),
mysql_real_escape_string($lng),
mysql_real_escape_string($id),
mysql_real_escape_string($debtorno));
$update_result = mysql_query($query);
if (!$update_result) {
die("Invalid query: " . mysql_error());
}
} else if (strcmp($status, "620")
0) {
sent geocodes too fast
$delay += 100000;
} else {
failure to geocode
$geocode_pending = false;
echo "<p>Branchcode: " . $id . ", Address: " . $address . " failed to geocode.\n";
echo "Received status " . $status . "
\n</p>";
}
usleep($delay);
}
}
?>