Check alle échte Black Friday-deals Ook zo moe van nepaanbiedingen? Wij laten alleen échte deals zien

[php] XML uitlezen naar $qry

Pagina: 1
Acties:

  • BLACKfm
  • Registratie: Maart 2004
  • Laatst online: 16:21
Hallo,

Ik kreeg de vraag om een geolocatie api van google aan te passen. Blijkbaar hebben ze sinds het begin van deze maand een nieuwe api versie en daardoor werkt de oude methode niet.

Dit is de code die ik heb;

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
<?php
        $base_url = "http://maps.googleapis.com/maps/api/geocode/json?address";
                $postcode = '6836'; // Deze waarde hoeft niet worden aangepast in bestand
                $plaats   = 'arnhem';    // Deze waarde hoeft niet worden aangepast in bestand
                
                            echo '<br/><br/>------- Debug input ------- <br/>';
                            echo 'Postcode: ' . $postcode . '<br/>';
                            echo 'Plaats: ' . $plaats . '<br/>';
                            echo '------- Debug -------<br/><br/>';
                            
                $sensor = '&sensor=true'; // dit moet achter de baseurl, maar na de postcode+plaats
                $request_url = $base_url . "=" . urlencode($postcode . ' ' . $plaats . ' Nederland') . $sensor;                     
                //print $request_url;
                $xml = file_get_contents($request_url) or die("url not loading");
                
                            echo '<br/><br/>------- Debug url ------- <br/>';
                            echo 'request url: ' . $request_url . '<br/>';
                            echo 'xml: ' . $xml . '<br/>';
                            echo '------- Debug -------<br/><br/>';
                
                $lat1 = 0;
                $lng1 = 0;
                $csvSplit = split(",", $xml);
                if(isset($csvSplit[0])) $status = $csvSplit[0];
                if(isset($csvSplit[2])) $lat1 = $csvSplit[2];
                if(isset($csvSplit[3])) $lng1 = $csvSplit[3];   

                            echo '<br/><br/>------- Debug readout ------- <br/>';
                            echo 'status: ' . $status . '<br/>';
                            echo 'lat1: ' . $lat1 . '<br/>';
                            echo 'lng1: ' . $lng1 . '<br/>';
                            echo '------- Debug -------<br/><br/>';             

?>


Voorheen werd $request_url een comma gescheiden cvs bestand uitgelezen. Nu kun je enkel een XML of een JSON bestand als uitput krijgen. Vandaar ook nu nog de code van cvsSplit (welke nu niet meer toepasbar lijkt).

De debug toont voor mij de juiste informatie, ik weet echter niet hoe ik de juiste informatie uit het XML/JSON bestand krijg.

http://omega-thunder.nl/ss/geo.php op deze locatie draait het bovenstaande scriptje.

op http://maps.googleapis.co...hem+Nederland&sensor=true krijg ik een uitput file die dus ook in de 'debug readout' wordt weergegeven.

De gegevens die voorheen in de database geschreven werden moet ik hieruit dan ook weer hebben, dat betreffen uit de json de regel:

code:
1
2
3
4
            "location" : {
               "lat" : 51.9457601,               <<< Deze ($lat1)
               "lng" : 5.894137600000001         <<< Deze ($lng1)
   "status" : "OK"                               <<< En deze ($status)


Iemand die mij kan vertellen hoe ik die gegevens 'op papier' krijg?

  • Webgnome
  • Registratie: Maart 2001
  • Laatst online: 18:53
Probeer hier eens mee te spelen. http://php.net/manual/en/function.json-decode.php.

Strava | AP | IP | AW


  • BLACKfm
  • Registratie: Maart 2004
  • Laatst online: 16:21
Dat lukt enigszins, ik krijg nested gegevens er echter niet uit :(. Status geeft bijvoorbeeld gewoon OK.

code:
1
2
3
4
5
6
    $jsonreadout = file_get_contents($request_url) or die("url not loading");
    $json = utf8_encode($jsonreadout); 
    $jsonoutput = json_decode($json);

    echo 'status: ' . $jsonoutput->{'status'} . '<br/>';  // output : OK
    echo 'lat1: ' . $jsonoutput->{'lat,'} . '<br/>'; // output:  (niks)

  • Voutloos
  • Registratie: Januari 2002
  • Niet online
Je mist eerlijk gezegd wat php basics, met hoe je vars, array values, class properties aanspreekt. Lees dat aub na, doe eens een var_dump($jsonoutput); en dan moet hopelijk al vrij snel t kwartje vallen. :)

En zet error_reporting goed tijdens t ontwikkelen, en dubbelcheckof je in je daadwerkelijke code ook lat, geschreven hebt, want die komma daar is een typo die je ook wel zelf moet kunnen spotten. ;)

[ Voor 31% gewijzigd door Voutloos op 21-09-2013 18:07 ]

{signature}


  • BLACKfm
  • Registratie: Maart 2004
  • Laatst online: 16:21
De basics mis ik inderdaad, maar ik kom er meestal wel uit met wat reverse engineering.

Zo ook nu. Met jouw (Voutloos) var_dump, welke ik al wel eerder heb gebruikt maar de output niet heb bestudeerd, heb ik de inhoud mooi gecascade in een bestandje gezet en kon zo duidelijk zien hoe ik de gegevens kon aanspreken.

