GeoSeries, Intersection, Spatial Predicates и други!

Автори: Томсън Комер, Марк Харис, Бен Джармак, Майкъл Уанг

cuSpatial продължава да се насочва към пълна поддръжка на предикат за пространствени отношения (DE-9IM) и декартово разстояние между всеки две геометрии. В подкрепа на тези цели cuSpatial 23.04 включва множество нови функции, както и нов преносим компютър, който показва възможностите на cuSpatial. В тази версия има и някои революционни промени, за да се гарантира, че всички функции в библиотеката отговарят на нашите високи стандарти.

Нови функции

  • Стандартизация на GeoSeries
  • Пресичане на линия-низа
  • Изчисляване на разстоянието точка-полигон
  • Двоични предикати: равни и пресичащи се
  • Тетрадка за броене със знак Стоп

Стандартизация на GeoSeries

Предишните издания на cuSpatial значително подобриха възможностите на обекта от геометрична серия на cuSpatial: GeoSeries. В тази версия cuSpatial стандартизира всички API входове с GeoSeries. Вместо да предава персонализирано отместване и координатни масиви, както преди, всички API на cuSpatial вече приемат GeoSeries като вход. Конструирането на cuSpatial GeoSeries от GeoPandas е толкова просто, колкото:

import geopandas as gpd
gpds1 = gpd.GeoSeries([Point(0, 0), Point(1, 1)])
cus1 = cuspatial.GeoSeries(gpds)

Можете също така директно да конструирате GeoSeries от списък с оформени обекти:

cus2 = cuspatial.GeoSeries([Point(2, 2), Point(3, 3)])

Използването на GeoSeries навсякъде значително опростява извикванията на cuSpatial API.

# cuspatial 23.02
old = cuspatial.haversine_distance(p1_lon, p1_lat, p2_lon, p2_lat)
# cuspatial 23.04
new = cuspatial.haversine_distance(p1, p2)

Преплетени координати x-y v.s. отделна колона с координати x-y

GeoSeries приема, че основните координати се съхраняват в една колона x-y с подреждане. За данни, съхранявани в отделни колони x-y, cuSpatial предоставя следните нови фабрични методи за конструиране на GeoSeries.

GeoSeries.from_points_xy
GeoSeries.from_multipoints_xy
GeoSeries.from_linestrings_xy
GeoSeries.from_polygons_xy

За да конструирате GeoSeries от отделни колони с координати, първо извикайте interleave_columns() от cuDF, за да конструирате колона с интерлидирани координати, след което конструирайте geoseries с from_points_xy.

coords = cudf.DataFrame({“x”: xcol, “y”: ycol}).interleave_columns()
points = GeoSeries.from_points_xy(coords)

Актуализирането на API за приемане на входни данни от GeoSeries е голяма промяна. Това е необходима промяна, тъй като има много формати на ГИС данни, докато изчислителните ядра на libcuspatial имат силни предположения за входните данни. Чрез разделянето на конструкцията на структурата на данните и изчислението, този дизайн прави cuSpatial изчислението по-ефективно и стабилно.

Пресичане на струна-низа

„Операциите на набора“ позволяват на потребителите да идентифицират и анализират припокриващи се пространствени характеристики, което е критично за задачи като оптимизиране на маршрута, разпределение на ресурси и разрешаване на конфликти при планирането на инфраструктурата. cuSpatial 23.04 въвежда API, който изчислява пресичащите се геометрии между две колони от линейни низове. API може да бъде извикан чрез cuspatial.pairwise_linestring_intersection. Следващият пример показва как да го използвате.

Дадени са два линейни низа (ABCDE, FGHI), изчислете пресечните точки между тях:

