Google maps geeft niet alle markers weer op de kaart, maar wel in de html-code

Status
Niet open voor verdere reacties.

peps03

Gebruiker
Lid geworden
20 nov 2009
Berichten
93
Hoi allen,

Google maps moet een aantal markers op een kaart van een stad weergeven van kantoorpanden, de adres-gegevens komen uit een database. het probleem is dat google maps niet alle markers weergeeft, in de html code (view source van de pagina) staan echter wel alle markers weergegeven. Bij kleine aantallen (4 markers) worden ze wel alle weergegeven, bij 30 markers meestal maar 10 a 15.

Ik probeer nu al dagen dit probleem op te lossen en heb volgens mij al alle site bezocht waar google maps in voor komt maar over dit probleem vind ik weinig.

Voor de zekerheid hier de code

PHP:
<script type="text/javascript">
					//<![CDATA[				
	
						$(function(){
	
							if(GBrowserIsCompatible()) {
								
								var map = new GMap2(document.getElementById("bigmap"));
								var geo = new GClientGeocoder();
								var icon = new GIcon();
									icon.image = "<?php echo $_BASEURL_SITE ?>images/marker.gif";
									icon.iconSize = new GSize(25,25);
									icon.transparent = "<?php echo $_BASEURL_SITE ?>images/marker_ie.png";
									icon.iconAnchor = new GPoint(12,13);
									icon.infoWindowAnchor  = new GPoint(25,0);
									

								/** zoom city */	
								geo.getLatLng(
									"<?php echo $this->navigation->parsedPlaats() ?>, Nederland",
									function(point) {
									  if (!point) {
										
									  } else {
										map.setCenter(point, 10);																			
									  }
									}
								);									
								
								<?php
								$pc = count($results);
								for($p=0; $p<$pc; $p++){
	
									$oId = $results[$p];
									$city = getObjectField($oId, "plaats");
									$postal = getObjectField($oId, "postcode");
									$address = getObjectField($oId, "adres");
									if($city != -1){
										$city = getObjectField($city, "naam");
									}
									$url = FriendlyURLs::getObjectURL($city, $oId);							
								
								?>	
									geo.getLatLng(
										"<?php echo $address .", ". $postal ?>, Nederland",
										function(point) {
										  if (!point) {

										  } else {
											var marker = new GMarker(point, {
												icon: icon,
												title: "<?php echo $address .", ". $city ?>"
											});		
											GEvent.addListener(marker, "click", function() {
												marker.openInfoWindowHtml('<div><a href="<?php echo $url ?>"><?php echo $address .", ". $city ?></a><br /><?php $this->util->outputFirstThumbnail($oId) ?></div>');
											});
											map.addOverlay(marker);
										  }
										}
									);	
									
								<?php
								}	
								?>							
								
								map.addControl(new GSmallMapControl());
								map.addControl(new GMapTypeControl());
								map.disableScrollWheelZoom(); 
								
								$(document).unload(function(){
									GUnload();
								});
							}							
						});					
					
					//]]>
					</script>

Heeft iemand hier ervaring mee of een idee hoe ik dit moet oplossen?

Alvast erg bedankt!
 
ik heb weer wat onderzoek gedaan, nu las ik het volgende:

You don't get all the markers on the map because you request too many geocoding requests at once.
You should either store the coordinates, either add a time interval between the requests.

het opslaan van de coordinaten is niet haalbaar. dus moet ik een time interval toevoegen.

hoe doe ik dit en waar in de code?

heb dit geprobeerd:
setTimeout("point()", 100);

dit werkte niet..
 
Waarom is het opslaan van de coordinaten niet haalbaar?
Het is juist efficienter om ze in de database op te slaan, zo hoef je niets steeds de geocoder te gebruiken.
De enige keer is bij het opslaan in de database, de keren daarna heeft ie de coordinaten al en kan ze dus meteen plaatsen.

Overigens kun je beter een XML-bestand gebruiken voor het opvragen van je markers in plaats van PHP-code te gebruiken om steeds dezelfde code te genereren.

Voorbeeld kun je hier vinden: http://code.google.com/apis/maps/articles/phpsqlajax.html
 
dank voor je reactie!

dit zou inhouden dat de halve site omgebouwd zou moeten worden om max 50 markers op een map te kunnen weergeven? op internet is te lezen dat het tot ongeveer 200 a 300 markers geen problemen zou moeten opleveren als ik het goed heb..

hoe zou het evt werken om dmv een xml bestand de markers te genereren?

er is dus geen simpele manier om het weergeven van alle markers voor elkaar te krijgen (dit zijn er nu overigens 30)

Alvast bedankt!
 
