geo_polygon_densify()

Converte i poligoni o i bordi planari multipolygon in geodesici aggiungendo punti intermedi.

Sintassi

geo_polygon_densify(Poligono,Tolleranza, [ preserve_crossing ])

Altre informazioni sulle convenzioni di sintassi.

Parametri

Nome Tipo Obbligatoria Descrizione
Poligono dynamic ✔️ Poligono o multipolygon nel formato GeoJSON.
tolerance int, long o real Definisce la distanza massima in metri tra il bordo planare originale e la catena perimetrale geodesica convertita. I valori supportati sono compresi nell'intervallo [0,1, 10000]. Se non specificato, il valore predefinito è 10.
preserve_crossing bool Se true, mantiene l'attraversamento dei bordi sull'antimeridiano. Se non specificato, viene usato il valore predefinito false.

Definizione poligono

dynamic({"type": "Polygon","coordinates": [ LinearRingShell, LinearRingHole_1, ..., LinearRingHole_N ]})

dynamic({"type": "MultiPolygon","coordinates": [[ LinearRingShell, LinearRingHole_1, ..., LinearRingHole_N ], ..., [LinearRingShell, LinearRingHole_1, ..., LinearRingHole_M]]})

  • LinearRingShell è obbligatorio e definito come counterclockwise matrice ordinata di coordinate [[lng_1,lat_1],...,[lng_i,lat_i],...,[lng_j,lat_j],...,[lng_1,lat_1]]. Può esserci una sola shell.
  • LinearRingHole è facoltativo e definito come clockwise matrice ordinata di coordinate [[lng_1,lat_1],...,[lng_i,lat_i],...,[lng_j,lat_j],...,[lng_1,lat_1]]. Ci possono essere qualsiasi numero di anelli interni e fori.
  • LinearRing i vertici devono essere distinti con almeno tre coordinate. La prima coordinata deve essere uguale all'ultima. Sono necessarie almeno quattro voci.
  • Le coordinate [longitudine, latitudine] devono essere valide. La longitudine deve essere un numero reale nell'intervallo [-180, +180] e la latitudine deve essere un numero reale nell'intervallo [-90, +90].
  • LinearRingShell racchiude al massimo la metà della sfera. LinearRing divide la sfera in due aree. Verranno scelte le dimensioni più piccole delle due aree.
  • LinearRing la lunghezza del bordo deve essere inferiore a 180 gradi. Verrà scelto il bordo più corto tra i due vertici.

Vincoli

  • Il numero massimo di punti nel poligono densficato è limitato a 10485760.
  • L'archiviazione dei poligoni in formato dinamico presenta limiti di dimensione.
  • La densificazione di un poligono valido può invalidare il poligono. L'algoritmo aggiunge punti in modo non uniforme e, di conseguenza, può causare l'intreccio dei bordi tra loro.

Motivazione

  • Il formato GeoJSON definisce un bordo tra due punti come linea cartesiana dritta mentre geo_polygon_densify() usa la geodesica.
  • La decisione di usare bordi geodesici o planari può dipendere dal set di dati ed è particolarmente rilevante nei bordi lunghi.

Restituisce

Poligono densified nel formato GeoJSON e di un tipo di dati dinamico . Se il poligono o la tolleranza non è valido, la query genera un risultato Null.

Nota

Le coordinate geospaziali vengono interpretate come rappresentate dal sistema di riferimento delle coordinate WGS-84 .

Esempio

L'esempio seguente densifica il poligono di Manhattan Central Park. I bordi sono brevi e la distanza tra i bordi planari e le relative controparti geodesiche è minore della distanza specificata dalla tolleranza. Di conseguenza, il risultato rimane invariato.

print densified_polygon = tostring(geo_polygon_densify(dynamic({"type":"Polygon","coordinates":[[[-73.958244,40.800719],[-73.949146,40.79695],[-73.973093,40.764226],[-73.982062,40.768159],[-73.958244,40.800719]]]})))

Output

densified_polygon
{"type":"Polygon","coordinates":[[[-73.958244,40.800719],[-73.949146,40.79695],[-73.973093,40.764226],[-73.982062,40.768159],[-73.958244,40.800719]]]}

Nell'esempio seguente vengono densificati due bordi del poligono. La lunghezza dei bordi densificati è di circa 110 km

print densified_polygon = tostring(geo_polygon_densify(dynamic({"type":"Polygon","coordinates":[[[10,10],[11,10],[11,11],[10,11],[10,10]]]})))

Output

densified_polygon
{"type":"Polygon","coordinates":[[[10,10],[10.25,10],[10.5,10],[10.75,10],[11,10]],[11,11],[10.75,11],[10.5,11],[10.25,11],[10,11],[10,10]]]}

Nell'esempio seguente viene restituito un risultato Null a causa dell'input di coordinate non valido.

print densified_polygon = geo_polygon_densify(dynamic({"type":"Polygon","coordinates":[[[10,900],[11,10],[11,11],[10,11],[10,10]]]}))

Output

densified_polygon

Nell'esempio seguente viene restituito un risultato Null a causa dell'input di tolleranza non valido.

print densified_polygon = geo_polygon_densify(dynamic({"type":"Polygon","coordinates":[[[10,10],[11,10],[11,11],[10,11],[10,10]]]}), 0)

Output

densified_polygon