Python GeoPy TimeOut und sehr langsam - Database nur 8 Einträge

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Zoja
User
Beiträge: 145
Registriert: Freitag 28. Februar 2014, 14:04

Hallo zusammen,

ich benutze zurzeot geopy um die lat und lng Werte von einem Ort zu bekommen, bestehend aus Stadt, Straße und eventuell Hausnummer.

Ich habe eine Datenbank, in der ich Zimmer speichere, zu diesen Zimmern speichere ich auch die Adressen, von da kommen auch Stadt, Straße etc.

Mit Geopy bekomme ich dann lat und lng, diese brauche ich um mit Hilfe von Flask GoogleMaps Marker auf die Karte zu setzen wo sich die Zimmer befinden.

An und für sich klappt auch alles wunderbar, nur bekomme ich ab und zu den "GeocoderTimedOut: Service timed out" Error, ich habe auch schon viel dazu recherschiert und man soll damit Leben, ebentuell timeout höher setzten oder in eine rekursive Schleife schieben mit einer bestimmt Anzahl Versuchen bis es klappt, aber in meiner Datenbank sind nur 8 Zimmer... und später werden es hunderte, ich kann doch dann nicht einfach viel ignorieren?

Gibt es da Alternativen? Ist das so langsam, weil es ein free service ist? Gibt es etwas, wo man bezahlt und einen schneller und zuverlässigen Service bekommt?

Das ist die Problemschleife, hier erstelle ich alle Marker von allen Zimmer, die geladen werden und in der Schleife gibts TimeOuts. Ich mache zwei seperate Listen, da es Benutzer gibt, die bazahlt haben und nicht bezahlt haben und die bezahlten Marker sollen einfach schöner aussehen.

Code: Alles auswählen

markerlist = []
		markerlist_bezahlt = []
		for room in all_rooms_in_city:
			if room.stadt == findroomcity.lower():
				try:
					location2 = geolocator.geocode(room.stadt + " " + room.strasse + " " + room.hausnr, timeout=2)
					for user in all_users:
						if user.id == room.users_id:
							if user.bezahlt == False:
								markerlist.append((location2.latitude, location2.longitude))
							else:
								markerlist_bezahlt.append((location2.latitude, location2.longitude))					
				except GeocoderTimedOut as e:
					print "in der schleife timeout", e	
				except AttributeError as e:
					print "in der schleife attributeerror", e	

		#print markerlist, markerlist_bezahlt
		
		mymap.markers['static/img/Map-Marker-Marker-Outside-small.png'] = markerlist
		mymap.markers['static/img/Map-Marker-Marker-Outside-Pink.png'] = markerlist_bezahlt
Zuletzt geändert von Anonymous am Dienstag 12. Juli 2016, 15:22, insgesamt 1-mal geändert.
Grund: Quelltext in Python-Codebox-Tags gesetzt.
Sirius3
User
Beiträge: 17737
Registriert: Sonntag 21. Oktober 2012, 17:20

@Zoja: da sich Orte auf der Erde nur langsam bewegen, würde ich ja nicht jedes mal beim Anzeigen die Koordinaten neu bestimmen, sondern nur beim Anlegen in der Datenbank und sie dann automatisch alle paar hundert Jahre aktualisieren.
BlackJack

@Zoja: Randbemerkung: Auf ``== False`` zu testen ist schlechter Stil weil überflüssig. Du könntest den Vergleich weglassen wenn Du den Code in den beiden Zweigen austauschst, oder Du schreibst ein ``not`` vor ``user.bezahlt``. Der `append()`-Aufruf ist in beiden Fällen gleich. Ich würde da ja per bedingtem Ausdruck die Liste auswählen und dann nur einmal das `append()` hinschreiben:

Code: Alles auswählen

    (markerlist_bezahlt if user.bezahlt else markerlist).append(
        (location2.latitude, location2.longitude)
    )
Die `2` bei `location` sieht verdächtig aus. Warum steht da eine 2?
Zoja
User
Beiträge: 145
Registriert: Freitag 28. Februar 2014, 14:04

Sirius3 hat geschrieben:@Zoja: da sich Orte auf der Erde nur langsam bewegen, würde ich ja nicht jedes mal beim Anzeigen die Koordinaten neu bestimmen, sondern nur beim Anlegen in der Datenbank und sie dann automatisch alle paar hundert Jahre aktualisieren.
Verstehe ich nicht, ich lege die Koordinaten natürlich nur 1 mal an.
Zoja
User
Beiträge: 145
Registriert: Freitag 28. Februar 2014, 14:04

BlackJack hat geschrieben:@Zoja: Randbemerkung: Auf ``== False`` zu testen ist schlechter Stil weil überflüssig. Du könntest den Vergleich weglassen wenn Du den Code in den beiden Zweigen austauschst, oder Du schreibst ein ``not`` vor ``user.bezahlt``. Der `append()`-Aufruf ist in beiden Fällen gleich. Ich würde da ja per bedingtem Ausdruck die Liste auswählen und dann nur einmal das `append()` hinschreiben:

Code: Alles auswählen

    (markerlist_bezahlt if user.bezahlt else markerlist).append(
        (location2.latitude, location2.longitude)
    )
Die `2` bei `location` sieht verdächtig aus. Warum steht da eine 2?
Ja kann ich ändern um nicht mit False zu testen, 2 steht da, weil ich, wenn die map erstellt wird ebenfalls die location von dem gesuchten Ort brauche, um der Map zu sagen, dass die genau diesen Ort anzeigen soll. Deswegen habe ich 2 locations. Ist einfach nur der Variablenname.

Aber ich habe weiter recherschiert und geopy ist nunmal langsam, es gibt wohl das gleiche von Google mit API Key, ich versuche das zum laufen zu bringen.
Benutzeravatar
noisefloor
User
Beiträge: 3853
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,
Verstehe ich nicht, ich lege die Koordinaten natürlich nur 1 mal an.
Dein Eingangspost liest sich aber anders, nämlich dass du "nur" die Adresse speicherst und jedes Mal die Coords abfragst, wenn du die Karte erstellst.
Von daher wäre es in der Tat effizienter, beim Anlegen des DB-Eintrags in der DB die Coords direkt mit zu speichern.

Gruß, noisefloor
BlackJack

@Zoja: Die 2 habe ich immer noch nicht verstanden. Du hast *gleichzeitig* zwei Namen an die Koordinaten gebunden sind, und denkst es ist eine gute Idee die nur durch Zahlen zu unterscheiden statt einen Namen zu wählen der dem Leser verrät was die Ortsangaben bedeuten?
Antworten