Hoi peps03,
Heb je setInterval() al geprobeerd *) ?

Met vriendelijke groet,
CSShunter

*)
The setTimeout function delays for a specified time period and then triggers execution of a specified function. Once the function is triggered the setTimeout has finished.

The setInterval function also delays for a specified time (...) after triggering (...) it waits for the specified time again and then triggers the function again and continues to repeat this process of triggering the function at the specified intervals until either the web page is unloaded or the clearInterval function is called.
 
Laatst bewerkt:
thanks voor de reactie!

moet ik dat setinterval op deze manier invoegen?

Code:
geo.getLatLng(
	"<?php echo $address .", ". $postal ?>, Nederland",
		function(point) {
	        if (!point) {

		 } else {
		var marker = new GMarker(point, {
		icon: icon,
        	title: "<?php echo $address .", ". $city ?>"
		});		
		GEvent.addListener(marker, "click", function() {
		marker.openInfoWindowHtml('<div><a href="<?php echo $url ?>"><?php echo $address .", ". $city ?></a><br /><?php $this->util->outputFirstThumbnail($oId) ?></div>');
		});
		map.addOverlay(marker);
		setInterval(point, 100);
		  }
	}

het werkt nl nog niet..

Alvast bedank!
 
Laatst bewerkt:
Extra velden in je database zetten bij de adressen
[sql]
ALTER TABLE `tabel` ADD `lat` FLOAT( 10, 6 ) NOT NULL ,
ADD `lng` FLOAT( 10, 6 ) NOT NULL ;
[/sql]

Waarbij je `tabel` wijzigt in de juiste tabelnaam.

Vervolgens heb je deze functie nodig om overal een coordinaat bij te krijgen:
Ik ga uit van een database structuur waarin je een ID meegeeft aan je adressen, een adres (straatnaam + huisnummer) en een plaats.

Mocht jij een andere structuur hanteren kun je de code eventueel aanpassen of even de databasestructuur doorgeven :)
PHP:
<?php
$conn = mysql_connect("localhost", "GEBRUIKER", "WACHTWOORD");
$db = mysql_select_db("DATABASE_NAAM");


function getLatLng() {
	/* BEGIN CONFIGURATIE */
	
	// Database tabelnaam
	$table		=	'test';
	// URL naar Google Maps Geocoder
	$gMap_URL	=	'http://maps.google.com/maps/api/geocode/xml?sensor=false';
	
	/* EINDE CONFIGURATIE, WIJZIGINGEN HIERONDER ZIJN OP EIGEN RISICO */
	$addressQuery		= "SELECT id, address, city FROM ". $table ." WHERE lng = 0 AND lat = 0";
	$addressResult		= mysql_query($addressQuery);
	if($addressResult) {
		$addressArray	= array();
		while($addressRow = mysql_fetch_assoc($addressResult)){
			$addressArray[] = $addressRow;
		}
		$addressCount	= count($addressArray);
		$result			= 'Aantal adressen om te geocoden: '. $addressCount .'<br /><br />';
		$succesCount	= 0;
		$failCount		= 0;
		if($addressCount > 0) {
			for($i = 0; $i < $addressCount; $i++) {
				$delay				= 0;
				$geocode_pending 	= true;
				$attempt			= 1;
				while ($geocode_pending) {
					$address		= $addressArray[$i]['address'] .' '. $addressArray[$i]['city'];
					$request_url	= $gMap_URL . "&address=" . urlencode($address);
					
					$result			.= 'Adres "'. $address ."': ";
					
					$xml			= simplexml_load_file($request_url);
					//print_r($xml);
					if(!$xml) {
						$result		.= 'Fout opgetreden bij het laden van XML bestand.<br />';
						$failCount	+= 1;
					} else {
						$status = $xml->status;
						if ($status == "OK") {
							// Geocoden is gelukt
							$geocode_pending		= false;
							$updateAddressQuery		= "UPDATE ". $table ." SET
															lng = ". mysql_real_escape_string($xml->result->geometry->location->lng) .",
															lat = ". mysql_real_escape_string($xml->result->geometry->location->lat) ."
														WHERE id = ". mysql_real_escape_string($addressArray[$i]['id']);
							$updateAddressResult	= mysql_query($updateAddressQuery);
							if($updateAddressResult) {
								$result				.= 'Geocoden gelukt bij poging '. $attempt .'<br />';
								$succesCount		+= 1;
							} else {
								$result				.= 'Fout opgetreden bij het opslaan in de database. MySQL zegt: '. mysql_error() .'<br />';
								$failCount			+= 1;
							}
						} else {
							if($attempt > 3) {
								$geocode_pending	= false;
								$result				.= 'Geocoden mislukt na 3 pogingen. <br />';
								$failCount			+= 1;
							} else {
								$delay				+= 100000;
								$result				.= 'Status "'. $status .'", vertraging verhoogd naar '. $delay .' bij poging '. $attempt .'<br />';
								$attempt			+= 1;
							}
						}
						usleep($delay);
					}
				}
			}
			// Geef de verzamelde output terug
			return $result;
		} else {
			return 'Er zijn geen adressen om te geocoden';
		}	
	} else {
		return 'Er is een fout opgetreden bij het laden van de adressen zonder coordinaten! MySQL zegt: '. mysql_error();	
	}
}
echo getLatLng();
?>
Volledig werkend met de nieuwe Google Maps API v3

