Google Maps αναζήτηση γύρω απο κάποια Διεύθυνση

Σε αυτή την περιοχή μπορείτε να βρείτε ή να αναζητήσετε πληροφορίες σχετικές με την PHP

Συντονιστές: WebDev Moderators, Super-Moderators, PHP Moderators

Απάντηση
alot
Δημοσιεύσεις: 6
Εγγραφή: 25 Ιούλ 2012 05:16

Google Maps αναζήτηση γύρω απο κάποια Διεύθυνση

Δημοσίευση από alot » 26 Σεπ 2012 06:11

Προσπαθώ να φτιάξω μια φόρμα που θα δηλώνεις την διεύθυνση και θα σου δείχνει ποια καταστήματα βρίσκονται σε κάποια ακτίνα από την διεύθυνση(2.5 χλμ, 5χλμ, 13χλμ κλπ). Τα καταστήματα είναι ήδη στη βάση δεδομένων με υπολογισμένα long, lat. Δεν τα έχω καταχωρήσει όμως σε xml γιατι δεν είμαι σίγουρος αν πρέπει να δημιουργείται κάποιο xml κάθε φορά ανάλογα με τη διεύθυνση. Έπειτα θέλω να εμφανίζεται σε ένα χάρτη με πινέζες (υπάρχει ήδη λύση για αυτό από ότι είδα στο forum). Οποιαδήποτε βοήθεια θα είναι θεόσταλτη! Ευχαριστω εκ των προτέρων

Άβαταρ μέλους
fafos
Script Master
Δημοσιεύσεις: 6230
Εγγραφή: 30 Νοέμ 2004 03:09

Google Maps αναζήτηση γύρω απο κάποια Διεύθυνση

Δημοσίευση από fafos » 26 Σεπ 2012 15:03

Οι πάνες και οι πολιτικοί πρέπει να αλλάζονται συχνά για τον ίδιο λόγο...

alot
Δημοσιεύσεις: 6
Εγγραφή: 25 Ιούλ 2012 05:16

Google Maps αναζήτηση γύρω απο κάποια Διεύθυνση

Δημοσίευση από alot » 26 Σεπ 2012 16:41

Ευχαριστώ fafos για τη γρήγορη απάντησή σου, αυτό φαίνεται να ειναι. θα το προσπαθήσω. Αν χρειαστεί κάτι θα ξαναρωτήσω

alot
Δημοσιεύσεις: 6
Εγγραφή: 25 Ιούλ 2012 05:16

Google Maps αναζήτηση γύρω απο κάποια Διεύθυνση

Δημοσίευση από alot » 27 Σεπ 2012 06:42

Το πρόβλημα παραμένει. Έχω κάνει βήμα-βήμα αυτά που λέει το tutorial που μου πρότεινες παραπάνω. Το αρχείο που δημιουργεί το xml είναι :
<?php
require("connection.php");

// Get parameters from URL
$center_lat = $_GET["lat"];
$center_lng = $_GET["lng"];
$radius = $_GET["radius"];

// 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
$connection = mysql_connect(DB_SERVER,DB_USER,DB_PASS);
if (!$connection) {
die("Not connected : " . mysql_error());
}

// Set the active mySQL database
$db_selected = mysql_select_db(DB_NAME,$connection);
if (!$db_selected) {
die ("Can\'t use db : " . mysql_error());
}

// Search the rows in the markers table
$query = sprintf("SELECT address, city, zip, title, brand, lat, lng, ( 6371 * acos( cos( radians('%s') ) * cos( radians( lat ) ) * cos( radians( lng ) - radians('%s') ) + sin( radians('%s') ) * sin( radians( lat ) ) ) ) AS distance FROM records HAVING distance > '%s' ORDER BY distance LIMIT 0 , 200",
mysql_real_escape_string($center_lat),
mysql_real_escape_string($center_lng),
mysql_real_escape_string($center_lat),
mysql_real_escape_string($radius));
$result = mysql_query($query);

$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)){
$node = $dom->createElement("marker");
$newnode = $parnode->appendChild($node);
$newnode->setAttribute("name", $row['brand'].' : '.$row['title']);
$newnode->setAttribute("address", $row['address'].','.$row['city'].','.$row['zip']);
$newnode->setAttribute("lat", $row['lat']);
$newnode->setAttribute("lng", $row['lng']);
$newnode->setAttribute("distance", $row['distance']);
}