>>> from shapely.geometry import *
>>> from cuspatial.core.binops.intersection import pairwise_linestring_intersection
>>> l1 = cuspatial.GeoSeries([
… LineString([(0, 0), (2, 1), (4, 3), (2, 5), (0, 3)])])
>>> l2 = cuspatial.GeoSeries([
… LineString([(-1, 6), (2, 3), (3, 4), (1, 6)])])
>>> offsets, geoms, lookbacks = pairwise_linestring_intersection(l1, l2)
>>> offsets
<cudf.core.column.numerical.NumericalColumn object at 0x7f097c987bc0>
[
 0,
 2
]
dtype: int32
>>> geoms
0 POINT (1.00000 4.00000)
1 LINESTRING (2.00000 5.00000, 3.00000 4.00000)
dtype: geometry
>>> lookbacks
 lhs_linestring_id lhs_segment_id rhs_linestring_id rhs_segment_id
0 [0, 0] [3, 2] [0, 0] [0, 2]

API връща 3-кортеж:

  • offsets, cuDF целочислена серия, която включва отместванията към първите резултатни геометрии за всяка двойка;
  • geoms, GeoSeries, който съдържа резултатите от пресичането (точки и линейни низове);
  • lookbacks, рамка с данни с 4 колони, която съдържа изходните идентификатори на геометрията, от които да търсите резултата.

В този пример резултатът offsets от [0, 2] показва, че пресечната точка за 0-тата двойка започва от индекс 0 на геосерията и има два резултата.

Геосерията (geoms), показва, че резултатът съдържа две стойности:

  1. Точка с координати (1, 4).
  2. Това е пресечната точка между линиите (D, E) и (F, G) в изображението по-горе.
  3. Линеен низ с координати (2, 5)-›(3, 4).
  4. Това е пресичащият се сегмент (D, H) на изображението по-горе.

0-ият елемент в 0-ия ред на идентификаторите за ретроспекция (lookbacks) показва позицията на първата геометрия на резултата в първата двойка. От примера по-горе, първата стойност — която съответства на първата геометрия в geoms — за всеки елемент в ретроспективи е (0, 3, 0, 0).

(0, 3, 0, 0) означава, че ТОЧКА (1, 4) (първата (0) геометрия, върната в geoms) идва от първия (0) редов низ (ABCDE), четвъртия (3 ) сегмент (2, 5) -› (0, 3) от лявата страна и първи (0) редов низ (FGHI), първи (0) сегмент (-1, 6)-›( 2, 3) от дясната страна.

Във входа няма многоредов низ, следователно всички идентификационни номера за обратен преглед на редови низове са 0.

Ние осъзнаваме, че това добавя сложност, но това е така, защото пресичането е мощен примитив. В последователен API, който взема единична двойка геометрии за всеки тест за пресичане, извикващият код знае веднага кои входни геометрии се пресичат. Паралелен API, който работи с масиви от данни, трябва да предостави подробности за това кои геометрии се пресичат, така че повикващият да може да действа върху резултатите. Нямаме търпение да видим какво създавате с pairwise_linestring_intersection!

Изчисляване на разстоянието точка-полигон

Бяха направени големи крачки към набора от изчисления на декартови разстояния на cuSpatial (известен като ST_Distance на езика на PostGIS/MySQL/SpatiaLite) в тази версия с добавянето на изчисление на разстоянието точка-полигон. За да използвате тази нова функция, извикайте cuspatial.pairwise_point_polygon_distance API.

Този пример показва две двойки входове: точка E и многоъгълник ABC и множество точки G, F и многоъгълник BCD. Използвайте API, за да изчислите разстоянията, както в следния код.

>>> import cuspatial
>>> from shapely.geometry import *
>>> lhs = cuspatial.GeoSeries([MultiPoint([(0, 2)]), MultiPoint([(2 ,1), (2, 3)])])
>>> rhs = cuspatial.GeoSeries([Polygon([(0, 0), (2, 0), (1, 2), (0, 0)]),
… Polygon([(2, 0), (3, 2), (1, 2), (2, 0)])])
>>> cuspatial.pairwise_point_polygon_distance(lhs, rhs)
0 0.894427
1 0.000000
dtype: float64

Обърнете внимание, че втората двойка в серията съдържа мултиточка, където една от точките се пресича с многоъгълника в съответната двойка, което води до разстояние 0.

Двоични предикати: равни и пресичащи се

