Skip to content

Commit

Permalink
set SRS and data bounds and tile bounds properly
Browse files Browse the repository at this point in the history
  • Loading branch information
mpgerlek committed May 22, 2015
1 parent 62e4df5 commit d03a634
Show file tree
Hide file tree
Showing 12 changed files with 132 additions and 37 deletions.
75 changes: 63 additions & 12 deletions plugins/rialto/io/RialtoDb.cpp
Expand Up @@ -221,12 +221,12 @@ void RialtoDb::createTableGpkgSpatialRefSys()
row r2;
row r3;


const std::string wkt4326 = SpatialReference("EPSG:4326").getWKT(SpatialReference::eCompoundOK);
r1.push_back(column("EPSG:4326"));
r1.push_back(column(4326));
r1.push_back(column("EPSG"));
r1.push_back(column(4326));
r1.push_back(column("EPSG:4326"));
r1.push_back(column(wkt4326));
r1.push_back(column("EPSG:4326"));
rs1.push_back(r1);
m_sqlite->insert(data, rs1);
Expand Down Expand Up @@ -515,10 +515,11 @@ void RialtoDb::readTileTable(std::string const& name, TileTableInfo& info) const
e_tileTablesRead.start();

std::string datetime;
uint32_t srs_id;
double data_min_x, data_min_y, data_max_x, data_max_y;
{
std::ostringstream oss;
oss << "SELECT last_change,data_min_x, data_min_y, data_max_x, data_max_y "
oss << "SELECT last_change, data_min_x, data_min_y, data_max_x, data_max_y, srs_id "
<< "FROM gpkg_contents WHERE table_name='" << name << "'";

log()->get(LogLevel::Debug) << "SELECT for tile set" << std::endl;
Expand All @@ -533,6 +534,7 @@ void RialtoDb::readTileTable(std::string const& name, TileTableInfo& info) const
data_min_y = boost::lexical_cast<double>(r->at(2).data);
data_max_x = boost::lexical_cast<double>(r->at(3).data);
data_max_y = boost::lexical_cast<double>(r->at(4).data);
srs_id = boost::lexical_cast<uint32_t>(r->at(5).data);
assert(!m_sqlite->next());
}

Expand All @@ -556,6 +558,8 @@ void RialtoDb::readTileTable(std::string const& name, TileTableInfo& info) const
assert(!m_sqlite->next());
}

std::string wkt = querySrsWkt(srs_id);

uint32_t maxLevel;
{
std::ostringstream oss;
Expand Down Expand Up @@ -587,7 +591,7 @@ void RialtoDb::readTileTable(std::string const& name, TileTableInfo& info) const
assert(!m_sqlite->next());
}

info.set(datetime, name, maxLevel, numDimensions,
info.set(datetime, name, maxLevel, numDimensions, wkt,
data_min_x, data_min_y, data_max_x, data_max_y,
tmset_min_x, tmset_min_y, tmset_max_x, tmset_max_y);

Expand Down Expand Up @@ -724,11 +728,14 @@ void RialtoDb::writeTileTable(const TileTableInfo& data)
createTableGpkgPctile(data.getName());
}


const uint32_t srs_id = querySrsId(data.getWkt());

{
const std::string sql =
"INSERT INTO gpkg_contents"
" (table_name, data_type, identifier, description, last_change,"
" data_min_x, data_min_y, data_max_x, data_max_y, srs_id)"
" (table_name, data_type, identifier, description, last_change, srs_id,"
" data_min_x, data_min_y, data_max_x, data_max_y)"
" VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)";

records rs;
Expand All @@ -739,7 +746,7 @@ void RialtoDb::writeTileTable(const TileTableInfo& data)
r.push_back(column(data.getName())); // identifier
r.push_back(column(data.getName())); // description
r.push_back(column(data.getDateTime())); // last_change
r.push_back(column(4326)); // srs_id
r.push_back(column(srs_id));
r.push_back(column(data.getDataMinX()));
r.push_back(column(data.getDataMinY()));
r.push_back(column(data.getDataMaxX()));
Expand All @@ -761,11 +768,11 @@ void RialtoDb::writeTileTable(const TileTableInfo& data)
row r;

r.push_back(column(data.getName())); // table_name
r.push_back(column(4326)); // srs_id
r.push_back(column(data.getTmsetMinX()));
r.push_back(column(data.getTmsetMinX()));
r.push_back(column(data.getTmsetMinX()));
r.push_back(column(srs_id));
r.push_back(column(data.getTmsetMinX()));
r.push_back(column(data.getTmsetMinY()));
r.push_back(column(data.getTmsetMaxX()));
r.push_back(column(data.getTmsetMaxY()));

rs.push_back(r);

Expand All @@ -775,7 +782,7 @@ void RialtoDb::writeTileTable(const TileTableInfo& data)
writeDimensions(data);

writeMetadata(data);

e_tileTablesWritten.stop();
}

Expand Down Expand Up @@ -937,6 +944,50 @@ void RialtoDb::writeTile(const std::string& tileTableName, const TileInfo& data)
}


uint32_t RialtoDb::querySrsId(const std::string& wkt) const
{
if (!m_sqlite)
{
throw pdal_error("RialtoDB: invalid state (session does exist)");
}

// TODO: how better to look up SRS than text match of WKT?

std::ostringstream oss;
oss << "SELECT srs_id FROM gpkg_spatial_ref_sys"
<< " WHERE definition='" << wkt << "'";

m_sqlite->query(oss.str());

const row* r = m_sqlite->get();
if (!r) return 0;

// take the first one, ignore any others
const uint32_t srs_id = boost::lexical_cast<uint32_t>(r->at(0).data);

return srs_id;
}


std::string RialtoDb::querySrsWkt(uint32_t srs_id) const
{
std::ostringstream oss;
oss << "SELECT definition "
<< "FROM gpkg_spatial_ref_sys WHERE srs_id=" << srs_id;

log()->get(LogLevel::Debug) << "SELECT for tile set" << std::endl;

m_sqlite->query(oss.str());

// should get exactly one row back
const row* r = m_sqlite->get();
assert(r);
const std::string wkt = r->at(0).data;
assert(!m_sqlite->next());
return wkt;
}


void RialtoDb::xyPointToTileColRow(double x, double y, uint32_t level, uint32_t& col, uint32_t& row)
{
if (x>=180.0) x = -180.0;
Expand Down
3 changes: 3 additions & 0 deletions plugins/rialto/io/RialtoDb.hpp
Expand Up @@ -100,6 +100,9 @@ class PDAL_DLL RialtoDb
bool queryForTiles_step(TileInfo& tileInfo);
bool queryForTiles_next();

uint32_t querySrsId(const std::string& wkt) const;
std::string querySrsWkt(uint32_t srs_id) const;

// fills in the dimensions of an otherwise empty layout with
// the dimension information from the tile set
void setupLayout(const TileTableInfo& tileTableInfo, PointLayoutPtr layout) const;
Expand Down
3 changes: 3 additions & 0 deletions plugins/rialto/io/RialtoDbReader.cpp
Expand Up @@ -85,6 +85,9 @@ void RialtoDbReader::initialize()
m_tileTableInfo = std::unique_ptr<TileTableInfo>(new TileTableInfo());

m_db->readTileTable(m_tileTableName, *m_tileTableInfo);

SpatialReference srs(m_tileTableInfo->getWkt()); // TODO: or do I need to call setWKT()?
setSpatialReference(srs);
}
}

Expand Down
11 changes: 8 additions & 3 deletions plugins/rialto/io/RialtoDbWriter.cpp
Expand Up @@ -65,7 +65,11 @@ void RialtoDbWriter::ready(PointTableRef table)

m_assister.m_rialtoDb = m_rialtoDb;

m_assister.ready(table);
const SpatialReference& srs = getSpatialReference().empty() ?
table.spatialRef() : getSpatialReference();
setSpatialReference(srs);

m_assister.ready(table, getSpatialReference());
}


Expand Down Expand Up @@ -115,9 +119,10 @@ Options RialtoDbWriter::getDefaultOptions()

void DbWriterAssister::writeHeader(const std::string& tileTableName,
MetadataNode tileTableNode,
PointLayoutPtr layout, const std::string& datetime)
PointLayoutPtr layout, const std::string& datetime,
const SpatialReference& srs)
{
const TileTableInfo tileTableInfo(tileTableName, tileTableNode, layout, datetime);
const TileTableInfo tileTableInfo(tileTableName, tileTableNode, layout, datetime, srs);

m_rialtoDb->writeTileTable(tileTableInfo);
}
Expand Down
3 changes: 2 additions & 1 deletion plugins/rialto/io/RialtoDbWriter.hpp
Expand Up @@ -57,7 +57,8 @@ class DbWriterAssister: public WriterAssister
virtual void writeHeader(const std::string& tileTableName,
MetadataNode tileTableNode,
PointLayoutPtr layout,
const std::string& datetime);
const std::string& datetime,
const SpatialReference& srs);
virtual void writeTile(const std::string& tileTableName, PointView*,
uint32_t level, uint32_t col, uint32_t row, uint32_t mask);
};
Expand Down
9 changes: 5 additions & 4 deletions plugins/rialto/io/RialtoFileWriter.cpp
Expand Up @@ -68,7 +68,7 @@ void RialtoFileWriter::ready(PointTableRef table)

m_assister.m_directory = m_filename;

m_assister.ready(table);
m_assister.ready(table, getSpatialReference());
}


Expand Down Expand Up @@ -115,9 +115,10 @@ Options RialtoFileWriter::getDefaultOptions()
void FileWriterAssister::writeHeader(const std::string& tileTableName,
MetadataNode tileTableNode,
PointLayoutPtr layout,
const std::string& datetime)
{
const TileTableInfo tileTableInfo(tileTableName, tileTableNode, layout, datetime);
const std::string& datetime,
const SpatialReference& srs)
{
const TileTableInfo tileTableInfo(tileTableName, tileTableNode, layout, datetime, srs);

const std::string filename(m_directory + "/header.json");
FILE* fp = fopen(filename.c_str(), "wt");
Expand Down
3 changes: 2 additions & 1 deletion plugins/rialto/io/RialtoFileWriter.hpp
Expand Up @@ -55,7 +55,8 @@ class FileWriterAssister: public WriterAssister
virtual void writeHeader(const std::string& tileTableName,
MetadataNode tileTableNode,
PointLayoutPtr layout,
const std::string& datetime);
const std::string& datetime,
const SpatialReference& srs);
virtual void writeTile(const std::string& tileTableName, PointView*,
uint32_t level, uint32_t col, uint32_t row, uint32_t mask);
};
Expand Down
24 changes: 17 additions & 7 deletions plugins/rialto/io/RialtoSupport.cpp
Expand Up @@ -93,7 +93,8 @@ static void extractStatistics(MetadataNode& tileTableNode, const std::string& di
TileTableInfo::TileTableInfo(const std::string& tileTableName,
MetadataNode tileTableNode,
PointLayoutPtr layout,
const std::string& datetime)
const std::string& datetime,
const SpatialReference& srs)
{
m_name = tileTableName;

Expand All @@ -104,15 +105,22 @@ TileTableInfo::TileTableInfo(const std::string& tileTableName,
m_maxLevel = getMetadataU32(headerNode, "maxLevel");
m_numDimensions = layout->dims().size();

m_wkt = srs.getWKT(SpatialReference::eCompoundOK);

m_tmset_min_x = -180.0;
m_tmset_min_y = -90.0;
m_tmset_max_x = 180.0;
m_tmset_max_y = 90.0;

m_data_min_x = -189.0; // TODO
m_data_min_y = -89.0;
m_data_max_x = 179.0;
m_data_max_y = 89.0;
double statMinX, statMeanX, statMaxX;
double statMinY, statMeanY, statMaxY;
extractStatistics(tileTableNode, "X", statMinX, statMeanX, statMaxX);
extractStatistics(tileTableNode, "Y", statMinY, statMeanY, statMaxY);

m_data_min_x = statMinX; // TODO
m_data_min_y = statMinY;
m_data_max_x = statMaxX;
m_data_max_y = statMaxY;

DimensionInfo::importVector(tileTableNode, layout, m_dimensions);
}
Expand All @@ -122,6 +130,7 @@ void TileTableInfo::set(const std::string& datetime,
const std::string& name,
uint32_t maxLevel,
uint32_t numDimensions,
const std::string& wkt,
double data_min_x,
double data_min_y,
double data_max_x,
Expand All @@ -135,6 +144,7 @@ void TileTableInfo::set(const std::string& datetime,
m_name = name;
m_maxLevel = maxLevel;
m_numDimensions = numDimensions;
m_wkt = wkt;
m_data_min_x = data_min_x;
m_data_min_y = data_min_y;
m_data_max_x = data_max_x;
Expand Down Expand Up @@ -312,7 +322,7 @@ void WriterAssister::setTileTableName(const std::string& tileTableName)
}


void WriterAssister::ready(PointTableRef table)
void WriterAssister::ready(PointTableRef table, const SpatialReference& srs)
{
m_tileTableNode = table.metadata().findChild("filters.tiler");
if (!m_tileTableNode.valid()) {
Expand All @@ -325,7 +335,7 @@ void WriterAssister::ready(PointTableRef table)
// TODO: this produces "ss", not "ss.sss" as the gpkg spec implies is required
strftime(buf, sizeof(buf), "%FT%TZ", gmtime(&now));
std::string datetime(buf);
writeHeader(m_tileTableName, m_tileTableNode, table.layout(), datetime);
writeHeader(m_tileTableName, m_tileTableNode, table.layout(), datetime, srs);

makePointViewMap();
}
Expand Down
13 changes: 9 additions & 4 deletions plugins/rialto/io/RialtoSupport.hpp
Expand Up @@ -109,12 +109,14 @@ class TileTableInfo
TileTableInfo(const std::string& tileTableName,
MetadataNode tileTableNode,
PointLayoutPtr layout,
const std::string& datetime);
const std::string& datetime,
const SpatialReference& srs);

void set(const std::string& datetime,
const std::string& name,
uint32_t maxLevel,
uint32_t numDimensions,
const std::string& wkt,
double data_min_x,
double data_min_y,
double data_max_x,
Expand All @@ -130,7 +132,8 @@ class TileTableInfo
uint32_t getNumDimensions() const { return m_numDimensions; }
const std::vector<DimensionInfo>& getDimensions() const { return m_dimensions; };
std::vector<DimensionInfo>& getDimensionsRef() { return m_dimensions; };

const std::string getWkt() const { return m_wkt; }

double getDataMinX() const { return m_data_min_x; } // data extents
double getDataMinY() const { return m_data_min_y; }
double getDataMaxX() const { return m_data_max_x; }
Expand All @@ -147,6 +150,7 @@ class TileTableInfo
uint32_t m_maxLevel;
uint32_t m_numDimensions;
std::vector<DimensionInfo> m_dimensions;
std::string m_wkt; // the srs
double m_data_min_x; // data extents
double m_data_min_y;
double m_data_max_x;
Expand Down Expand Up @@ -195,14 +199,15 @@ class WriterAssister
void setTileTableName(const std::string&);

void write(const PointViewPtr viewPtr);
void ready(PointTableRef table);
void ready(PointTableRef table, const SpatialReference& srs);
void done();

protected:
virtual void writeHeader(const std::string& tileTableName,
MetadataNode tileTableNode,
PointLayoutPtr layout,
const std::string& datetime)=0;
const std::string& datetime,
const SpatialReference& srs)=0;
virtual void writeTile(const std::string& tileTableName, PointView*,
uint32_t level, uint32_t col, uint32_t row, uint32_t mask)=0;

Expand Down
10 changes: 10 additions & 0 deletions plugins/rialto/test/RialtoDbReaderTest.cpp
Expand Up @@ -73,6 +73,16 @@ TEST(RialtoDbReaderTest, test)
options.add("filename", filename);
//options.add("verbose", LogLevel::Debug);
reader.setOptions(options);

{
PointTable table;
reader.prepare(table);
const SpatialReference& srs = reader.getSpatialReference();
const std::string& wkt = srs.getWKT();
const SpatialReference srs4326("EPSG:4326");
const std::string wkt4326 = srs4326.getWKT();
EXPECT_EQ(wkt, wkt4326);
}

{
PointTable table;
Expand Down

0 comments on commit d03a634

Please sign in to comment.