[bookmarks] Saving to KML.

This commit is contained in:
vng 2012-04-02 18:16:49 +03:00 committed by Alex Zolotarev
parent 234c6db9d3
commit 6a87b12238
3 changed files with 102 additions and 17 deletions

View file

@ -28,6 +28,8 @@
#include "../std/target_os.hpp"
#include "../std/vector.hpp"
#include <boost/algorithm/string.hpp>
void Framework::AddMap(string const & file)
{
@ -290,13 +292,25 @@ namespace
}
}
void CharData(string const & value)
class IsSpace
{
switch (m_level)
public:
bool operator() (char c) const
{
case 4: m_name = value; break;
case 5: SetOrigin(value); break;
return ::isspace(c);
}
};
void CharData(string value)
{
boost::trim(value);
if (!value.empty())
switch (m_level)
{
case 4: m_name = value; break;
case 5: SetOrigin(value); break;
}
}
};
}
@ -308,6 +322,49 @@ void Framework::LoadFromKML(ReaderPtr<Reader> const & reader)
ParseXML(src, parser, true);
}
namespace
{
char const * kmlHeader =
"<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"
"<kml xmlns=\"http://earth.google.com/kml/2.2\">\n"
"<Document>\n"
" <name>MapsWithMe</name>\n";
char const * kmlFooter =
"</Document>\n"
"</kml>\n";
string PointToString(m2::PointD const & org)
{
double const lon = MercatorBounds::XToLon(org.x);
double const lat = MercatorBounds::YToLat(org.y);
ostringstream ss;
ss.precision(8);
ss << lon << "," << lat;
return ss.str();
}
}
void Framework::SaveToKML(std::ostream & s)
{
s << kmlHeader;
for (list<Bookmark>::const_iterator i = m_bookmarks.begin(); i != m_bookmarks.end(); ++i)
{
s << " <Placemark>\n"
<< " <name>" << i->GetName() << "</name>\n"
<< " <Point>\n"
<< " <coordinates>" << PointToString(i->GetOrg()) << "</coordinates>\n"
<< " </Point>\n"
<< " </Placemark>\n";
}
s << kmlFooter;
}
void Framework::GetLocalMaps(vector<string> & outMaps)
{
Platform & pl = GetPlatform();

View file

@ -130,6 +130,7 @@ public:
void ClearBookmarks();
void LoadFromKML(ReaderPtr<Reader> const & reader);
void SaveToKML(std::ostream & s);
storage::Storage & Storage() { return m_storage; }

View file

@ -2,6 +2,8 @@
#include "../../map/framework.hpp"
#include "../../std/fstream.hpp"
namespace
{
@ -51,24 +53,49 @@ char const * kmlString =
"</Placemark>"
"</Document>"
"</kml>";
void CheckBookmarks(Framework const & fm)
{
TEST_EQUAL(fm.BookmarksCount(), 3, ());
Bookmark bm;
fm.GetBookmark(0, bm);
TEST_EQUAL(bm.GetName(), "Nebraska", ());
fm.GetBookmark(1, bm);
TEST_EQUAL(bm.GetName(), "Monongahela National Forest", ());
fm.GetBookmark(2, bm);
m2::PointD const org = bm.GetOrg();
TEST_ALMOST_EQUAL(MercatorBounds::XToLon(org.x), 27.566765, ());
TEST_ALMOST_EQUAL(MercatorBounds::YToLat(org.y), 53.900047, ());
}
}
UNIT_TEST(Bookmarks_ImportKML)
{
Framework fm;
fm.LoadFromKML(new MemReader(kmlString, strlen(kmlString)));
TEST_EQUAL(fm.BookmarksCount(), 3, ());
Bookmark bm;
fm.GetBookmark(0, bm);
TEST_EQUAL(bm.GetName(), "Nebraska", ());
fm.GetBookmark(1, bm);
TEST_EQUAL(bm.GetName(), "Monongahela National Forest", ());
fm.GetBookmark(2, bm);
m2::PointD const org = bm.GetOrg();
TEST_ALMOST_EQUAL(MercatorBounds::XToLon(org.x), 27.566765, ());
TEST_ALMOST_EQUAL(MercatorBounds::YToLat(org.y), 53.900047, ());
CheckBookmarks(fm);
}
UNIT_TEST(Bookmarks_ExportKML)
{
Framework fm;
fm.LoadFromKML(new MemReader(kmlString, strlen(kmlString)));
CheckBookmarks(fm);
{
ofstream of("Bookmarks.kml");
fm.SaveToKML(of);
}
fm.ClearBookmarks();
TEST_EQUAL(fm.BookmarksCount(), 0, ());
fm.LoadFromKML(new FileReader("Bookmarks.kml"));
CheckBookmarks(fm);
}