Vervolgens een XML-bestand laten genereren:
xml.php
PHP:
header("Content-type: text/xml");
// Database gegevens
$conn		= mysql_connect("localhost", "GEBRUIKER", "WACHTWOORD");
$db			= mysql_select_db("DATABASE_NAAM");
$table		= 'test';


$dom			= new DOMDocument("1.0");
$node 			= $dom->createElement("markers");
$parnode		= $dom->appendChild($node);
$addressQuery	= "SELECT address, city, lng, lat FROM ". $table;
$addressResult	= mysql_query($addressQuery);
if($addressResult) {
	while($addressRow = mysql_fetch_assoc($addressResult)){
		$node = $dom->createElement("marker");
		$newnode = $parnode->appendChild($node);
		$newnode->setAttribute("address", $addressRow['address'] .' '. $addressRow['city']);
		$newnode->setAttribute("lat", $addressRow['lat']);
		$newnode->setAttribute("lng", $addressRow['lng']);
	}
	echo $dom->saveXML();
}

En dan het weergeven op een pagina:
[js]
var map;
function load() {
if (GBrowserIsCompatible()) {
map = new GMap2(document.getElementById("map"));
map.addControl(new GSmallMapControl());
map.addControl(new GMapTypeControl());
map.setCenter(new GLatLng(52.696011, 6.192024), 13);
loadPoints("xml.php");
}
}

function loadPoints(file) {
GDownloadUrl(file, function(data) {
var xml = GXml.parse(data);
var markers = xml.documentElement.getElementsByTagName("marker");
for (var i = 0; i < markers.length; i++) {
var address = markers.getAttribute("address");
var point = new GLatLng(parseFloat(markers.getAttribute("lat")), parseFloat(markers.getAttribute("lng")));
var marker = createMarker(point, address);
map.addOverlay(marker);
}

});
}

function createMarker(point, address) {
var marker = new GMarker(point);
var html = "<b>" + address + "</b>";
GEvent.addListener(marker, 'click', function() {
marker.openInfoWindowHtml(html);
});
return marker;
}
[/js]
Het javascript zou ik wel nakijken, het werkt nu wel maar het kan zijn dat er zaken zijn welke in Maps API v3 zijn gewijzigd of verbeterd

De meeste code had ik nog liggen, enkel de functie voor het ophalen van de coordinaten is aardig herschreven.
Succes :thumb:
 
zo! hartelijk bedankt! dit waardeer ik!

heb ik weer wat om me in vast te bijten! ga er meteen me aan de slag!
 
als we dan toch op de database tour gaan, en overstappen naar google maps v3 en een xml bestand, kan er nu ook makkelijk een veld worden toegevoegd voor de "point of view van google streetview"? en waar zou die ingevoerd moeten worden? in het CMS door de beheerder van de site, of kan google dat ook zelf genereren?

thx!
 
Je zou het in de database kunnen opslaan, maar zult die waardes wel zelf moeten invullen.
Google kan niet zelf bepalen wat jij wilt zien (welke kant)

Hoe je het dan gaat tonen wordt nog een leuke puzzel, waarschijnlijk een linkje in de windowHTML welke de streetview activeert.
 
nou, ik heb het nu zover dat (met mijn oude code) wanneer je op een locatie klikt op de grote kaart (met het overzicht van alle locaties in de stad) je dan naar dat pand gaat. je krijgt dan zowel details van het pand te zien, als weer een map met alleen de marker van het pand erop en daaronder google streetview, maar dat is op adres, dus hij wijst inderdaad standaard naar het noorden..
 
Devil,

heb het een en ander aangepast en geprobeerd.
ik krijg nu de volgende foutmelding: Fatal error: Maximum execution time of 60 seconds exceeded in D:\My Dropbox\Websites\******.nl\scripts\class.content.php on line 584

het element ID gebruik ik volgens mij niet, evenals address en city.. dit lijkt allemaal in het field "name"te staan.

