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

Batch geocoding

Pagina: 1
Acties:

  • Scrummie
  • Registratie: Februari 2003
  • Laatst online: 04-11 09:03

Scrummie

Think different

Topicstarter
Alvast mijn welgemeende excuses als de vraag hier niet helemaal thuis hoort, of ik te weinig moeite heb gedaan. Ik doe mijn best in elk geval:

Voor een klant ben ik bezig een store locater te maken. Klant heeft een lijst aangeleverd met 747 adressen, zonder longitude en latitude. Opzich prima, want ik dacht, die kan ik met Google Maps API wel geocoden, en mijn idee is dan om die resultaten te cachen. Maar ik loop nogal snel tegen het limiet gebeuren aan met Google Maps API, vooral omdat ik nu nog in de test fase zit, en ik mijzelf nou niet echt een PHP held kan noemen. Toen ik de Google Maps API aan de kant geschoven heb, ben ik gaan kijken naar de propp6 database. Door middel van dit stukje code:

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
// Haal longitude + latitude op
    $nl_sixpp = $postcode;
    // Optional
    //$streetnumber = $huisnr;
    
    // Optionally, set a timeout (in ms)
    $timeout = 50000;
    
    $url = "http://api.pro6pp.nl/v1/autocomplete?auth_key=" . $auth_key .
           "&nl_sixpp=" . urlencode($nl_sixpp) .
           "&streetnumber=" . $streetnumber;

    $ch = curl_init();
    
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_TIMEOUT_MS, $timeout);
    
    $result = curl_exec($ch);
    
    curl_close($ch);

    $nonjson = json_decode($result, TRUE);
    
    if ($nonjson):
        // Show raw output
        $lat = $nonjson['results'][0]['lat'];
        $lng = $nonjson['results'][0]['lng'];
    else:
      // Timeout occured. Either the service is down or you should
      // increase the timeout to at least 5000ms.
      print("Pro6PP is unavailable at this time");
    endif;


Kan ik vrij snel een lijst van 200 adressen geocoden, maar 737 vind propp6 niet leuk. Ik dacht, misschien als ik de while loop elke 100 adressen even op pauze zet een sleep van 10:

code:
1
2
3
4
5
if ($i == 100):
        flush();
        sleep(10);
        $i = 0;
    endif;


maar dat werkt niet. Blijft een timeout geven. Kan zijn dat ik die sleep niet goed doe, is nieuw voor mij.

Maar het kan ook zijn dat mijn aanpak compleet verkeerd is. De bedoeling is dat de klant elke maand een CSV bestand met die adressen zonder longitude en latitude upload. Ik moet nog een script schrijven die dat CSV bestand automatisch gaat importeren, en misschien moet ik in die stap al die longitude en latitude erbij opzoeken en een JSON file wegschrijven die ik gebruik voor de 'live' website, maar feit dat ik bovenstaand probleem houd. Iemand die mij een stap in de goeie richting kan geven? Misschien met ervaring met het propp6 gebeuren?

Seizoenskaarthouder Feyenoord - Vak T


  • HuHu
  • Registratie: Maart 2005
  • Niet online
Is het propp6 of pro6pp? Hoeveel verzoeken per tijdseenheid mag je doen naar die API? Als je dat soort dingen weet, dan kun je een cronjob maken die zich daar netjes aan houd. Je klant upload een CSV, die wordt in een todo-tabel gezet en gedurende de dag worden ze langzaam verwerkt binnen de toegestane limieten.

  • TheNephilim
  • Registratie: September 2005
  • Laatst online: 21-11 15:31

TheNephilim

Wtfuzzle

Zo te zien ondersteunen ze niet het omzetten van meerdere postcodes in één request. Dan is de oplossing wat minder handig/simpel; je moet een cronjob maken, die (bijv.) elke 5 minuten een x aantal postcodes omzet.

Die kun je gewoon laten draaien! Elke (bijv.) 5 minuten, checken of er een nieuw gegeven is zonder locatie en die locatie dan ophalen bij de API.

  • Barryvdh
  • Registratie: Juni 2003
  • Laatst online: 21-11 14:12