echo $dom->saveXML();
?>

για να δω αποτελέσματα πρέπει στο // Search the rows in the markers table
$query = sprintf("SELECT address, city, zip, title, brand, lat, lng, ( 6371 * acos( cos( radians('%s') ) * cos( radians( lat ) ) * cos( radians( lng ) - radians('%s') ) + sin( radians('%s') ) * sin( radians( lat ) ) ) ) AS distance FROM records HAVING distance > '%s' ORDER BY distance LIMIT 0 , 200",
mysql_real_escape_string($center_lat),
mysql_real_escape_string($center_lng),
mysql_real_escape_string($center_lat),
mysql_real_escape_string($radius)); να βάλω >20 και όχι <20

το HTML έχει ως εξής

<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="content-type" content="text/html; charset=utf-8"/>
<meta name="viewport" content="initial-scale=1.0, user-scalable=no" />
<title>Google Maps AJAX + mySQL/PHP Example</title>
<script src="http://maps.googleapis.com/maps/api/js?sensor=false"
type="text/javascript"></script>
<script type="text/javascript">
//<![CDATA[
var map;
var markers = [];
var infoWindow;
var locationSelect;

function load() {
map = new google.maps.Map(document.getElementById("map"), {
center: new google.maps.LatLng(40, -100),
zoom: 4,
mapTypeId: 'roadmap',
mapTypeControlOptions: {style: google.maps.MapTypeControlStyle.DROPDOWN_MENU}
});
infoWindow = new google.maps.InfoWindow();

locationSelect = document.getElementById("locationSelect");
locationSelect.onchange = function() {
var markerNum = locationSelect.options[locationSelect.selectedIndex].value;
if (markerNum != "none"){
google.maps.event.trigger(markers[markerNum], 'click');
}
};
}

function searchLocations() {
var address = document.getElementById("addressInput").value;
var geocoder = new google.maps.Geocoder();
geocoder.geocode({address: address}, function(results, status) {
if (status == google.maps.GeocoderStatus.OK) {
var here = results[0].geometry.location;
searchLocationsNear(here);
} else {
alert(address + ' not found');
}
});
}


function clearLocations() {
infoWindow.close();
for (var i = 0; i < markers.length; i++) {
markers.setMap(null);
}
markers.length = 0;

locationSelect.innerHTML = "";
var option = document.createElement("option");
option.value = "none";
option.innerHTML = "See all results:";
locationSelect.appendChild(option);
}

function searchLocationsNear(center) {
clearLocations();

var radius = document.getElementById('radiusSelect').value;
var searchUrl = 'phpsqlsearch_genxml.php?lat=' + center.lat() + '&lng=' + center.lng() + '&radius=' + radius;
downloadUrl(searchUrl, function(data) {
var xml = parseXml(data);
var markerNodes = xml.documentElement.getElementsByTagName("marker");
var bounds = new google.maps.LatLngBounds();
for (var i = 0; i < markerNodes.length; i++) {
var name = markerNodes.getAttribute("name");
var address = markerNodes.getAttribute("address");
var distance = parseFloat(markerNodes.getAttribute("distance"));
var latlng = new google.maps.LatLng(
parseFloat(markerNodes.getAttribute("lat")),
parseFloat(markerNodes.getAttribute("lng")));

createOption(name, distance, i);
createMarker(latlng, name, address);
bounds.extend(latlng);
}
map.fitBounds(bounds);
locationSelect.style.visibility = "visible";
locationSelect.onchange = function() {
var markerNum = locationSelect.options[locationSelect.selectedIndex].value;
google.maps.event.trigger(markers[markerNum], 'click');
};
});
}

function createMarker(latlng, name, address) {
var html = "<b>" + name + "</b> <br/>" + address;
var marker = new google.maps.Marker({
map: map,
position: latlng
});
google.maps.event.addListener(marker, 'click', function() {
infoWindow.setContent(html);
infoWindow.open(map, marker);
});
markers.push(marker);
}

function createOption(name, distance, num) {
var option = document.createElement("option");
option.value = num;
option.innerHTML = name + "(" + distance.toFixed(1) + ")";
locationSelect.appendChild(option);
}

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 parseXml(str) {
if (window.ActiveXObject) {
var doc = new ActiveXObject('Microsoft.XMLDOM');
doc.loadXML(str);
return doc;
} else if (window.DOMParser) {
return (new DOMParser).parseFromString(str, 'text/xml');
}
}

