19#include <cuspatial/cuda_utils.hpp>
20#include <cuspatial/traits.hpp>
23#include <thrust/iterator/counting_iterator.h>
52template <
typename GeometryIterator,
typename VecIterator>
55 using geometry_it_t = GeometryIterator;
56 using point_it_t = VecIterator;
57 using index_t = iterator_value_type<geometry_it_t>
58 using point_t = iterator_value_type<point_it_t>
59 using element_t = iterator_vec_base_type<point_it_t>
65 GeometryIterator geometry_end,
66 VecIterator points_begin,
67 VecIterator points_end);
127 template <
typename IndexType>
137 template <
typename IndexType>
147 template <
typename IndexType>
148 CUSPATIAL_HOST_DEVICE
auto point(IndexType idx);
188template <
typename GeometryIteratorDiffType,
189 typename VecIteratorDiffType,
190 typename GeometryIterator,
191 typename VecIterator>
193 GeometryIteratorDiffType num_multipoints,
194 GeometryIterator geometry_begin,
195 VecIteratorDiffType num_points,
196 VecIterator point_begin)
199 geometry_begin, geometry_begin + num_multipoints + 1, point_begin, point_begin + num_points};
212template <
typename IntegerRange,
typename Po
intRange>
216 geometry_offsets.begin(), geometry_offsets.end(), points.begin(), points.end());
225template <collection_type_id Type,
228 CUSPATIAL_ENABLE_IF(Type == collection_type_id::SINGLE),
229 typename GeometryColumnView>
233 "Must be POINT geometry type.");
234 auto geometry_iter = thrust::make_counting_iterator(0);
235 auto const& points_xy = points_column.child();
240 thrust::next(geometry_iter, points_column.size() + 1),
242 points_it + points_xy.size() / 2);
251template <collection_type_id Type,
254 CUSPATIAL_ENABLE_IF(Type == collection_type_id::MULTI),
255 typename GeometryColumnView>
259 "Must be POINT geometry type.");
260 auto const& geometry_offsets = points_column.offsets();
261 auto const& points_xy = points_column.child().child(1);
265 return multipoint_range(geometry_offsets.template begin<IndexType>(),
266 geometry_offsets.template end<IndexType>(),
268 points_it + points_xy.size() / 2);
277#include <cuspatial/detail/range/multipoint_range.cuh>
CUSPATIAL_HOST_DEVICE auto point(IndexType idx)
返回数组中的第 idx 个点。
CUSPATIAL_HOST_DEVICE auto multipoint_end()
返回多点数组中最后一个多点之后的迭代器。
CUSPATIAL_HOST_DEVICE auto num_multipoints()
返回数组中多点的数量。
CUSPATIAL_HOST_DEVICE auto size()
返回数组中多点的数量。
CUSPATIAL_HOST_DEVICE auto end()
返回多点数组中最后一个多点之后的迭代器。
GeometryIterator _geometry_begin
指向每个多点的起始位置索引数组开头的迭代器。
CUSPATIAL_HOST_DEVICE auto multipoint_begin()
返回多点数组中第一个多点的迭代器。
CUSPATIAL_HOST_DEVICE auto point_end()
返回底层点数组末尾的迭代器。
CUSPATIAL_HOST_DEVICE auto point_begin()
返回底层点数组开头的迭代器。
CUSPATIAL_HOST_DEVICE auto begin()
返回多点数组开头的迭代器。
VecIterator _points_end
指向点数组末尾后一个位置的迭代器。
CUSPATIAL_HOST_DEVICE auto geometry_idx_from_point_idx(IndexType point_idx) const
返回给定点索引的几何对象索引。
VecIterator _points_begin
指向点数组开头的迭代器。
CUSPATIAL_HOST_DEVICE multipoint_range(GeometryIterator geometry_begin, GeometryIterator geometry_end, VecIterator points_begin, VecIterator points_end)
构造一个新的多点数组对象。
CUSPATIAL_HOST_DEVICE auto offsets_begin()
返回底层偏移量数组开头的迭代器。
CUSPATIAL_HOST_DEVICE bool is_single_point_range()
如果范围仅包含单个点,则返回 true。如果范围为空... 则行为未定义。
CUSPATIAL_HOST_DEVICE auto offsets_end()
返回底层偏移量数组末尾的迭代器。
CUSPATIAL_HOST_DEVICE auto num_points()
返回数组中点的数量。
GeometryIterator _geometry_end
指向每个多点的起始位置索引数组末尾后一个位置的迭代器。
CUSPATIAL_HOST_DEVICE auto operator[](IndexType idx)
返回数组中的第 idx 个多点。
#define CUSPATIAL_EXPECTS(cond, reason)
用于检查(前置)条件并在条件不满足时抛出异常的宏。
multipoint_range< GeometryIterator, VecIterator > make_multipoint_range(GeometryIteratorDiffType num_multipoints, GeometryIterator geometry_begin, VecIteratorDiffType num_points, VecIterator point_begin)
从大小和起始迭代器创建 multipoint_range 对象。
auto make_vec_2d_iterator(FirstIter first, SecondIter second)
从两个输入迭代器创建一个指向 vec_2d 数据的迭代器。