Op internet vond ik vervolgens een vraag waarbij een soortgelijke opbouw moest worden uitgelezen.

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
Json code; Var_dump

array(2) {
    ["results"]=> array(1) {
        [0]=> array(5) {
            ["address_components"]=> array(5) {
                [0]=> array(3) {
                    ["long_name"]=> string(4) "4033"
                    ["short_name"]=> string(4) "4033" 
                    ["types"]=> array(2) { 
                        [0]=> string(18) "postal_code_prefix" 
                        [1]=> string(11) "postal_code"
                    }
                }
                [1]=> array(3) {
                    ["long_name"]=> string(7) "Lienden" 
                    ["short_name"]=> string(7) "Lienden" 
                    ["types"]=> array(2) {
                        [0]=> string(8) "locality" 
                        [1]=> string(9) "political" 
                    }
                } 
                [2]=> array(3) {
                    ["long_name"]=> string(5) "Buren" 
                    ["short_name"]=> string(5) "Buren" 
                    ["types"]=> array(2) {
                        [0]=> string(27) "administrative_area_level_2" 
                        [1]=> string(9) "political" 
                    }
                } 
                [3]=> array(3) {
                    ["long_name"]=> string(10) "Gelderland" 
                    ["short_name"]=> string(2) "GE" 
                    ["types"]=> array(2) { 
                        [0]=> string(27) "administrative_area_level_1" 
                        [1]=> string(9) "political" 
                    }
                } 
                [4]=> array(3) { 
                    ["long_name"]=> string(15) "The Netherlands" 
                    ["short_name"]=> string(2) "NL" 
                    ["types"]=> array(2) {
                        [0]=> string(7) "country" 
                        [1]=> string(9) "political" 
                    } 
                } 
            } 
            ["formatted_address"]=> string(29) "4033 Lienden, The Netherlands" 
            ["geometry"]=> array(4) {
                ["bounds"]=> array(2) {
                    ["northeast"]=> array(2) {
                        ["lat"]=> float(51.9706932) 
                        ["lng"]=> float(5.586759)
                    } 
                    ["southwest"]=> array(2) {
                        ["lat"]=> float(51.9178161) 
                        ["lng"]=> float(5.4785101) 
                    }
                } 
                ["location"]=> array(2) {
                    ["lat"]=> float(51.9398409) 
                    ["lng"]=> float(5.5239551) 
                } 
                ["location_type"]=> string(11) "APPROXIMATE" 
                ["viewport"]=> array(2) {
                    ["northeast"]=> array(2) {
                        ["lat"]=> float(51.9706932) 
                        ["lng"]=> float(5.586759) 
                    } 
                    ["southwest"]=> array(2) { 
                        ["lat"]=> float(51.9178161) 
                        ["lng"]=> float(5.4785101) 
                    }
                } 
            } 
            ["partial_match"]=> bool(true) 
            ["types"]=> array(2) { 
                [0]=> string(18) "postal_code_prefix" 
                [1]=> string(11) "postal_code"
            } 
        } 
    } 
    ["status"]=> string(2) "OK"
}


PHP:
1
2
3
4
5
6
7
8
9
10
$url = 'http://maps.googleapis.com/maps/api/geocode/json?address=4033+tiel+Nederland&sensor=true';
$jsonreadout = file_get_contents($url) or die("url not loading");
// $json = utf8_encode($jsonreadout); 
$jsonoutput = json_decode($jsonreadout,true); 
                
        
    echo '<br/><br/>------- Debug readout ------- <br/>';
    echo 'status: ' . $jsonoutput['status']. '<br/>';
    echo 'lat1: ' . $jsonoutput['results'][0]['geometry']['location']['lat'] . '<br/>';
    echo 'lat1: ' . $jsonoutput['results'][0]['geometry']['location']['lng'] . '<br/>';


Onder aan de streep snap ik er natuurlijk nog niks van, maar het probleem is in ieder geval opgelost...

In ieder geval bedankt voor de inzichten.

Resultaat: http://omega-thunder.nl/ss/geo2.php

  • Cartman!
  • Registratie: April 2000
  • Niet online
BLACKfm schreef op zaterdag 21 september 2013 @ 19:51:
Onder aan de streep snap ik er natuurlijk nog niks van, maar het probleem is in ieder geval opgelost...
Als je bovenstaande code niet begrijpt is er flink wat mis... Als je zulk soort klusjes vaker wilt doen raad ik je aan om iets meer inzet te tonen.

  • Belgar
  • Registratie: Januari 2002
  • Laatst online: 22-09 09:37

Belgar

Archmaster ranzige code..

Met de XML variant en XPATH kun je de gevraagde info ook makkelijk gebruiken en extraheren.

persoonlijk vind ik de xml variant makkelijker te gebruiken en code leesbaarder te houden (hoewel als je alleen LAT/LNG nodig hebt dit niet veel uitmaakt).

Overigens moet voor jouw gebruik waarschijnlijk "sensor=false" zijn en niet "true". Maakt niet zo heel veel uit, maar de sensor variabele geeft aan google aan of het device dat de query maakt is uitgerust met GPS.

...Als het maar werkt

Pagina: 1