12template<fishnet::geometry::Shape S>
18 template<
typename... Args>
20 size_t key() const noexcept {
29 return static_cast<S
>(*this);
33 return this->
key() == other.key();
36 size_t hash() const noexcept {
40 template<fishnet::VectorGISFile F,fishnet::util::Predicate<S> Filter = fishnet::util::TruePredicate>
41 static std::vector<SettlementShape<S>>
read(
48 std::vector<SettlementShape<S>> settlements;
49 OGRSpatialReference spatialRef;
50 static_assert(
fishnet::VectorGISFile<std::ranges::range_value_t<
decltype(files)>>,
"Files must be VectorGISFiles");
51 for(
const auto & shp : files) {
52 auto layer = reader(shp).value_or_throw();
55 if(spatialRef.IsEmpty())
56 spatialRef = layer.getSpatialReference();
57 if(not spatialRef.IsSame(&layer.getSpatialReference()))
58 throw std::runtime_error(
"Spatial reference of files do not match!\nExpecting: "+std::string(spatialRef.GetName())+
"\nActual: "+layer.getSpatialReference().GetName());
60 auto fishnetIDField = layer.getSizeField(idLayerName).value_or_throw(
"Could not find FISHNET_ID field in shp file: \n"+shp.getPath().string());
61 for(
const auto & feature : layer.getFeatures()) {
62 auto id = feature.getAttribute(fishnetIDField).value_or_throw(
"Could not find FISHNET_ID attribute in feature with geometry:\n"+ feature.getGeometry().toString());
63 if(filter(feature.getGeometry()))
64 settlements.emplace_back(
id,fileRef,std::move(feature.getGeometry()));
70 template<fishnet::VectorGISFile F, fishnet::util::Predicate<S> Filter = fishnet::util::TruePredicate>
71 static std::vector<SettlementShape<S>>
read(
78 return read<F,Filter>(std::views::single(
file),std::forward<
decltype(reader)>(reader),std::forward<
decltype(fileRefMapper)>(fileRefMapper),filter,idLayerName);
Settlement Object, which fulfills the requirements of a Polygon and for a Node stored in the Memgraph...
Definition SettlementShape.hpp:13
size_t key() const noexcept
Definition SettlementShape.hpp:20
SettlementShape(size_t id, FileReference fileRef, Args &&... args)
Definition SettlementShape.hpp:19
bool operator==(const SettlementShape< S > &other) const noexcept
Definition SettlementShape.hpp:32
static std::vector< SettlementShape< S > > read(const F &file, fishnet::VectorLayerReader< F, S > auto &&reader, fishnet::util::UnaryFunction< F, FileReference > auto &&fileRefMapper, const Filter &filter=fishnet::util::TruePredicate {}, const std::string &idLayerName=Task::FISHNET_ID_FIELD)
Definition SettlementShape.hpp:71
const FileReference & file() const noexcept
Definition SettlementShape.hpp:24
size_t hash() const noexcept
Definition SettlementShape.hpp:36
auto geometry() const noexcept
Definition SettlementShape.hpp:28
static std::vector< SettlementShape< S > > read(fishnet::util::range_of< F > auto const &files, fishnet::VectorLayerReader< F, S > auto &&reader, fishnet::util::UnaryFunction< F, FileReference > auto &&fileRefMapper, const Filter &filter=fishnet::util::TruePredicate {}, const std::string &idLayerName=Task::FISHNET_ID_FIELD)
Definition SettlementShape.hpp:41
static constexpr std::string FISHNET_ID_FIELD
Definition Task.hpp:25
Interface for all Vector GISFile types.
Definition GISFile.hpp:187
Interface for reading a VectorLayer from a file.
Definition IOConcepts.hpp:17
Definition FunctionalConcepts.hpp:9
Definition CollectionConcepts.hpp:21
File reference have a unique id for each file.
Definition FileReference.hpp:8
Definition FunctionalConcepts.hpp:71