+ added ogrindex utility (needs some scons wizard to add it to main SConstruct)
This commit is contained in:
parent
539f1bcf9b
commit
2d5a1810da
3 changed files with 276 additions and 0 deletions
28
utils/ogrindex/Makefile.am
Normal file
28
utils/ogrindex/Makefile.am
Normal file
|
@ -0,0 +1,28 @@
|
|||
if HAVE_BOOST_PROGRAM_OPTIONS
|
||||
|
||||
bin_PROGRAMS = \
|
||||
ogrindex
|
||||
|
||||
ogrindex_SOURCES = \
|
||||
quadtree.hpp\
|
||||
ogrindex.cpp
|
||||
|
||||
ogrindex_LDFLAGS = \
|
||||
$(BOOST_PROGRAM_OPTIONS_LIB) \
|
||||
../../src/libmapnik.la \
|
||||
${AGG_LIBS}
|
||||
|
||||
ogrindex_DEPENDENCIES = \
|
||||
../../src/libmapnik.la
|
||||
|
||||
ogrindex_CXXFLAGS = \
|
||||
${PROFILING_CFLAGS} \
|
||||
${TRACING_CFLAGS} \
|
||||
-I../../include \
|
||||
-I../../plugins/input/ogr \
|
||||
${AGG_CFLAGS}
|
||||
|
||||
endif
|
||||
|
||||
## File created by the gnome-build tools
|
||||
|
50
utils/ogrindex/SConscript
Normal file
50
utils/ogrindex/SConscript
Normal file
|
@ -0,0 +1,50 @@
|
|||
#
|
||||
# This file is part of Mapnik (c++ mapping toolkit)
|
||||
#
|
||||
# Copyright (C) 2006 Artem Pavlenko, Jean-Francois Doyon
|
||||
#
|
||||
# Mapnik is free software; you can redistribute it and/or
|
||||
# modify it under the terms of the GNU Lesser General Public
|
||||
# License as published by the Free Software Foundation; either
|
||||
# version 2.1 of the License, or (at your option) any later version.
|
||||
#
|
||||
# This library is distributed in the hope that it will be useful,
|
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
# Lesser General Public License for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU Lesser General Public
|
||||
# License along with this library; if not, write to the Free Software
|
||||
# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
#
|
||||
# $Id$
|
||||
|
||||
import glob
|
||||
|
||||
Import ('env')
|
||||
|
||||
prefix = env['PREFIX']
|
||||
install_prefix = env['DESTDIR'] + '/' + prefix
|
||||
|
||||
source = Split(
|
||||
"""
|
||||
ogrindex.cpp
|
||||
"""
|
||||
)
|
||||
|
||||
headers = ['#plugins/input/ogr'] + env['CPPPATH']
|
||||
|
||||
boost_program_options = 'boost_program_options%s' % env['BOOST_APPEND']
|
||||
boost_iostreams = 'boost_iostreams%s' % env['BOOST_APPEND']
|
||||
boost_filesystem = 'boost_filesystem%s' % env['BOOST_APPEND']
|
||||
libraries = [boost_program_options,boost_iostreams,boost_filesystem,env['PLUGINS']['ogr']['lib'],'mapnik']
|
||||
|
||||
if env['PLATFORM'] == 'Darwin' and env['BOOST_SYSTEM_REQUIRED']:
|
||||
boost_system = 'boost_system%s' % env['BOOST_APPEND']
|
||||
libraries.append(boost_system)
|
||||
|
||||
|
||||
ogrindex = env.Program('ogrindex', source, CPPPATH=headers, LIBS=libraries)
|
||||
|
||||
env.Install(install_prefix + '/bin', ogrindex)
|
||||
env.Alias('install', install_prefix + '/bin')
|
198
utils/ogrindex/ogrindex.cpp
Normal file
198
utils/ogrindex/ogrindex.cpp
Normal file
|
@ -0,0 +1,198 @@
|
|||
/*****************************************************************************
|
||||
*
|
||||
* This file is part of Mapnik (c++ mapping toolkit)
|
||||
*
|
||||
* Copyright (C) 2006 Artem Pavlenko
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public
|
||||
* License as published by the Free Software Foundation; either
|
||||
* version 2.1 of the License, or (at your option) any later version.
|
||||
*
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public
|
||||
* License along with this library; if not, write to the Free Software
|
||||
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
*
|
||||
*****************************************************************************/
|
||||
//$Id: ogrindex.cc 27 2005-03-30 21:45:40Z pavlenko $
|
||||
|
||||
|
||||
#include <iostream>
|
||||
#include <vector>
|
||||
#include <string>
|
||||
|
||||
#include <boost/tokenizer.hpp>
|
||||
#include <boost/algorithm/string.hpp>
|
||||
#include <boost/filesystem/operations.hpp>
|
||||
#include <boost/program_options.hpp>
|
||||
|
||||
#include <mapnik/datasource.hpp>
|
||||
#include <mapnik/envelope.hpp>
|
||||
#include <mapnik/feature.hpp>
|
||||
#include <mapnik/feature_layer_desc.hpp>
|
||||
|
||||
#include "../shapeindex/quadtree.hpp"
|
||||
|
||||
#include "ogr_converter.cpp"
|
||||
#include "ogr_datasource.cpp"
|
||||
#include "ogr_featureset.cpp"
|
||||
#include "ogr_index_featureset.cpp"
|
||||
|
||||
const int MAXDEPTH = 64;
|
||||
const int DEFAULT_DEPTH = 8;
|
||||
const double MINRATIO=0.5;
|
||||
const double MAXRATIO=0.8;
|
||||
const double DEFAULT_RATIO=0.55;
|
||||
|
||||
int main (int argc,char** argv)
|
||||
{
|
||||
using namespace mapnik;
|
||||
namespace po = boost::program_options;
|
||||
using std::string;
|
||||
using std::vector;
|
||||
|
||||
bool verbose=false;
|
||||
unsigned int depth=DEFAULT_DEPTH;
|
||||
double ratio=DEFAULT_RATIO;
|
||||
vector<string> ogr_files;
|
||||
|
||||
try
|
||||
{
|
||||
po::options_description desc("ogrindex utility");
|
||||
desc.add_options()
|
||||
("help,h", "produce usage message")
|
||||
("version,V", "print version string")
|
||||
("verbose,v", "verbose output")
|
||||
("depth,d", po::value<unsigned int>(), "max tree depth\n(default 8)")
|
||||
("ratio,r", po::value<double>(), "split ratio (default 0.55)")
|
||||
("ogr_files", po::value<vector<string> >(), "ogr supported files to index: file1 file2 ...fileN")
|
||||
;
|
||||
|
||||
po::positional_options_description p;
|
||||
p.add("ogr_files",-1);
|
||||
po::variables_map vm;
|
||||
po::store(po::command_line_parser(argc, argv).options(desc).positional(p).run(), vm);
|
||||
po::notify(vm);
|
||||
|
||||
if (vm.count("version"))
|
||||
{
|
||||
std::clog<<"version 0.3.0" <<std::endl;
|
||||
return 1;
|
||||
}
|
||||
if (vm.count("help"))
|
||||
{
|
||||
std::clog << desc << std::endl;
|
||||
return 1;
|
||||
}
|
||||
if (vm.count("depth"))
|
||||
{
|
||||
depth = vm["depth"].as<unsigned int>();
|
||||
}
|
||||
if (vm.count("ratio"))
|
||||
{
|
||||
ratio = vm["ratio"].as<double>();
|
||||
}
|
||||
if (vm.count("ogr_files"))
|
||||
{
|
||||
ogr_files=vm["ogr_files"].as< vector<string> >();
|
||||
}
|
||||
}
|
||||
catch (...)
|
||||
{
|
||||
std::clog << "Exception of unknown type!" << std::endl;
|
||||
return -1;
|
||||
}
|
||||
|
||||
std::clog << "max tree depth:" << depth << std::endl;
|
||||
std::clog << "split ratio:" << ratio << std::endl;
|
||||
|
||||
vector<string>::const_iterator itr = ogr_files.begin();
|
||||
if (itr == ogr_files.end())
|
||||
{
|
||||
std::clog << "no ogr files to index" << std::endl;
|
||||
return 0;
|
||||
}
|
||||
while (itr != ogr_files.end())
|
||||
{
|
||||
std::clog << "processing " << *itr << std::endl;
|
||||
|
||||
std::string ogrname (*itr++);
|
||||
|
||||
if (! boost::filesystem::exists (ogrname))
|
||||
{
|
||||
std::clog << "error : file " << ogrname << " doesn't exists" << std::endl;
|
||||
continue;
|
||||
}
|
||||
|
||||
int breakpoint = ogrname.find_last_of (".");
|
||||
if (breakpoint == string::npos) breakpoint = ogrname.length();
|
||||
std::string ogrlayername (ogrname.substr(0, breakpoint));
|
||||
|
||||
if (boost::filesystem::exists (ogrlayername + ".index"))
|
||||
{
|
||||
std::clog << "error : " << ogrlayername << ".index file already exists for " << ogrname << std::endl;
|
||||
continue;
|
||||
}
|
||||
|
||||
mapnik::parameters params;
|
||||
params["type"] = "ogr";
|
||||
params["file"] = ogrname;
|
||||
params["layer"] = ogrlayername;
|
||||
|
||||
ogr_datasource ogr (params);
|
||||
|
||||
Envelope<double> extent = ogr.envelope();
|
||||
quadtree<int> tree (extent, depth, ratio);
|
||||
int count=0;
|
||||
|
||||
std::clog << "file:" << ogrname << std::endl;
|
||||
std::clog << "layer:" << ogrlayername << std::endl;
|
||||
std::clog << "extent:" << extent << std::endl;
|
||||
|
||||
mapnik::query q (extent, 1.0);
|
||||
mapnik::featureset_ptr itr = ogr.features (q);
|
||||
|
||||
while (true)
|
||||
{
|
||||
mapnik::feature_ptr fp = itr->next();
|
||||
if (!fp)
|
||||
{
|
||||
break;
|
||||
}
|
||||
|
||||
Envelope<double> item_ext = fp->envelope();
|
||||
|
||||
tree.insert (count, item_ext);
|
||||
if (verbose) {
|
||||
std::clog << "record number " << (count + 1) << " box=" << item_ext << std::endl;
|
||||
}
|
||||
|
||||
++count;
|
||||
}
|
||||
|
||||
std::clog << " number shapes=" << count << std::endl;
|
||||
|
||||
std::fstream file((ogrlayername+".index").c_str(),
|
||||
std::ios::in | std::ios::out | std::ios::trunc | std::ios::binary);
|
||||
if (!file) {
|
||||
std::clog << "cannot open index file for writing file \""
|
||||
<< (ogrlayername+".index") << "\"" << std::endl;
|
||||
} else {
|
||||
tree.trim();
|
||||
std::clog<<" number nodes="<<tree.count()<<std::endl;
|
||||
file.exceptions(std::ios::failbit | std::ios::badbit);
|
||||
tree.write(file);
|
||||
file.flush();
|
||||
file.close();
|
||||
}
|
||||
}
|
||||
|
||||
std::clog << "done!" << std::endl;
|
||||
return 0;
|
||||
}
|
||||
|
Loading…
Add table
Reference in a new issue