Flächenberechnung und Darstellung von Grundstücken
Verfasst: Mittwoch 12. Februar 2025, 23:46
Guten abend,
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.
Allerdings habe ich auch einen Mechanismus eingebaut, damit statt wiederkehrenden Koordinaten Paaren nur die ID angeben brauche:
Würde hier oben bedeuten, eine Referenz auf das 36te Koordinaten-Paar.
Diese Referenzen werden aufgelöst auf ihre Koordinaten. Anschliessend werden alle Koordinaten-Punkte in ein Dictionary gespeichert:
Mit diesem Dictionary werden dann die nötigen Datenpunkte für das Polygon erstellt, welches ich an SVGWrite übergebe in dem folgenden Code:
Die dabei erzeugte SVG Grafik Datei soll mir alle wichtigen Daten zu meinem Grundstück anzeigen. Leider hänge ich aktuell fest bei der Übergabe der Koordinaten an SVGwrite. Ich bekomme die ganze Zeit den Fehler, dass es sich um den falschen Typen für die übergebenen Koordinaten handelt.
Wäre super wenn ein Pro mir da weiterhelfen könnte.
Vielen lieben Dank
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