Delen via


geo_intersection_line_with_polygon()

Berekent het snijpunt van een lijn of een multilijn met een veelhoek of een multipolygon.

Syntax

geo_intersection_line_with_polygon( lineString,Veelhoek)

Meer informatie over syntaxisconventies.

Parameters

Naam Type Vereist Beschrijving
lineString dynamic ✔️ Een LineString of MultiLineString in de GeoJSON-indeling.
Veelhoek dynamic ✔️ Een veelhoek of multipolygon in de GeoJSON-indeling.

Retouren

Snijpunt in GeoJSON-indeling en van een dynamisch gegevenstype. Als lineString of een multiLineString of een veelhoek of een multipolygon ongeldig zijn, produceert de query een null-resultaat.

Notitie

Definitie en beperkingen van LineString

dynamic({"type": "LineString","coördinaten": [[lng_1,lat_1], [lng_2,lat_2], ..., [lng_N,lat_N]]})

dynamic({"type": "MultiLineString","coördinaten": [[line_1, line_2, ..., line_N]]})

  • LineString-coördinatenmatrix moet ten minste twee vermeldingen bevatten.
  • Coördinaten [lengtegraad, breedtegraad] moeten geldig zijn waarbij lengtegraad een reëel getal is in het bereik [-180, +180] en breedtegraad een reëel getal in het bereik [-90, +90].
  • De randlengte moet kleiner zijn dan 180 graden. De kortste rand tussen de twee hoekpunten wordt gekozen.

Polygoondefinitie en beperkingen

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

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

  • LinearRingShell is vereist en gedefinieerd als een counterclockwise geordende matrix van coördinaten [[lng_1,lat_1],...,[lng_i,lat_i],...,[lng_j,lat_j],...,[lng_1,lat_1]]. Er kan maar één shell zijn.
  • LinearRingHole is optioneel en wordt gedefinieerd als een clockwise geordende matrix van coördinaten [[lng_1,lat_1],...,[lng_i,lat_i],...,[lng_j,lat_j],...,[lng_1,lat_1]]. Er kunnen een willekeurig aantal binnenringen en gaten zijn.
  • LinearRing-hoekpunten moeten verschillend zijn met ten minste drie coördinaten. De eerste coördinaat moet gelijk zijn aan de laatste. Er zijn ten minste vier vermeldingen vereist.
  • De coördinaten [lengtegraad, breedtegraad] moeten geldig zijn. Lengtegraad moet een reëel getal zijn in het bereik [-180, +180] en breedtegraad moet een reëel getal in het bereik [-90, +90] zijn.
  • LinearRingShell omsluit maximaal de helft van de bol. LinearRing verdeelt de bol in twee regio's. De kleinste van de twee regio's wordt gekozen.
  • De lengte van de LinearRing-rand moet kleiner zijn dan 180 graden. De kortste rand tussen de twee hoekpunten wordt gekozen.
  • LinearRings mag geen randen kruisen en mogen geen randen delen. LinearRings kan hoekpunten delen.
  • Veelhoek bevat de hoekpunten.

Tip

Gebruik letterlijke LineString of MultiLineString voor betere prestaties.

Voorbeelden

In het volgende voorbeeld wordt het snijpunt tussen lijn en veelhoek berekend. In dit geval is het resultaat een lijn.

let lineString = dynamic({"type":"LineString","coordinates":[[-73.985195,40.788275],[-73.974552,40.779761]]});
let polygon = dynamic({"type":"Polygon","coordinates":[[[-73.9712905883789,40.78580561168767],[-73.98004531860352,40.775276834803655],[-73.97000312805176,40.77852663535664],[-73.9712905883789,40.78580561168767]]]});
print intersection = geo_intersection_line_with_polygon(lineString, polygon)

Uitvoer

Snijpunt
{"type": "LineString","coördinaten": [[-73,975611956578192,40,78060906714618],[-73.974552,40.779761]]}

In het volgende voorbeeld wordt het snijpunt tussen lijn en veelhoek berekend. In dit geval is het resultaat een multiline.

let lineString = dynamic({"type":"LineString","coordinates":[[-110.522, 39.198],[-91.428, 40.880]]});
let polygon = dynamic({"type":"Polygon","coordinates":[[[-90.263,36.738],[-102.041,45.274],[-109.335,36.527],[-90.263,36.738]],[[-100.393,41.705],[-103.139,38.925],[-97.558,39.113],[-100.393,41.705]]]});
print intersection = geo_intersection_line_with_polygon(lineString, polygon)

Uitvoer

Snijpunt
{"type": "MultiLineString","coördinaten": [[[ -106.89353655881905, 39.769226209776306],[ -101.74448553679453, 40.373506008712525]],[[-99.136499431328858, 40,589336512699994],[-95.284527737311791, 40,799060242246348]]]]}

De volgende regel en veelhoek snijden elkaar niet.