function doNothing() {}

//]]>
</script>
</head>

<body style="margin:0px; padding:0px;" onload="load()">
<div>
<input type="text" id="addressInput" size="10"/>
<select id="radiusSelect">
<option value="0.5" selected>500μ.</option>
<option value="1">1χλμ</option>
<option value="1.5">1,5χλμ</option>
<option value="2">2χλμ</option>
<option value="3">3χλμ</option>
<option value="5">5χλμ</option>
<option value="10">10χλμ</option>
<option value="20">20χλμ</option>
</select>

<input type="button" onclick="searchLocations()" value="Search"/>
</div>
<div><select id="locationSelect" style="width:100%;visibility:hidden"></select></div>
<div id="map" style="width: 100%; height: 80%"></div>
</body>
</html>

Το θέμα τώρα είναι ότι βάζω οποιαδήποτε διεύθυνση και με πηγαίνει στην μέση του Ειρηνικού! Η δομή της database μου είναι

1 prim_aa int(11) Όχι Καμία AUTO_INCREMENT
2 date_added varchar(10) utf8_general_ci Ναι NULL
3 brand varchar(250) utf8_general_ci Ναι NULL
4 afm varchar(10) utf8_general_ci Ναι NULL
5 title varchar(162) utf8_general_ci Ναι NULL
6 address varchar(69) utf8_general_ci Ναι NULL
7 location varchar(10) utf8_general_ci Ναι NULL
8 zip varchar(5) utf8_general_ci Ναι NULL
9 city varchar(29) utf8_general_ci Ναι NULL
10 phone1 varchar(11) utf8_general_ci Ναι NULL
11 phone2 varchar(11) utf8_general_ci Ναι NULL
12 fax varchar(10) utf8_general_ci Ναι NULL
13 email varchar(30) utf8_general_ci Ναι NULL
14 website_link varchar(10) utf8_general_ci Ναι NULL
15 map varchar(10) utf8_general_ci Ναι NULL
16 lng float(10,6) Ναι NULL
17 lat float(10,6) Ναι NULL
18 description varchar(551) utf8_general_ci Ναι NULL
19 category varchar(10) utf8_general_ci Ναι NULL
20 subcategory varchar(10) utf8_general_ci Ναι NULL
21 prime_entry varchar(10) utf8_general_ci Ναι NULL
22 prime_entry_start varchar(10) utf8_general_ci Ναι NULL
23 prime_entry_end varchar(10) utf8_general_ci Ναι NULL
24 prime_entry_pro varchar(10) utf8_general_ci Ναι NULL
25 prime_entry_pro_start varchar(10) utf8_general_ci Ναι NULL
26 prime_entry_pro_end varchar(10) utf8_general_ci Ναι NULL


Υπάρχει κάποιο λάθος και δεν βρίσκω ποιο! Pls HELP!
Υ.Γ. Όταν αλλάζω το query σε > 20 μου βγάζει τα μαγαζιά κάπου στον λίβανο....

Άβαταρ μέλους
fafos
Script Master
Δημοσιεύσεις: 6230
Εγγραφή: 30 Νοέμ 2004 03:09

Google Maps αναζήτηση γύρω απο κάποια Διεύθυνση

Δημοσίευση από fafos » 27 Σεπ 2012 15:46

1. vale ton kodika sta tags

Κώδικας: Επιλογή όλων

 [/code ] giati mas stravoses...

2. to radius gia thn google einai se milia opote prepei na to kaneis etsi gia xiliometra: 
$radius = $_GET["radius"] / 1.609;

3. gia na se vgazei ston eirhniko mallon dineis anapoda tis syntetagmenes (to latitude sto longitude kai anapoda)
Οι πάνες και οι πολιτικοί πρέπει να αλλάζονται συχνά για τον ίδιο λόγο...

Απάντηση

Επιστροφή στο “PHP Προγραμματισμός”

Μέλη σε σύνδεση

Μέλη σε αυτήν τη Δ. Συζήτηση: Δεν υπάρχουν εγγεγραμμένα μέλη και 0 επισκέπτες