正在加载...
正在搜索...
无匹配项
multipoint_range.cuh
查看此文件的文档。
1/*
2 * 版权所有 (c) 2022, NVIDIA CORPORATION.
3 *
4 * 根据 Apache 许可证 2.0 版本("许可证")获得许可;
5 * 除非符合许可证的规定,否则不得使用此文件。
6 * 您可以在以下网址获得许可证的副本:
7 *
8 * https://apache.ac.cn/licenses/LICENSE-2.0
9 *
10 * 除非适用法律要求或书面同意,否则软件
11 * 根据许可证分发,是基于“原样”分发的,
12 * 不带任何明示或暗示的担保或条件。
13 * 有关管理权限和
14 * 许可证下的限制。
15 */
16
17#pragma once
18
19#include <cuspatial/cuda_utils.hpp>
20#include <cuspatial/traits.hpp>
21#include <cuspatial/types.hpp>
22
23#include <thrust/iterator/counting_iterator.h>
24
25namespace cuspatial {
26
31
52template <typename GeometryIterator, typename VecIterator>
54 public
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>
60
64 CUSPATIAL_HOST_DEVICE multipoint_range(GeometryIterator geometry_begin,
65 GeometryIterator geometry_end,
66 VecIterator points_begin,
67 VecIterator points_end);
68
72 CUSPATIAL_HOST_DEVICE auto num_multipoints();
73
77 CUSPATIAL_HOST_DEVICE auto num_points();
78
82 CUSPATIAL_HOST_DEVICE auto size() { return num_multipoints(); }
83
87 CUSPATIAL_HOST_DEVICE auto multipoint_begin();
88
92 CUSPATIAL_HOST_DEVICE auto multipoint_end();
93
97 CUSPATIAL_HOST_DEVICE auto begin() { return multipoint_begin(); }
98
102 CUSPATIAL_HOST_DEVICE auto end() { return multipoint_end(); }
103
107 CUSPATIAL_HOST_DEVICE auto point_begin();
108
112 CUSPATIAL_HOST_DEVICE auto point_end();
113
117 CUSPATIAL_HOST_DEVICE auto offsets_begin();
118
122 CUSPATIAL_HOST_DEVICE auto offsets_end();
123
127 template <typename IndexType>
128 CUSPATIAL_HOST_DEVICE auto geometry_idx_from_point_idx(IndexType point_idx) const;
129
137 template <typename IndexType>
138 CUSPATIAL_HOST_DEVICE auto operator[](IndexType idx);
139
147 template <typename IndexType>
148 CUSPATIAL_HOST_DEVICE auto point(IndexType idx);
149
154 CUSPATIAL_HOST_DEVICE bool is_single_point_range();
155
156 protected
158 GeometryIterator _geometry_begin;
160 GeometryIterator _geometry_end;
162 VecIterator _points_begin;
164 VecIterator _points_end;
165};
166
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)
197{
199 geometry_begin, geometry_begin + num_multipoints + 1, point_begin, point_begin + num_points};
200}
201
212template <typename IntegerRange, typename PointRange>
213auto make_multipoint_range(IntegerRange geometry_offsets, PointRange points)
214{
215 return multipoint_range(
216 geometry_offsets.begin(), geometry_offsets.end(), points.begin(), points.end());
217}
218
225template <collection_type_id Type,
226 typename T,
227 typename IndexType,
228 CUSPATIAL_ENABLE_IF(Type == collection_type_id::SINGLE),
229 typename GeometryColumnView>
230auto make_multipoint_range(GeometryColumnView const& points_column)
231{
232 CUSPATIAL_EXPECTS(points_column.geometry_type() == geometry_type_id::POINT,
233 "Must be POINT geometry type.");
234 auto geometry_iter = thrust::make_counting_iterator(0);
235 auto const& points_xy = points_column.child(); // 忽略 x-y 偏移 {0, 2, 4...}
236
237 auto points_it = make_vec_2d_iterator(points_xy.template begin<T>());
238
239 return multipoint_range(geometry_iter,
240 thrust::next(geometry_iter, points_column.size() + 1),
241 points_it,
242 points_it + points_xy.size() / 2);
243}
244
251template <collection_type_id Type,
252 typename T,
253 typename IndexType,
254 CUSPATIAL_ENABLE_IF(Type == collection_type_id::MULTI),
255 typename GeometryColumnView>
256auto make_multipoint_range(GeometryColumnView const& points_column)
257{
258 CUSPATIAL_EXPECTS(points_column.geometry_type() == geometry_type_id::POINT,
259 "Must be POINT geometry type.");
260 auto const& geometry_offsets = points_column.offsets();
261 auto const& points_xy = points_column.child().child(1); // 忽略 x-y 偏移 {0, 2, 4...}
262
263 auto points_it = make_vec_2d_iterator(points_xy.template begin<T>());
264
265 return multipoint_range(geometry_offsets.template begin<IndexType>(),
266 geometry_offsets.template end<IndexType>(),
267 points_it,
268 points_it + points_xy.size() / 2);
269};
270
274
275} // namespace cuspatial
276
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 数据的迭代器。