let lineString = dynamic({"type":"LineString","coordinates":[[1, 1],[2, 2]]});
let polygon = dynamic({"type":"Polygon","coordinates":[[[-73.9712905883789,40.78580561168767],[-73.98004531860352,40.775276834803655],[-73.97000312805176,40.77852663535664],[-73.9712905883789,40.78580561168767]]]});
print intersection = geo_intersection_line_with_polygon(lineString, polygon)

Uitvoer

Snijpunt
{"type": "GeometryCollection","geometries": []}

In het volgende voorbeeld worden alle wegen in de nyc GeoJSON-wegentabel gevonden die de letterlijke veelhoek van het interessegebied kruisen.

let area_of_interest = dynamic({"type":"Polygon","coordinates":[[[-73.95768642425537,40.80065354924362],[-73.9582872390747,40.80089719667298],[-73.95869493484497,40.80050736035672],[-73.9580512046814,40.80019873831593],[-73.95768642425537,40.80065354924362]]]});
NY_Manhattan_Roads
| project name = features.properties.Label, road = features.geometry
| project name, intersection = geo_intersection_line_with_polygon(road, area_of_interest)
| where array_length(intersection.geometries) != 0

Uitvoer

naam Snijpunt
CentralParkW {"type":"MultiLineString","coördinaten":[[[[-73.958295846836933,40.800316027289647],[-73.9582724,40.8003415]],[[[-73.958413422194482,40.80037239620097],[-73.9584093,40.8003797]]]}
FrederickDouglassCir {"type":"LineString","coordinates":[[-73.9579272943862,40.800751229494182],[-73.9579019,40.8007238],[-73.9578688,40.8006749],[-73.9578508,40.8006203],[-73.9578459,40.800570199999996],[-73.9578484,40.80053310000001],[-73.9578627,40.800486700000008],[-73.957913,40.800421100000008],[-73.9579668,40.8003923],[-73.9580189,40.80037260000001],[-73.9580543,40.8003616],[-73.9581237,40.8003395],[-73.9581778,40.8003365],[-73.9582724,40.8003415],[- 73.958308,40.8003466],[-73.9583328,40.8003517],[-73.9583757,40.8003645],[-73.9584093,40.8003797],[-73.9584535,40.80041099999999],[-73.9584818,40.8004536],[-73.958507000000012,40.8004955],[-73.9585217,40.800562400000004],[-73.9585282,40.8006155],[-73.958416200000016,40.8007325],[-73.9583541,40.8007785],[-73.9582772,40.800811499999995],[-73.9582151,40.8008285],[-73.958145918999392,40.800839887820239]]}
W110thSt {"type":"MultiLineString","coördinaten":[[[[[-73,957828446036331,40.800476476316327],[-73.9578627,40,800486700000008]],[[73.9585282,40.8006155],[-73.958565492035873,40,800631133466972]],[[[-73.9584162000000 16,40,8007325],[-73,958446850928084,40,80074457746617]]]}
WestDr {"type":"LineString","coördinaten":[[-73.9580543,40.8003616],[-73.958009693938735,40.800250494588468]]}

In het volgende voorbeeld worden alle provincies in de VS gevonden die elkaar snijden met de letterlijke LineString van het interessegebied.

let area_of_interest = dynamic({"type":"LineString","coordinates":[[-73.97159099578857,40.794513338780895],[-73.96738529205322,40.792758888618756],[-73.96978855133057,40.789769718601505]]});
US_Counties
| project name = features.properties.NAME, county = features.geometry
| project name, intersection = geo_intersection_line_with_polygon(area_of_interest, county)
| where array_length(intersection.geometries) != 0

Uitvoer

naam Snijpunt
New York {"type": "LineString","coördinaten": [[-73,971590995788574, 40,79451338780895], [-73.967385292053223, 40.79275888618756],[-73.96978855130566, 40.789769718601512]}

In het volgende voorbeeld wordt een null-resultaat geretourneerd omdat de LineString ongeldig is.

let lineString = dynamic({"type":"LineString","coordinates":[[-73.985195,40.788275]]});
let polygon = dynamic({"type":"Polygon","coordinates":[[[-73.95768642425537,40.80065354924362],[-73.9582872390747,40.80089719667298],[-73.95869493484497,40.80050736035672],[-73.9580512046814,40.80019873831593],[-73.95768642425537,40.80065354924362]]]});
print is_invalid = isnull(geo_intersection_2lines(lineString, polygon))

Uitvoer

is_invalid
1

In het volgende voorbeeld wordt een null-resultaat geretourneerd omdat de veelhoek ongeldig is.

let lineString = dynamic({"type":"LineString","coordinates":[[-73.97159099578857,40.794513338780895],[-73.96738529205322,40.792758888618756],[-73.96978855133057,40.789769718601505]]});
let polygon = dynamic({"type":"Polygon","coordinates":[]});
print is_invalid = isnull(geo_intersection_2lines(lineString, polygon))

Uitvoer

is_invalid
1