+
+def multigeo_from_string(value, input_format):
+ assert input_format in [MultiGeo.FORMAT_GUESS, MultiGeo.FORMAT_GEOCACHING, MultiGeo.FORMAT_WINTERRODELN,
+ MultiGeo.FORMAT_GMAPPLUGIN, MultiGeo.FORMAT_GPX], "input_format %d is not recognized"
+ lines = [line.strip() for line in value.split("\n") if len(line.strip()) > 0]
+
+ result = []
+ for line in lines:
+ if input_format == MultiGeo.FORMAT_GUESS or input_format == MultiGeo.FORMAT_GEOCACHING:
+ r = re.match('N ?(\d+)° ?(\d+\.\d+) +E ?(\d+)° ?(\d+\.\d+)', line)
+ if r is not None:
+ g = r.groups()
+ result.append((float(g[0]) + float(g[1]) / 60, float(g[2]) + float(g[3]) / 60, None))
+ continue
+
+ if input_format == MultiGeo.FORMAT_GUESS or input_format == MultiGeo.FORMAT_WINTERRODELN:
+ r = re.match('(\d+\.\d+) N (\d+\.\d+) E', line)
+ if not r is None:
+ result.append((float(r.groups()[0]), float(r.groups()[1]), None))
+ continue
+
+ if input_format == MultiGeo.FORMAT_GUESS or input_format == MultiGeo.FORMAT_GMAPPLUGIN:
+ r = re.match('(\d+\.\d+), ?(\d+\.\d+)', line)
+ if r is not None:
+ result.append((float(r.groups()[0]), float(r.groups()[1]), None))
+ continue
+
+ if input_format == MultiGeo.FORMAT_GUESS or input_format == MultiGeo.FORMAT_GPX:
+ try:
+ xml = minidom.parseString(line)
+ coord = xml.documentElement
+ lat = float(coord.getAttribute('lat'))
+ lon = float(coord.getAttribute('lon'))
+ try:
+ ele = float(coord.childNodes[0].childNodes[0].nodeValue)
+ except (IndexError, ValueError):
+ ele = None
+ result.append((lat, lon, ele))
+ continue
+ except (ExpatError, IndexError, ValueError):
+ pass
+
+ raise ValueError("Coordinates '%s' have no known format" % line, value)
+ return result
+
+
+def multigeo_to_string(value, output_format):
+ result = []
+ for latitude, longitude, height in value:
+ if output_format == MultiGeo.FORMAT_GEOCACHING:
+ result.append(
+ 'N %02d° %02.3f E %03d° %02.3f' % (latitude, latitude % 1 * 60, longitude, longitude % 1 * 60))
+
+ elif output_format == MultiGeo.FORMAT_WINTERRODELN:
+ result.append('%.6f N %.6f E' % (latitude, longitude))
+
+ elif output_format == MultiGeo.FORMAT_GMAPPLUGIN:
+ result.append('%.6f, %.6f' % (latitude, longitude))
+
+ elif output_format == MultiGeo.FORMAT_GPX:
+ if not height is None:
+ result.append(
+ '<trkpt lat="%.6f" lon="%.6f"><ele>%.2f</ele></trkpt>' % (latitude, longitude, height))
+ else:
+ result.append('<trkpt lat="%.6f" lon="%.6f"/>' % (latitude, longitude))
+
+ else:
+ raise ValueError("output_format %d is not recognized" % output_format, value)
+
+ return "\n".join(result)
+
+
+class CoordtoolController: