Skip to content

Commit

Permalink
Make HilbertEncoder::sort generic
Browse files Browse the repository at this point in the history
  • Loading branch information
dbaston committed Sep 14, 2022
1 parent fbce288 commit 15479c4
Show file tree
Hide file tree
Showing 2 changed files with 38 additions and 30 deletions.
39 changes: 37 additions & 2 deletions include/geos/shape/fractal/HilbertEncoder.h
Original file line number Diff line number Diff line change
Expand Up @@ -16,15 +16,14 @@
#pragma once

#include <geos/export.h>
#include <geos/geom/Geometry.h>
#include <string>
#include <vector>

// Forward declarations
namespace geos {
namespace geom {
class Coordinate;
class Geometry;
class Envelope;
}
}

Expand All @@ -41,6 +40,28 @@ class GEOS_DLL HilbertEncoder {
uint32_t encode(const geom::Envelope* env);
static void sort(std::vector<geom::Geometry*>& geoms);

template<typename T>
static geom::Envelope getEnvelope(T begin, T end) {
geom::Envelope extent;
for (auto it = begin; it != end; ++it) {
const auto* g = *it;
if (extent.isNull())
extent = *(g->getEnvelopeInternal());
else
extent.expandToInclude(*(g->getEnvelopeInternal()));
}

return extent;
}

template<typename T>
static void sort(T begin, T end) {
auto extent = getEnvelope(begin, end);
HilbertEncoder encoder(12, extent);
HilbertComparator hilbertCompare(encoder);
std::sort(begin, end, hilbertCompare);
}

private:

uint32_t level;
Expand All @@ -49,6 +70,20 @@ class GEOS_DLL HilbertEncoder {
double strideX;
double strideY;

struct HilbertComparator {

HilbertEncoder& enc;

HilbertComparator(HilbertEncoder& e)
: enc(e) {};

bool
operator()(const geom::Geometry* a, const geom::Geometry* b)
{
return enc.encode(a->getEnvelopeInternal()) > enc.encode(b->getEnvelopeInternal());
}
};

};


Expand Down
29 changes: 1 addition & 28 deletions src/shape/fractal/HilbertEncoder.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -59,34 +59,7 @@ HilbertEncoder::encode(const geom::Envelope* env)
void
HilbertEncoder::sort(std::vector<geom::Geometry*>& geoms)
{
struct HilbertComparator {

HilbertEncoder& enc;

HilbertComparator(HilbertEncoder& e)
: enc(e) {};

bool
operator()(const geom::Geometry* a, const geom::Geometry* b)
{
return enc.encode(a->getEnvelopeInternal()) > enc.encode(b->getEnvelopeInternal());
}
};

geom::Envelope extent;
for (const geom::Geometry* geom: geoms)
{
if (extent.isNull())
extent = *(geom->getEnvelopeInternal());
else
extent.expandToInclude(*(geom->getEnvelopeInternal()));
}
if (extent.isNull()) return;

HilbertEncoder encoder(12, extent);
HilbertComparator hilbertCompare(encoder);
std::sort(geoms.begin(), geoms.end(), hilbertCompare);
return;
sort(geoms.begin(), geoms.end());
}


Expand Down

0 comments on commit 15479c4

Please sign in to comment.