iPhone iOS5 CLGeocoder Wie geocodiert man einen großen (200) Satz von Adressen?

7

Ich habe eine große Menge von ungefähr 200 Adressen, für die ich ihre Breite und Länge wissen muss. Ich habe eine Methode erstellt, die die Adressen analysiert, und jetzt versuche ich, Koordinaten für diese Adressen mit CLGeocoder zu erhalten.

Mein aktueller Ansatz besteht darin, Geocoder parallel zu erstellen und sie ihre Magie ausüben zu lassen. Ich bemerkte, dass jeder von ihnen einen separaten Thread zu nehmen scheint. (So ​​sah ich bis zu 100 Fäden an einem Punkt).

Das Problem, auf das ich stoße, ist, dass Geokodierungen irgendwann (nach etwa 50 Adressen) keine Ortsmarkierungen und

mehr zurückgeben %Vor%

wird angerufen. Ist dies eine Einschränkung für eine Anzahl von Threads oder eine integrierte CLGeocoder-Beschränkung? Könnte es sein, dass ich Geocoder nicht richtig bereinige und eine Art Autorelease-Anweisung (ARC) benötige?

- (void) GeocodeArray: (NSMutableArray *) Array     {

%Vor%

Um zu testen, ob dies ein Threading-Problem ist, habe ich diese Methode erstellt, die mein großes Dataset in fünf Arrays aufteilt und versucht, sie in Chunks zu geocodieren. Ich habe bemerkt, dass die erste Anfrage, sowie ein Teil einer zweiten passiert. Aber sobald die magische Zahl von (~ 50) erreicht ist, stoppt die Geocodierung.

Irgendwelche Ideen, was passiert? Ist dies ein von Apple festgelegtes Limit für die Anzahl der Geocodierungsvorgänge? Soll ich die Verzögerung zwischen den Anfragen erhöhen oder versuchen, die App 5 Mal separat auszuführen und die Ergebnisse manuell zusammenzustellen?

%Vor%

Danke!

    
Alex Stone 16.05.2012, 13:44
quelle

2 Antworten

16

Sie können große Sets nicht sofort geocodieren. iOS drosselt dich. Ich habe gesehen, dass iOS dich auf 50 Geocodes gleichzeitig beschränkt, wobei der "Zeitfaktor" ein Unbekannter ist.

Ich hatte ein ähnliches Problem, aber da ich nur die Geokodierungsdaten in einer Sequenz dem Benutzer präsentieren musste, die Zeit braucht, habe ich alle meine Geocodings in die Warteschlange gestellt.

Effektiv geokodierte ich einen 25er-Bereich - zeige die Ergebnisse dem Benutzer 1 zu einem Zeitpunkt in etwa einem Abstand von jeweils einer halben Sekunde an. Wenn weniger als 4 übrig sind, werde ich die nächsten 25 geocodieren. Dies wird fortgesetzt, bis alles geokodiert ist (oder in meinem Fall unbegrenzt).

Wenn Sie alles auf einmal geokodiert haben möchten, müssen Sie Ihre Geocodings zusammen mit Verzögerungen zwischen den einzelnen Chunks verketten und bis zum Ende eine Art Busy-Anzeige anzeigen. Das könnte einige Zeit mit großen Geocodings sein.

    
NSProgrammer 16.05.2012, 13:59
quelle
7

Die Antwort ist, dass Sie gegen die TOS für Apples Geocodierer verstoßen.

Aus der Dokumentation CLGeocoder .

>
  

Anwendungen sollten sich bewusst sein, wie sie Geocoding verwenden. Hier sind einige Faustregeln für die effektive Verwendung dieser Klasse:

     

Senden Sie höchstens eine Geocodierungsanforderung für eine Benutzeraktion.   Wenn der Benutzer mehrere Aktionen ausführt, bei denen derselbe Speicherort geokodiert wird, können Sie die Ergebnisse der ursprünglichen Geocodierungsanforderung erneut verwenden, anstatt einzelne Anforderungen für jede Aktion zu starten.   Wenn Sie den aktuellen Standort des Benutzers automatisch aktualisieren möchten (z. B. wenn der Benutzer in Bewegung ist), geben Sie nur dann neue Geocodierungsanforderungen ein, wenn sich der Benutzer um eine beträchtliche Entfernung nach Ablauf einer angemessenen Zeit bewegt hat. In einer typischen Situation sollten Sie beispielsweise nicht mehr als eine Geocodierungsanforderung pro Minute senden.   Starten Sie eine Geocodierungsanforderung nicht zu einem Zeitpunkt, zu dem der Benutzer die Ergebnisse nicht sofort sehen kann. Starten Sie beispielsweise keine Anfrage, wenn Ihre Anwendung inaktiv oder im Hintergrund ist.

Apple wäre gut in ihrem Recht, keine Antworten mehr zu geben, Ihre App vollständig zu deaktivieren oder Ihr Entwicklerkonto zu widerrufen.

Wenn Sie eine so große Anzahl von Adressen schnell bearbeiten müssen, sollten Sie einen Dienst wie "Fakten zu Sonderzielen" oder "Data Science Toolkit" für Postanschriften und geografische Regionen in Anspruch nehmen.

Aktualisieren

Hier finden Sie die API-Dokumentation für Places API - Resolve , die Factuals Orte Geocoder.

Update 2

Hier finden Sie die API für die Straßenadresse zu Koordinaten , die der Standort von Data Science Toolkit ist Geocoder.

    
Jeffery Thomas 16.05.2012 14:18
quelle