Vraag & Antwoord

Webprogrammeren & scripting

DataSet, XML formaten voor Google Maps

23 antwoorden
  • In mijn eerdere topic van alweer een tijdje terug vroeg ik hoe ik Google Maps kon gebruiken met gegevens uit een database. (een enkele weergave) Dat is mij inmiddels gelukt en nu wil ik een stapje verder. Goed lezende wat er op de site vermeld wordt las ik dat ik voor het weergeven van diverse coördinaten een XML-bestandje kan gebruiken. Geen probleem, een XML-file maken lukt me prima. Maar mijn XML-file ziet er weer even anders uit dan Google wenst. Zo verwacht Google het: [code:1:8199d1de52]<markers> <marker lat="51.70366" lng="5.274436"/> <marker lat="51.688388" lng="5.30561"/> <marker lat="51.686161" lng="5.29806"/> <marker lat="51.689725" lng="5.300319"/> </markers>[/code:1:8199d1de52] Zo ziet mijn XML-file er ut: [code:1:8199d1de52]<?xml version="1.0" standalone="yes"?> <NewDataSet> <Table> <Latitude>51.70366</Latitude> <Longtitude>5.274436</Longtitude> </Table> <Table> <Latitude>51.688388</Latitude> <Longtitude>5.30561</Longtitude> </Table> <Table> <Latitude>51.686161</Latitude> <Longtitude>5.29806</Longtitude> </Table> <Table> <Latitude>51.689725</Latitude> <Longtitude>5.300319</Longtitude> </Table>[/code:1:8199d1de52] Nu heb ik 'marker' in onderstaande code gewijzigd in 'Table' En 'lat' in 'Latitude' en ten slotte 'lng' in 'Longtitude' [code:1:8199d1de52] // Download the data in data.xml and load it on the map. The format we // expect is: // <markers> // <marker lat="37.441" lng="-122.141"/> // <marker lat="37.322" lng="-121.213"/> // </markers> GDownloadUrl("wiep.xml", function(data, responseCode) { var xml = GXml.parse(data); var markers = xml.documentElement.getElementsByTagName("marker"); for (var i = 0; i < markers.length; i++) { var point = new GLatLng(parseFloat(markers[i].getAttribute("lat")), parseFloat(markers[i].getAttribute("lng"))); map.addOverlay(new GMarker(point)); }});[/code:1:8199d1de52] Maar dat werkt dus niet. Wie helpt me even op weg?
  • [quote:fbc81d6d7f="Wiep Corbier"]<knip> Maar dat werkt dus niet. Wie helpt me even op weg?[/quote:fbc81d6d7f] Volgens mij moet je niet de attributen hebben, maar gewoon de node values van je eigen xml. Effe puzzelen hoe je dat eruit moet krijgen, maar volgens mij moet het lukken met getElement. Ik zal ook wel wat proberen.
  • Hm, het is toch wat anders dan getElement (die komt van een site waar een functie getElement was gemaakt om een xml element terug te geven). Dit zou moeten werken: [code:1:058b44ecc3] var point = new GLatLng(parseFloat(markers[i].childNodes[1].firstChild.nodeValue), parseFloat(markers[i].childNodes[3].firstChild.nodeValue)); [/code:1:058b44ecc3] Waarbij markers[i].childNodes[1].nodeValue de waarde teruggeeft van het element 'Latitude' en markers[i].childNodes[3].nodeValue de waarde teruggeeft van het element 'Longtitude' (is dit trouwens niet longitude?)
  • Nope, werkt niet. Ik krijg wel netjes de kaart maar geen ballonnetjes
  • [quote:3924fd7c5d="Wiep Corbier"]Nope, werkt niet. Ik krijg wel netjes de kaart maar geen ballonnetjes[/quote:3924fd7c5d]Hm, [url=http://roozendaal.org/ct/]hier[/url] werkt het wel. En het enige verschil wat ik kan zien is dit: [i:3924fd7c5d]jouw voorbeeld[/i:3924fd7c5d] [code:1:3924fd7c5d] GDownloadUrl("wiep.xml", function(data, responseCode) { [/code:1:3924fd7c5d] [i:3924fd7c5d]mijn voorbeeld[/i:3924fd7c5d] [code:1:3924fd7c5d] GDownloadUrl("wiep.xml", function(data) { [/code:1:3924fd7c5d] En ik heb gewoon de [url=http://www.google.com/apis/maps/documentation/#Using_XML_and_Asynchronous_RPC]voorbeeldcode [/url] van de Google Maps API site gebruikt.
  • [quote:88ed38d8ba="meneer_ed"]Hm, [url=http://roozendaal.org/ct/]hier[/url] werkt het wel. [/quote:88ed38d8ba] Ik zie geen ballonnetjes hoor ??? Maar wel de melding: Error on page.
  • Ik zie ballonetjes op die pagina.
  • Kom ik daarom geen stap verder? Ik zie ze echt niet :cry:
  • Verdomd, met firefox zie ik ze ook. :lol: Moet dus een instellng van de browser zijn. :evil:
  • Rest de vraag: wat doe ik hier aan?
  • heb je javascript wel aan staan ? :) security settings iets lager zetten? Geeft hij error? etc..
  • [quote:f9ae329fe0="Wiep Corbier"]Rest de vraag: wat doe ik hier aan?[/quote:f9ae329fe0]Firefox gebruiken en aanbevelen ;)? Maar alle gekheid op een stokje: blijkbaar zijn er een hele hoop mensen met dit (IE) probleem (heb even een uurtje zitten [url=http://groups.google.com/group/Google-Maps-API/search?group=Google-Maps-API&q=IE6+object+GLatLng&qt_g=Search+this+group]googelen[/url]). Er worden wel oplossingen aangeboden, zoals de scripts vlak voor de </body>-tag zetten, maar die heb ik zelf even geprobeerd, en dat werkte voor mij niet. Maar misschien dat je er nog een oplossing tussen kunt vinden..
  • Andere aanpak: want met een XML-bestand gaat het niet goed. Elke bezoeker zou het XML-bestand immers weer veranderen en dat lijkt me geen goed plan. Daarom loop ik door een tabel en vul een Array als volgt: [code:1:cf6f068323] AccessDataSource ads1 = new AccessDataSource(); ads1.DataFile = "~/App_Data/databaseName.mdb"; ads1.SelectCommand = "SELECT CompanyName, lat, lng FROM tblcompany WHERE BrancheID = " + 36; ads1.DataSourceMode = SqlDataSourceMode.DataReader; OleDbDataReader rdr = (OleDbDataReader) ads1.Select(DataSourceSelectArguments.Empty); ArrayList ga = new ArrayList(); int i = 0; while (rdr.Read()) { string[] gi = new string[3]; gi[0] = rdr.GetString(0); gi[1] = rdr.GetString(1); gi[2] = rdr.GetString(2); ga.Add(gi); } [/code:1:cf6f068323] Het resultaat is bijvoorbeeld: Bouwbedrijf Drijvers 51.686209 5.268026 GZG 52.117972 5.285603 En nu? Nu moet ik dit resultaat waarschijnlijk in een JavaScript variabele (Array) zetten en daar vervolgens doorheen loopen. Wie helpt me verder?
  • Ik heb hem bijna: ik vertaal dit stukje php-code naar C# maar daar gaat nog iets fout. PHP [code:1:a4da3d5d55]{ echo "var point = new GLatLng(" . $row['lat'] . "," . $row['lon'] . ");\n"; echo "var marker = createMarker(point, '" . addslashes($row['description']) . "');\n"; echo "map.addOverlay(marker);\n"; echo "\n"; }[/code:1:a4da3d5d55] c# [code:1:a4da3d5d55] while (reader.Read()) Response.Write("var point = new GLatLng(" + reader[1].ToString() + "," + reader[2].ToString() + "));\n"); Response.Write("var marker = createMarker(point);\n)"); Response.Write("map.addOverlay(marker);\n"); Response.Write("\n"); }[/code:1:a4da3d5d55] Voor het hele PHP-verhaal kijk: http://www.map-server.com/googlemaps/tutorial_api2.html Als ik doe wat ik doe toont hij natuurlijk de coördinaten door die response.write. en dat moet niet, maar wat moet ik met/aan die 'echo' van php doen?
  • [quote:abecd2d076="Wiep Corbier"]Ik heb hem bijna: [/quote:abecd2d076] Ik heb hem helemaal ;) Je moet niet Response.Write gebruiken, maar met behulp van een StringBuilder object eerst de hele javascript functie genereren. Die moet je op de juiste plek zien te krijgen. Dat doe je als volgt. Voeg een literal toe aan de <head> sectie van je html. [code:1:abecd2d076] <head> <meta http-equiv="content-type" content="text/html; charset=utf-8"/> <title>Google Maps JavaScript API Example</title> <script src="http://maps.google.com/maps?file=api&v=2&key=<je eigen key>" type="text/javascript"></script> <asp:literal runat="server" id="cScript"></asp:literal> </head> [/code:1:abecd2d076] Je kan de Error "Unrecognized tag prefix..." negeren. Vervolgens voeg je in de code-behind de volgende code toe. [code:1:abecd2d076] protected void Page_Load(object sender, EventArgs e) { if(!IsPostBack) { // Dit is code die je xml bestand in een dataset stopt, // vervang dit door je eigen code om de gegevens uit // de database te halen string xmlFile = Server.MapPath("wiep.xml"); DataSet ds = new DataSet(); System.IO.FileStream fs = new FileStream(xmlFile, FileMode.Open); ds.ReadXml(fs); StringBuilder builder = new StringBuilder(); builder.AppendLine("<script type=\"text/javascript\">"); builder.AppendLine("//<![CDATA["); builder.AppendLine(""); builder.AppendLine("function load_map() {"); builder.AppendLine(" if (GBrowserIsCompatible()) {"); builder.AppendLine(" var map = new GMap2(document.getElementById(\"map\"));"); builder.AppendLine(" map.addControl(new GSmallMapControl());"); builder.AppendLine(" map.addControl(new GMapTypeControl());"); builder.AppendLine(" map.setCenter(new GLatLng(51.70366, 5.274436), 13);"); // verander hier de foreach loop naar wens, om ervoor // te zorgen dat je door je eigen gegevensset loopt foreach (DataRow row in ds.Tables[0].Rows) { builder.AppendFormat("var point = new GLatLng({0}, {1});\n", row[0], row[1]); builder.AppendLine("map.addOverlay(new GMarker(point));"); } builder.AppendLine(" }"); builder.AppendLine("}"); builder.AppendLine("//]]>"); builder.AppendLine("</script>"); builder.AppendLine(""); // deze is om de de FileStream te sluiten fs.Close(); // vul je literal object met de output van je StringBuilder object cScript.Text = builder.ToString(); } } [/code:1:abecd2d076] En dit werkt ook in IE7! [edit]Je kan het [url=http://roozendaal.org:8080/Default.aspx]hier[/url] testen. Het is een beetje trage server (Linux-bakje met Mono XSP2) maar zelfs dat werkt :))[/edit]
  • Lees je nu wel een xml-bestand in? Dat moet niet. En <asp:literal runat="server" id="cScript"></asp:literal> in de head gaat ook al niet.
  • [quote:d7bc057bc8="Wiep Corbier"]Lees je nu wel een xml-bestand in? Dat moet niet. En <asp:literal runat="server" id="cScript"></asp:literal> in de head gaat ook al niet.[/quote:d7bc057bc8] Nee, ik weet dat je dat niet wil, maar ik heb je xml bestand als voorbeeld gebruikt. Je moet zelf de code die je hebt om de gegevens uit je database te halen toevoegen, en en de code die ik gebruik om de gegevens uit de xml te halen verwijderen. En als het goed is, krijg je wel een foutmelding over die literal, maar kun je de applicatie wel draaien. Bij mij werkt het in ieder geval.
  • Maar je server werkt momenteel even niet?
  • [quote:bfb8d8d66d="Wiep Corbier"]Maar je server werkt momenteel even niet?[/quote:bfb8d8d66d] Nee, ik moet Mono nog een keer goed configureren. Ik zoek wel even een adresje waar ik de spullen kan neerzetten. [edit][url=http://mreddie.brinkster.net]Gevonden[/url][/edit]
  • Yep, ik zie het. Ik ga het nog een keer proberen.

Beantwoord deze vraag

Weet jij het antwoord op deze vraag? Registreer of meld je aan met je account

Dit is een gearchiveerde pagina. Antwoorden is niet meer mogelijk.