Fishnet 2.0.1
Framework for Graph-Based Analysis of GIS Vector Data
Loading...
Searching...
No Matches
SettlementShape.hpp
Go to the documentation of this file.
1#pragma once
3#include <fishnet/GISFile.hpp>
5#include <fishnet/Task.hpp>
12template<fishnet::geometry::Shape S>
13class SettlementShape:public S{
14private:
15 size_t id; // unique id of the settlement
16 FileReference fileRef; // file, which stores the shape
17public:
18 template<typename... Args>
19 SettlementShape(size_t id, FileReference fileRef, Args&&... args):S(std::forward<Args>(args)...),id(id),fileRef(std::move(fileRef)){}
20 size_t key() const noexcept {
21 return id;
22 }
23
24 const FileReference & file() const noexcept {
25 return fileRef;
26 }
27
28 auto geometry() const noexcept {
29 return static_cast<S>(*this);
30 }
31
32 bool operator==(const SettlementShape<S> & other) const noexcept {
33 return this->key() == other.key();
34 }
35
36 size_t hash() const noexcept {
37 return this->id;
38 }
39
40 template<fishnet::VectorGISFile F,fishnet::util::Predicate<S> Filter = fishnet::util::TruePredicate>
41 static std::vector<SettlementShape<S>> read(
42 fishnet::util::range_of<F> auto const & files,
45 const Filter & filter = fishnet::util::TruePredicate {},
46 const std::string & idLayerName = Task::FISHNET_ID_FIELD
47 ){
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();
53 if(layer.isEmpty())
54 continue;
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());
59 FileReference fileRef = fileRefMapper(shp);
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()));
65 }
66 }
67 return settlements;
68 }
69
70 template<fishnet::VectorGISFile F, fishnet::util::Predicate<S> Filter = fishnet::util::TruePredicate>
71 static std::vector<SettlementShape<S>> read(
72 const F & file,
75 const Filter & filter = fishnet::util::TruePredicate {},
76 const std::string & idLayerName = Task::FISHNET_ID_FIELD
77 ){
78 return read<F,Filter>(std::views::single(file),std::forward<decltype(reader)>(reader),std::forward<decltype(fileRefMapper)>(fileRefMapper),filter,idLayerName);
79 }
80};
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
STL namespace.
File reference have a unique id for each file.
Definition FileReference.hpp:8
Definition FunctionalConcepts.hpp:71