cuSpatial 23.04 разширява поддръжката за топологични „двоични предикати“ чрез добавяне на такива, които зависят от „равенството“ и/или „пресичането“ от точка до точка. Тази възможност позволява голям набор от предикати за различни геометрични комбинации.

points.geom_equals(points)
linestrings.geom_equals(linestrings)
polygons.geom_equals(linestrings)
multipoints.geom_equals(multipoints)

points.contains(points)
points.covers(points)
points.intersects(points)
points.within(points)
points.crosses(points)
points.overlaps(points)
points.intersects(points)

linestrings.intersects(points)
linestrings.intersects(multipoints)
linestrings.intersects(linestrings)

points.disjoint(linestring)
linestrings.disjoint(points)
linestrings.disjoint(linestrings)

linestrings.contains(points)
linestrings.covers(points
linestrings.crosses(points)
linestrings.crosses(linestrings)
linestrings.crosses(polygons)
linestrings.overlaps(points)
linestrings.overlaps(linestrings)
linestrings.overlaps(polygons)

Следващата версия на cuSpatial цели пълна поддръжка на пространствени предикати.

Тетрадка за броене със знак Стоп

cuSpatial добавя нов бележник, демонстрирайки възможност за пространствено свързване с функцията точка-в-многоъгълник. Този преносим компютър включва персонализирана структура на данни QuadTree, за да позволи бързи пространствени съединявания на GPU само с няколко реда код, например:

# Build a quadtree with all stop signs in the US
stop_quadtree = QuadTree(d_stops, x_column=’x’, y_column=’y’)

# Pass CA zip code boundary polygons
stop_quadtree.set_polygon(CA_zipcode, poly_column=”WKT”)

# Join the stop signs and the zip code dataframe
stop_by_zipcode = stop_quadtree.point_left_join_polygon([“x”, “y”], [“ZCTA5CE10”])

Това филтрира всички знаци за спиране, които съществуват във всеки пощенски код в Калифорния. И накрая, бележникът визуализира броя на пощенските кодове на карта. Вижте бележника, за да видите и взаимодействате с картата!

Други подобрения и корекции на грешки

В допълнение към основните характеристики по-горе, cuSpatial 23.04 включва редица други подобрения и корекции на грешки. Рефакторингът на внедряването на C++ на cuSpatial е завършен след около година усилия, с последващи действия в 23.06 за подобряване на реорганизацията на заглавката и източника. Libcuspatial вече се състои от два слоя: общия API само за заглавка, където се изпълняват алгоритми, и API, базиран на колони cuDF, който позволява оперативна съвместимост с libcudf.

Зависимостта от GDAL е премахната, което прави инсталацията по-лека и проправя пътя към поддръжка на PIP инсталация.

Документацията продължава да се подобрява с актуализации и корекции на множество раздели на Ръководството за потребителя.

Критични промени

В допълнение към промените в API за поддръжка на GeoSeries, има две значителни премахвания на API. Функцията за кубична сплайн интерполация не беше широко използвана и разкри грешки в зависимостите, ограничавайки използваемостта. Този API също не се свърза добре с набора функции cuSpatial, така че беше премахнат. Много ограниченият четец на шейпфайлове също беше премахнат поради силната му зависимост от GDAL, ограничения паралелизъм и ограничения набор от функции (само полигони и никакви други типове геометрия не могат да бъдат заредени). Планираме да започнем да добавяме входно/изходни данни за геопространствени данни с повече възможности и по-висока производителност в близко бъдещо издание.

Опитайте cuSpatial 23.04 днес

Изпитайте новите функции и високата производителност на cuSpatial 23.04 и пренесете своя пространствен анализ на нови места. С последната версия въведохме няколко вълнуващи функции и подобрения, които ще революционизират вашите изчисления на пространствени отношения. „Изпробвайте новите функции“ и „нови преносими компютри“. „Присъединете се към нашата нарастваща общност“ от разработчици и изследователи, използващи възможностите на cuSpatial за ефективен и стабилен пространствен анализ.

Ръководство за потребителя на cuSpatial

cuSpatial дискусионен форум

cuSpatial Github