Geometrie v ArcPy

Programování v GIS 3

Jan Caha

2025-10-14

Geometry

  • základní třída geometrie v ArcPy
  • dokumentace
  • lze tvořit přímo Geometry (geometry, inputs, {spatial_reference}, {has_z}, {has_m}, {has_id})
  • ale spíše je vhodnější specifické třídy pro druhy geometrií - Multipoint, PointGeometry, Polygon, Polyline

Souřadnicový systém

Přímo součástí třídy Geometry může být a často i je definice souřadnicového systému!

Výpočty na třídě Geometry

  • např. atributy length, length3D nebo area, ale i řada funkcí (zejména prostorové vztahy – např. intersect()) pracují s 2D kartézskou matematikou
  • u metod getLength({method}, {units}) nebo getArea({method}, {units}) lze specifikovat method (způsob výpočtu: PLANAR/GEODESIC/aj.) a units (jednotky výsledku)
  • z toho plyne, že při PLANAR výpočtech v geografických SRS (souřadnicových systémech) nedostanete korektní geodetické vzdálenosti/plochy
  • řešení: buď použít vhodný projektovaný SRS a PLANAR metody, nebo v GCS použít geodetické metody (GEODESIC, GREAT_ELLIPTIC, …) s příslušnými jednotkami
  • metoda pro změnu SRS: Geometry.projectAs(spatial_reference, {transformation_name}) – u změny mezi různými daty je vhodné uvést transformační název

Vztah k souřadnicovému systému

Ne všechny kombinace metod a typu souřadnicového systému dávají smysl a jsou možné!

Výpočet délky polyline ve WGS84

# Výpočet geodetické délky polyline v kilometrech bez projekce do PCS
import arcpy

# Vytvoření jednoduché linie ve WGS84
line = arcpy.Polyline(
  arcpy.Array(
    [
      arcpy.Point(-77.4349451, 37.5408265),
      arcpy.Point(-78.6384349, 35.7780943),
    ]
  ),
  arcpy.SpatialReference(4326),
)

# Geodetická délka (GEODESIC) v km
length_km = line.getLength("GEODESIC", "Kilometers")
print(f"Geodesic length: {length_km:.2f} km")

Objekt Array

  • arcpy.Array() - speciální objekty ArcPy pro tvorbu polí
  • pole lze i vzájemně zanořovat - tzn. pole polí může existovat
  • zvláštnost API
  • použití např. pro tvorbu linií:
arcpy.Polyline( 
    arcpy.Array(
        [
          arcpy.Point(-77.4349451, 37.5408265), 
          arcpy.Point(-78.6384349, 35.7780943),
        ]
    ),
    arcpy.SpatialReference(4326)
)

Geometrické operace

  • Geometry.intersect(other, dimension)
  • Geometry.union(other)
  • Geometry.difference(other)
  • Geometry.symmetricDifference(other)

Ukázka práce s geometrií a výpočtem plochy

import arcpy

# Jednoduchý polygon (čtverec) v projektovaném SRS (Web Mercator)
poly = arcpy.Polygon(
  arcpy.Array(
    [
      arcpy.Point(1350000, 6250000),
      arcpy.Point(2100000, 6250000),
      arcpy.Point(2100000, 6620000),
      arcpy.Point(1350000, 6620000),
      arcpy.Point(1350000, 6250000),]
  ),
  arcpy.SpatialReference(3857),
)

# PLANAR plocha v m^2 (PCS jednotky)
area_m2 = poly.getArea("PLANAR", "SquareMeters")
print(f"Planar area: {area_m2:.0f} m^2")

# Projekce na WGS84 s transformačním názvem (pokud je potřeba)
poly_wgs84 = poly.projectAs(arcpy.SpatialReference(4326))

# GEODESIC plocha v km^2
area_km2 = poly_wgs84.getArea("GEODESIC", "SquareKilometers")
print(f"Geodesic area: {area_km2:.3f} km^2")

Ukázky použití různých funkcí třídy

  • praktické příklady
  • dle dokumentace

Dotazy?