wie ' und " für Koordinaten am einfachsten in einem string kombinieren?

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.
harryberlin
User
Beiträge: 227
Registriert: Donnerstag 17. Dezember 2015, 12:17

hallo zusammen.

ich möchte eine funktion schreiben, die eine google maps url erzeugt.
jedoch finde ich gerade keine elegante lösung um dass zeichen ' und " in einen string zu bringen.

Code: Alles auswählen

# https://www.google.de/maps/place/48°42'27.4"N+10°33'43.4"E
url = "https://www.google.de/maps/place/{0}+{1}".format("48°42'27.4"+'"N',"10°33'43.4"+'"E')
print url
eine andere lösung hatte ich noch so:

Code: Alles auswählen

latitude = "%02X°%02X'%02X.%s%s%s" % (0x48, 0x42, 0x27, 0x4, chr(34), 'N' ) 
longitude = "%02X°%02X'%02X.%s%s%s" % (0x10, 0x33, 0x43, 0x4, chr(34), 'E')
empty Sig
BlackJack

@harryberlin: Such Dir was aus:

Code: Alles auswählen

print 'ein \' und ein " in einer Zeichenkette'
print "ein ' und ein \" in einer Zeichenkette"
print '''ein ' und ein " in einer Zeichenkette'''
print """ein ' und ein " in einer Zeichenkette"""
harryberlin
User
Beiträge: 227
Registriert: Donnerstag 17. Dezember 2015, 12:17

cool, danke :)

das mit dem backslash hatte ich sogar versucht, aber wohl nen fehler drin gehabt.
empty Sig
Sirius3
User
Beiträge: 18257
Registriert: Sonntag 21. Oktober 2012, 17:20

@harryberlin: warum machst Du es Dir so schwer?

Code: Alles auswählen

latitude = 48.70761
longitude = 10.56206
url = "https://www.google.de/maps/place/{0},{1}".format(latitude, longitude)
harryberlin
User
Beiträge: 227
Registriert: Donnerstag 17. Dezember 2015, 12:17

ich bekomme die koordinaten vom navi wie oben gezeigt.
d.h. ich müsste es erst umrechnen.
geht mit python sicher schnell, aber ist eigentlich unnötig.

hier ist nur eine kurzform, um das problem mit dem string zu lösen.
empty Sig
S0S
User
Beiträge: 50
Registriert: Samstag 9. Februar 2013, 18:59

Cool, dasselbe Problem hatte ich erst vor einigen Tagen auch und hatte es genauso unelegant gelöst wie harryberlin. Danke für die einfachere(n) Lösung(en)!
Benutzeravatar
kbr
User
Beiträge: 1506
Registriert: Mittwoch 15. Oktober 2008, 09:27

harryberlin hat geschrieben:ich bekomme die koordinaten vom navi wie oben gezeigt.
d.h. ich müsste es erst umrechnen.
geht mit python sicher schnell, aber ist eigentlich unnötig.
Keineswegs, denn dafür musst Du die Escape-Sequenzen erst einmal im String anbringen, damit Google hinterher den String wieder auseinander nimmt. Das kannst Du auch direkt tun:

Code: Alles auswählen

def arc_to_float(arc):
    degrees, remain = arc.split('°')
    minutes, seconds = remain.split("'")
    return float(degrees) + float(minutes) / 60 + float(seconds) / 3600

arc = "10°33'43.4"
print(arc_to_float(arc))
harryberlin
User
Beiträge: 227
Registriert: Donnerstag 17. Dezember 2015, 12:17

@kbr
bitte was, ich kann dir nicht folgen?
wieso keineswegs?
empty Sig
Benutzeravatar
kbr
User
Beiträge: 1506
Registriert: Mittwoch 15. Oktober 2008, 09:27

@harryberlin: Was ich damit sagen wollte: Du musst die Daten von Deinem Navi auf jeden Fall in eine andere Form bringen, damit eine Nutzung durch Google möglich wird. Dann kannst Du sie auch direkt in Fließkommawerte umrechnen und so verwenden, wie von Sirius3 gezeigt. Aus meiner Sicht ist dies einfacher und weniger fehlerträchtig.
harryberlin
User
Beiträge: 227
Registriert: Donnerstag 17. Dezember 2015, 12:17

Wie kommst du darauf?
Google erzeugt selbst URLs in dem Format.

Wenn ich die url im Browser eingebe, wird der Standort geladen.
In deiner Berechnung solltest du den kompletten string berücksichtigen, inkl. N/S (+/-).
empty Sig
Benutzeravatar
kbr
User
Beiträge: 1506
Registriert: Mittwoch 15. Oktober 2008, 09:27

harryberlin hat geschrieben:Wie kommst du darauf?
Durch Deine Problembeschreibung.
harryberlin hat geschrieben:In deiner Berechnung solltest du den kompletten string berücksichtigen, inkl. N/S (+/-).
Könnte ich. Überlasse ich aber anderen als Übung.
harryberlin
User
Beiträge: 227
Registriert: Donnerstag 17. Dezember 2015, 12:17

Ich sehe da wenig zusammenhang zwischen:
1. ' + " gleichzeitig in einem string <- mein Problem
und
2. winkel in grad, minuten, sekunden nach float zu wandeln.
wenn du das als problem siehst, dann kommt das nicht von mir. und es wäre hilfreich, wenn du es erläuterst.