Check vooral ook even GeoCoder (http://geocoder-php.org/) en GeoTools (http://geotools-php.org/#batch)
GeoCoder maakt het makkelijk om met 1 interface meerdere API's aan te roepen, GeoTools gebruikt die library maar gooit er een extra laag, waarbij (volgens de docs) ook batches, caching etc ondersteund worden.

  • Hydra
  • Registratie: September 2000
  • Laatst online: 06-10 13:59
Over het algemeen moet je voor dit soort dingen betalen. Op postcode.nl kun je ook sets databestanden aanleveren die dan verrijkt worden. Kost voor 750 stuks nauwelijks wat.

https://niels.nu


  • Ramon
  • Registratie: Juli 2000
  • Laatst online: 14:05
Het is natuurlijk onzinnig en niet efficient om iedere keer 750 requests te doen, aangezien je de data vorige maand ook hebt opgevraagd en een adres/postcode niet ineens een andere lat/lon krijgt ofzo.

Wat je dus moet doen is één keer het CSV-importscript runnen en dan per row de resultaten van de google geolocation opslaan in je eigen database. Volgende maand, als je een nieuwe CSV krijgt, voeg je de nieuwe *enkel de nieuwe*, winkels toe en zoek je van die nieuwe winkels de lat/lon en sla je die ook weer op in de database.

Google's geolocation API heeft een limit van 2500 per dag. Bij het testen test je dus niet met de volledige 750 rows grote CSV maar met een kleine CSV van 5 rows ofzo, dan kan je je script 500 keer testen op een dag, dat moet genoeg zijn.

[ Voor 8% gewijzigd door Ramon op 04-11-2013 20:01 ]

Check mijn V&A ads: https://tweakers.net/aanbod/user/9258/


  • EricBruggema
  • Registratie: Maart 2007
  • Laatst online: 21-11 17:28
Misschien handig om per request een 2 seconden pauze er in te zetten, ja ik weet dan heb je zo'n 737x2.1 seconden nodig om je scriptje te laten draaien maar toch.... en weet je zeker dat je de server niet overbelast... zo heb ik het gedaan met imdb! :) werkt als een tiet..

  • Hydra
  • Registratie: September 2000
  • Laatst online: 06-10 13:59
Je mag de google api uberhaupt niet gebruiken om eigen bestanden te verrijken. Staat gewoon in de voorwaarden.

https://niels.nu


  • Scrummie
  • Registratie: Februari 2003
  • Laatst online: 04-11 09:03

Scrummie

Think different

Topicstarter
@HuHu het is pro6pp, excuus voor de tik fout ;-).

Cronjobs zal ik eens bekijken. Thanks voor de tip!

@Barryvdh, deze was ik tegen gekomen inderdaad! Zag er indrukwekkend uit, maar heb het gevoel dat het 'too much' is voor maandelijkse handeling.

@Ramon, Hier zat ik dus inderdaad over na te denken. Eigenlijk ben ik fout begonnen; ik heb als test de CSV geïmporteerd, zonder geolocaties, en wil die lijst nu gaan bijwerken, maar dat moet ik al bij het importeren doen eigenlijk. Kan ik nu alsnog doen natuurlijk, het probleem voor mij zit in het per 5 rijen de geolocaties ophalen en wat EricBruggema ook zegt, de pauze van een seconde of 2. Maar goed, dat is mijn gebrekkige kennis en die zal ik dan zelf wat moet opvijzelen :P.

@Hydra, je mag gegevens 'tijdelijk' opslaan, als je ze maar gebruikt voor een map, voor zover ik las in de voorwaarden. Maar goed, ik gebruik nu natuurlijk niet de Google API voor geocoding, maar de Pro6PP database.

Seizoenskaarthouder Feyenoord - Vak T


  • royduin
  • Registratie: November 2007
  • Laatst online: 12:21
Wellicht dat je hier wat aan hebt: http://royduineveld.nl/bl...-geolocation-en-maps-api/

  • Fish
  • Registratie: Juli 2002
  • Niet online

Fish

How much is the fish

http://www.d-centralize.nl/projects/6pp/downloads/ kun je lokaal importeren volgens mij zaten er ook coordinaten bij. maar dat was 2 jaar geleden :P

[ Voor 33% gewijzigd door Fish op 06-11-2013 16:03 ]

Iperf

Pagina: 1