Skip to content

Commit

Permalink
Fixed GeoJson export (for MultiGeometries)
Browse files Browse the repository at this point in the history
  • Loading branch information
Grandro committed Jul 9, 2024
1 parent 4d8e817 commit dd612f0
Show file tree
Hide file tree
Showing 5 changed files with 37 additions and 8 deletions.
10 changes: 10 additions & 0 deletions src/qlever-petrimaps/server/GeoJSONRequestor.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -20,12 +20,22 @@ void GeoJSONRequestor::request() {
_ready = false;
_objects.clear();
_clusterObjects.clear();
_rowIdToObjectId.clear();

_objects = _cache->getRelObjects();
_numObjects = _objects.size();

LOG(INFO) << "[REQUESTOR] ... done, got " << _objects.size() << " objects.";

// Create mapping row_id to object_id for multigeometries
for (size_t oid = 0; oid < _objects.size(); oid++) {
std::pair<ID_TYPE, ID_TYPE> object = _objects[oid];
ID_TYPE object_row_id = object.second;
_rowIdToObjectId[object_row_id] = oid;
}

LOG(INFO) << "[REQUESTOR] Matching size: " << _rowIdToObjectId.size();

LOG(INFO) << "[REQUESTOR] Calculating bounding box of result...";

util::geo::FBox pointBbox;
Expand Down
12 changes: 6 additions & 6 deletions src/qlever-petrimaps/server/Requestor.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -454,23 +454,23 @@ const ResObj Requestor::getNearest(util::geo::DPoint rp, double rad, double res,
}

// _____________________________________________________________________________
const ResObj Requestor::getGeom(size_t id, double rad) const {
const ResObj Requestor::getGeom(size_t objectId, double rad) const {
if (!_cache->ready()) {
throw std::runtime_error("Geom cache not ready");
}
auto obj = _objects[id];
std::pair<ID_TYPE, ID_TYPE> obj = _objects[objectId];

if (obj.first >= I_OFFSET) {
size_t lineId = obj.first - I_OFFSET;

bool isArea = Requestor::isArea(lineId);

if (isArea) {
return {true, id, {{0, 0}}, {}, {}, geomPolyGeoms(id, rad / 10)};
return {true, objectId, {{0, 0}}, {}, {}, geomPolyGeoms(objectId, rad / 10)};
} else {
return {true, id, {{0, 0}}, {}, geomLineGeoms(id, rad / 10), {}};
return {true, objectId, {{0, 0}}, {}, geomLineGeoms(objectId, rad / 10), {}};
}
} else {
return {true, id, geomPointGeoms(id), {}, {}, {}};
return {true, objectId, geomPointGeoms(objectId), {}, {}, {}};
}
}

Expand Down
5 changes: 5 additions & 0 deletions src/qlever-petrimaps/server/Requestor.h
Original file line number Diff line number Diff line change
Expand Up @@ -63,6 +63,10 @@ class Requestor {
return _clusterObjects;
}

ID_TYPE getObjectIdFromRowId(ID_TYPE row_id) const {
return _rowIdToObjectId.at(row_id);
}

const util::geo::FPoint& getPoint(ID_TYPE id) const {
return _cache->getPoint(id);
}
Expand Down Expand Up @@ -120,6 +124,7 @@ class Requestor {
std::vector<std::pair<ID_TYPE, ID_TYPE>> _objects;
std::vector<std::pair<ID_TYPE, std::pair<size_t, size_t>>> _clusterObjects;
size_t _numObjects = 0;
std::map<ID_TYPE, ID_TYPE> _rowIdToObjectId; // Match row_id to object_id for multigeometries
};
} // namespace petrimaps

Expand Down
10 changes: 10 additions & 0 deletions src/qlever-petrimaps/server/SPARQLRequestor.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@ void SPARQLRequestor::request(const std::string& query) {
_ready = false;
_objects.clear();
_clusterObjects.clear();
_rowIdToObjectId.clear();

RequestReader reader(_cache->getBackendURL(), _maxMemory);

Expand All @@ -48,6 +49,15 @@ void SPARQLRequestor::request(const std::string& query) {
_numObjects = ret.second;
LOG(INFO) << "[REQUESTOR] ... done, got " << _objects.size() << " objects.";

// Create mapping row_id to object_id for multigeometries
for (size_t oid = 0; oid < _objects.size(); oid++) {
std::pair<ID_TYPE, ID_TYPE> object = _objects[oid];
ID_TYPE object_row_id = object.second;
_rowIdToObjectId[object_row_id] = oid;
}

LOG(INFO) << "[REQUESTOR] Matching size: " << _rowIdToObjectId.size();

LOG(INFO) << "[REQUESTOR] Calculating bounding box of result...";

util::geo::FBox pointBbox;
Expand Down
8 changes: 6 additions & 2 deletions src/qlever-petrimaps/server/Server.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1071,16 +1071,18 @@ util::http::Answer Server::handleExportReq(const Params& pars, int sock) const {
}

bool first = false;
size_t rowId = 0;

reqor->requestRows(
[sock, &first, reqor, this](
[sock, &first, reqor, &rowId, this](
std::vector<std::vector<std::pair<std::string, std::string>>> rows) {
std::stringstream ss;
ss << std::setprecision(10);
util::json::Val attrs;
for (size_t i = 0; i < rows.size(); i++) {
auto& row = rows[i];
auto res = reqor->getGeom(i, 0);
ID_TYPE objectId = reqor->getObjectIdFromRowId(rowId);
auto res = reqor->getGeom(objectId, 0);

for (size_t j = 0; j < row.size(); j++) {
attrs.dict[row[j].first] = row[j].second;
Expand All @@ -1091,6 +1093,8 @@ util::http::Answer Server::handleExportReq(const Params& pars, int sock) const {
processGeoJsonOutput(geoJsonOut, res, attrs);
first = true;
ss << "\n";

rowId += 1;
}

std::string buff = ss.str();
Expand Down

0 comments on commit dd612f0

Please sign in to comment.