ich bastel seit ein paar Wochen an einem Python Script, welches meine dokumentierten GPS Koordinaten, meines Grundstücks, mit <svgwrite> als Grafik darstellt und dazu auch die Fläche berechnet. Die GPS Koordinaten habe ich in einem UTM GPS Format in einer JSON Datei gespeichert. Jedes Koordinaten Paar bekommt auch noch eine eindeutige ID als Referenz.
Code: Alles auswählen
{
"offset": {
"lat": 475,
"lon": 587
},
"areas": [
{
"type": "Gesamter Bereich",
"coords": [
[
210.1349343594,
1836.642079159,
1
],
[
165.32144854986,
1775.800042744,
2
],
[
162.4250563345,
1773.812589498,
3
],
Code: Alles auswählen
[
36
],
Diese Referenzen werden aufgelöst auf ihre Koordinaten. Anschliessend werden alle Koordinaten-Punkte in ein Dictionary gespeichert:
Code: Alles auswählen
def create_dict_refs_coord(areas, offset_lat, offset_lon):
dict_refs_coord = {}
for area in areas:
for coord in area['coords']:
if len(coord) == 3: # Falls eine Referenz-ID vorhanden ist
ref_id = coord[2]
# Offset und Koordinaten als Strings verketten, dann in float umwandeln
utm_x = int(f"{int(offset_lon)}{int(coord[0])}")
utm_y = int(f"{int(offset_lat)}{int(coord[1])}")
dict_refs_coord[ref_id] = (utm_x, utm_y)
return dict_refs_coord
Code: Alles auswählen
# Flächen zeichnen
def draw_areas(dwg, areas, dict_refs_coord, offset_lat, offset_lon, debug=False):
legend_x, legend_y, font_size = 2000, 100, 40
for i, area in enumerate(areas):
points = []
debug_coords = []
for coord in area['coords']:
coord_id = "-"
if len(coord) == 1:
ref_id = coord[0]
if ref_id in dict_refs_coord:
utm_x, utm_y = dict_refs_coord[ref_id]
coord_id = ref_id
else:
continue
else:
# Korrekte Konvertierung mit float
utm_x = int(f"{int(offset_lon)}{int(coord[0])}")
utm_y = int(f"{int(offset_lat)}{int(coord[1])}")
if len(coord) == 3:
coord_id = coord[2]
points.append((utm_x, utm_y))
debug_coords.append((coord_id, utm_x, utm_y))
if points:
if points[0] != points[-1]:
points.append(points[0]) # Polygon automatisch schließen
clockwise = is_clockwise(points)
if not clockwise:
points.reverse()
color = COLORS.get(area['type'], 'lightgrey')
area_value = calculate_area(points, debug)
# Wandle Punkte in eine SVG-gültige Liste um
svg_points = [(int(round(x)), int(round(y))) for x, y in points]
if debug:
for point in svg_points:
print(f"DEBUG: Punkt: {point}, Typ: {type(point[0])}, {type(point[1])}")
dwg.add(dwg.polygon(svg_points, fill=color, stroke='black', stroke_width=1))
dwg.add(dwg.text(f"{area['comment']}: {area_value:.2f} m²",
insert=(legend_x, legend_y + i * (font_size + 10)),
fill="black", font_size=font_size))
if debug:
print(f"\nBereich: {area['comment']} mit Fläche: {area_value:.2f} m²")
print("Koordinaten:")
for coord_id, utm_x, utm_y in debug_coords:
print(f" ID {coord_id}: {utm_x}, {utm_y}")
print(f"Drehsinn: {'Uhrzeigersinn' if clockwise else 'Gegen den Uhrzeigersinn'}")
Code: Alles auswählen
Flächenberechnung für folgende Koordinaten:
(587210, 4751836)
(587165, 4751775)
(587162, 4751773)
...
DEBUG: Punkt: (587210, 4751836), Typ: <class 'int'>, <class 'int'>
DEBUG: Punkt: (587165, 4751775), Typ: <class 'int'>, <class 'int'>
DEBUG: Punkt: (587162, 4751773), Typ: <class 'int'>, <class 'int'>
...
Traceback (most recent call last):
File "/home/markus/Nextcloud/Grundflaechenrechner/grundstueckshelfer-2025-02-12.py", line 155, in <module>
main()
File "/home/markus/Nextcloud/Grundflaechenrechner/grundstueckshelfer-2025-02-12.py", line 148, in main
draw_areas(dwg, data["areas"], dict_refs_coord, offset_lat, offset_lon, debug=args.debug)
File "/home/markus/Nextcloud/Grundflaechenrechner/grundstueckshelfer-2025-02-12.py", line 118, in draw_areas
dwg.add(dwg.polygon(svg_points, fill=color, stroke='black', stroke_width=1))
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/lib/python3/dist-packages/svgwrite/elementfactory.py", line 68, in __call__
return self.cls(*args, **kwargs)
^^^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/lib/python3/dist-packages/svgwrite/shapes.py", line 122, in __init__
self.validator.check_svg_type(x, 'coordinate')
File "/usr/lib/python3/dist-packages/svgwrite/validator2.py", line 105, in check_svg_type
raise TypeError("%s is not of type '%s'." % (value, typename))
TypeError: 587210 is not of type 'coordinate'.

Vielen lieben Dank