dit is een (heel kort) overzicht van de tabel: fn_object ($table = 'fn_object';)


oId creation_date last_modified name lat lng object_type parent active sort
1589 2009-01-16 14:50:38 2009-01-22 12:27:29 Herengracht Regus 0.000000 0.000000 1 1581 1 9
1590 2009-01-16 14:56:06 2010-02-09 15:44:39 Herengracht 0.000000 0.000000 2 1589 1 1
1591 2009-01-16 15:00:03 2009-01-26 14:45:32 Herengracht1 0.000000 0.000000 2 1589 1 2
1592 2009-01-16 15:00:56 2009-01-26 14:45:42 Herengracht2 0.000000 0.000000 2 1589 1 3
1593 2009-01-16 15:01:24 2009-01-26 14:45:50 Herengracht3 0.000000 0.000000 2 1589 1 4
1594 2009-01-16 15:01:58 2009-01-26 14:45:59 Herengracht4 0.000000 0.000000 2 1589 1 5
1595 2009-01-16 15:02:26 2009-01-26 14:46:08 Herengracht5 0.000000 0.000000 2 1589 1 6
1599 2009-01-16 15:34:35 2009-01-22 12:27:08 Zuidplein Regus 0.000000 0.000000 1 1581 1 7

ik heb dit:
$addressQuery = "SELECT id, address, city FROM ". $table ." WHERE lng = 0 AND lat = 0";
aangepast in:
$addressQuery = "SELECT name FROM ". $table ." WHERE lng = 0 AND lat = 0";

en in het xml bestand:
dit:
$addressQuery = "SELECT address, city, lng, lat FROM ". $table;
in:
$addressQuery = "SELECT name, lng, lat FROM ". $table;

kan jij hier iets mee?

Ik hoop het! Wederom alvast bedankt!
 
Laatst bewerkt:
Wat is dan je primaire sleutel?

Er moet een veld zijn dat uniek is wil het een primaire sleutel kunnen zijn
 
ik vermoed field "oId'..

heb het bericht hiervoor aangepast, hopelijk schept dit iets meer duidelijkheid!
 
of zou er informatie uit andere tabellen nodig zijn?

zie net dat:
parent 1395 = stad (1399, 1397 trouwens ook)

heb je wat aan deze informatie:

PHP:
f(count($locationIds) > 0){
			$sql = "SELECT DISTINCT f.oId".
					" FROM fn_object AS f".
					" JOIN fn_object_field_smalltext AS s ON f.oId = s.oId".
					" WHERE f.active".
					" AND s.tfId = ". getTemplateFieldIdByName("ruimte", "plaats");
					
			if(count($locationIds) > 1){
				$sql .= " AND s.value IN (". implode($locationIds, ',') .")"; 
			}else{
				$sql .= " AND s.value = ". $locationIds[0]; 
			}

dit wordt volgens mij gebruikt om de locaties per stad te genereren, dus de marker adressen..
 
Laatst bewerkt:
Is er geen tabel waarin de normaal geformateerde adressen staan?

Dus een tabel met een kolom voor het adres en eentje voor de stad?
Nu staat het huisnummer ook direct achter de straatnaam, wat het alweer moeilijker maakt te filteren.

Als de steden nu in een andere tabel staan dan mis ik de koppeling daarnaar in de gegeven tabel.

Een database hoort makkelijk te benaderen informatie te bevatten zonder allerlei bewerkingen naderhand te hoeven doen :(
 
nee, dat is dus het ellendige.

in die tabel staat alles onder name.. maar dan zijn er verschillende kenmerken aan verbonden om het adres samen te stellen. maar de logica erachter heb ik nog niet gevonden.

is er niks af te leiden uit die paar regels code die ik hiervoor heb gepost? deze roepen als het goed is de adressen op waarvan we de markers willen hebben.
 
Devil,

Is hier iets uit af te leiden:

PHP:
f(count($locationIds) > 0){
            $sql = "SELECT DISTINCT f.oId".
                    " FROM fn_object AS f".
                    " JOIN fn_object_field_smalltext AS s ON f.oId = s.oId".
                    " WHERE f.active".
                    " AND s.tfId = ". getTemplateFieldIdByName("ruimte", "plaats");
                    
            if(count($locationIds) > 1){
                $sql .= " AND s.value IN (". implode($locationIds, ',') .")"; 
            }else{
                $sql .= " AND s.value = ". $locationIds[0]; 
            }

dit roept nl een overzicht van adressen en de markers op..
 
Laatst bewerkt:
kan iemand uit de in de vorige reactie geposte code afleiden of daarmee de adressen van de locaties worden opgeroepen?
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan