Tile::Tile(TileID _id, const MapProjection& _projection, const DataSource* _source) : m_id(_id), m_projection(&_projection), m_sourceId(_source ? _source->id() : 0), m_sourceGeneration(_source ? _source->generation() : 0) { BoundingBox bounds(_projection.TileBounds(_id)); m_scale = bounds.width(); m_inverseScale = 1.0/m_scale; updateTileOrigin(_id.wrap); // Init model matrix to size of tile m_modelMatrix = glm::scale(glm::mat4(1.0), glm::vec3(m_scale)); }
MapTile::MapTile(TileID _id, const MapProjection& _projection) : m_id(_id), m_projection(&_projection) { glm::dvec4 bounds = _projection.TileBounds(_id); // [x: xmin, y: ymin, z: xmax, w: ymax] m_scale = 0.5 * glm::abs(bounds.x - bounds.z); m_inverseScale = 1.0/m_scale; // negative y coordinate: to change from y down to y up (tile system has y down and gl context we use has y up). m_tileOrigin = glm::dvec2(0.5*(bounds.x + bounds.z), -0.5*(bounds.y + bounds.w)); m_modelMatrix = glm::mat4(1.0); // Scale model matrix to size of tile m_modelMatrix = glm::scale(m_modelMatrix, glm::vec3(m_scale)); }
std::shared_ptr<TileData> TopoJsonSource::parse(const TileTask& _task, const MapProjection& _projection) const { auto& task = static_cast<const DownloadTileTask&>(_task); std::shared_ptr<TileData> tileData = std::make_shared<TileData>(); // Parse data into a JSON document const char* error; size_t offset; auto document = JsonParseBytes(task.rawTileData->data(), task.rawTileData->size(), &error, &offset); if (error) { LOGE("Json parsing failed on tile [%s]: %s (%u)", task.tileId().toString().c_str(), error, offset); return tileData; } // Transform JSON data into a TileData using TopoJson functions BoundingBox tileBounds(_projection.TileBounds(task.tileId())); glm::dvec2 tileOrigin = {tileBounds.min.x, tileBounds.max.y*-1.0}; double tileInverseScale = 1.0 / tileBounds.width(); const auto projFn = [&](glm::dvec2 _lonLat){ glm::dvec2 tmp = _projection.LonLatToMeters(_lonLat); return Point { (tmp.x - tileOrigin.x) * tileInverseScale, (tmp.y - tileOrigin.y) * tileInverseScale, 0 }; }; // Parse topology and transform auto topology = TopoJson::getTopology(document, projFn); // Parse each TopoJson object as a data layer auto objectsIt = document.FindMember("objects"); if (objectsIt == document.MemberEnd()) { return tileData; } auto& objects = objectsIt->value; for (auto layer = objects.MemberBegin(); layer != objects.MemberEnd(); ++layer) { tileData->layers.push_back(TopoJson::getLayer(layer, topology, m_id)); } // Discard JSON object and return TileData return tileData; }
Tile::Tile(TileID _id, const MapProjection& _projection) : m_id(_id), m_projection(&_projection), m_visible(false), m_priority(0) { BoundingBox bounds(_projection.TileBounds(_id)); m_scale = 0.5 * bounds.width(); m_inverseScale = 1.0/m_scale; m_tileOrigin = bounds.center(); // negative y coordinate: to change from y down to y up (tile system has y down and gl context we use has y up). m_tileOrigin.y *= -1.0; // Init model matrix to size of tile m_modelMatrix = glm::scale(glm::mat4(1.0), glm::vec3(m_scale)); }