#include #include #include #include #include #include #include #include #include #include #include #include #include #include namespace DB { class FunctionPolygonsIntersection : public IFunction { public: static inline const char * name = "polygonsIntersection"; explicit FunctionPolygonsIntersection() = default; static FunctionPtr create(const Context &) { return std::make_shared(); } String getName() const override { return name; } bool isVariadic() const override { return false; } size_t getNumberOfArguments() const override { return 2; } DataTypePtr getReturnTypeImpl(const DataTypes &) const override { return DataTypeCustomMultiPolygonSerialization::nestedDataType(); } ColumnPtr executeImpl(const ColumnsWithTypeAndName & arguments, const DataTypePtr & /*result_type*/, size_t input_rows_count) const override { auto first_parser = makeGeometryFromColumnParser(arguments[0]); auto first_container = createContainer(first_parser); auto second_parser = makeGeometryFromColumnParser(arguments[1]); auto second_container = createContainer(second_parser); MultiPolygonSerializer serializer; for (size_t i = 0; i < input_rows_count; i++) { if (i == 0) get(first_parser, first_container, i); if (i == 0) get(second_parser, second_container, i); CartesianGeometry intersection = CartesianMultiPolygon({{{{}}}}); boost::geometry::intersection( boost::get(first_container), boost::get(second_container), boost::get(intersection)); boost::get(intersection).erase( boost::get(intersection).begin()); serializer.add(intersection); } return serializer.finalize(); } bool useDefaultImplementationForConstants() const override { return true; } }; void registerFunctionPolygonsIntersection(FunctionFactory & factory) { factory.registerFunction(); } }