ich finde ja gut, dass hier im forum auch über das problem hinaus gedacht wird.
jedoch hat blackjack das problem mit seinem beitrag schon gelöst.
empty Sig
jerch
User
Beiträge: 1669
Registriert: Mittwoch 4. März 2009, 14:19

@harryberlin:
Die Idee dahinter ist, das sperrige Bogenmaß loszuwerden. Das vereinfacht einiges bei internen Berechnungen und die API versteht auch die Gradangabe, was das Hin- und Herkodieren obsolet macht.
harryberlin
User
Beiträge: 227
Registriert: Donnerstag 17. Dezember 2015, 12:17

welche internen berechnungen?
welche api?
kommt doch bitte mal auf den punkt.

hat google maps ein problem damit, wenn man die position nicht als float übergibt?
um es mal zu verdeutlichen. ich erhalte die position aus einem bytearray.
die hexwerte davon kann man direkt nach grad, minute, sekunde übernehmen

Code: Alles auswählen

# 7F 14 C8 A2 AA BB CC DD EE F---F GG HH II JJ K---K LL MM NN OO PP QQ CK
# 7F 14 C8 A2 01 00 48 22 27 9-0/1 00 11 34 06 5-0/1 04 49 00 12 20 27 CK
#                   48°22'27.9"N/S    11°34'06.5"E/W  4-49m   12:20:27 UTC
empty Sig
Benutzeravatar
kbr
User
Beiträge: 1506
Registriert: Mittwoch 15. Oktober 2008, 09:27

@harryberlin: Na, da hast Du es doch: Die Hexdaten musst Du auf jeden Fall anfassen, d.h. die Koordinaten extrahieren. Diese kannst Du dann in einen String überführen, unter beibehalten des Bogenmaßes (und der Anführungs- und Gradzeichen im String), oder in float-Werte umrechnen. Funktionieren wird beides; letzteres halte ich für besser.
harryberlin
User
Beiträge: 227
Registriert: Donnerstag 17. Dezember 2015, 12:17

schade dass du nicht auf die fragen eingehst...
empty Sig
Sirius3
User
Beiträge: 18257
Registriert: Sonntag 21. Oktober 2012, 17:20

@harryberlin: es geht darum, entweder [48,22,27,9,0,1] in """48°22'27.9"N""" umzuwandeln oder in 48.37442. Beides geht, beides ist ungefähr ähnlich aufwendig, im ersten Fall bekommst Du einen String mit ekligen Sonderzeichen, im zweiten eine Zahl, die man auch noch für andere Sachen gut gebrauchen kann und generell einfacher zum Weiterverarbeiten ist.

Code: Alles auswählen

>>> longitude = [48,22,27,9,0,1]
>>> u"""{0[0]:d}°{0[1]:d}'{0[2]:d}.{0[3]:d}"{1}""".format(longitude, "N" if longitude[-1] else "S")
u'48\xb022\'27.9"N'
>>> (longitude[0] + longitude[1] / 60.0 + longitude[2] / 3600.0 + longitude[3] / 36000.0) * (1 if longitude[-1] else -1)
48.37441666666667
Da die API von Google mit beidem klar kommt, mußt Du jetzt noch irgendeinen anderen Vorteil für Variante 1 finden.
harryberlin
User
Beiträge: 227
Registriert: Donnerstag 17. Dezember 2015, 12:17

naja, wie oder ob ich die daten weiterverwende ist im grunde meine sache. hab irgendwie den eindruck, ihr wollt mir da was vorschreiben.
mehr als string darstellung ist aktuell nicht das ziel.
und dass evtl. umrechnungen nötig sind, wenn ich doch mal was anderes machen will, war/ist mir das eigentlich bewusst.

bei mir schaut das jetzt so aus.

Code: Alles auswählen

dat = [0xA2, 0x01, 0x00, 0x48, 0x22, 0x27, 0x90, 0x00, 0x11, 0x34, 0x06, 0x50, 0x04, 0x49, 0x00, 0x12, 0x20, 0x27]
self.nav_states['latitude'] = '''%02X°%02X'%02X.%s"%s''' % (dat[3], dat[4], dat[5], ('%02X' % dat[6])[0], 'S' if ('%02X' % dat[6])[1] == '1' else 'N')  # N/S
self.nav_states['longitude'] = '''%02X°%02X'%02X.%s"%s''' % (dat[8], dat[9], dat[10], ('%02X' % dat[11])[0], 'W' if ('%02X' % dat[11])[1] == '1' else 'E') # E/W
empty Sig
BlackJack

@harryberlin: Was Du mit ``dat[6]`` beziehungsweise ``dat[11]`` machst, sieht unnötig umständlich aus. Die letzten beiden Elemente des Tupels für den ``%``-Operator kann man auch so schreiben, ohne dass man den Wert zweimal in eine Zeichenkette mit dem zweistelligen Hexadezimalwert umwandelt:

Code: Alles auswählen

  dat[6] >> 4, 'S' if dat[6] & 0b1111 == 1 else 'N'
harryberlin
User
Beiträge: 227
Registriert: Donnerstag 17. Dezember 2015, 12:17

danke für die verbesserung
empty Sig
Antworten