1.added copyright notice to SConstruct/SConscript files

2.fixed include/libs in datasources
3.revived shapeindex utility (+ boost::program_options)
This commit is contained in:
Artem Pavlenko 2005-06-17 12:40:51 +00:00
parent 84bd684f87
commit 32c76d5a5f
25 changed files with 347 additions and 281 deletions

View file

@ -1,4 +1,21 @@
#mapnik SConctruct # This file is part of Mapnik (c++ mapping toolkit)
# Copyright (C) 2005 Artem Pavlenko
#
# Mapnik is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License
# as published by the Free Software Foundation; either version 2
# of the License, or any later version.
#
# This program 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 General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
#
# $Id$
import os import os
@ -23,7 +40,7 @@ cxx = 'g++'
env = Environment(CXX=cxx,ENV=os.environ, options=opts) env = Environment(CXX=cxx,ENV=os.environ, options=opts)
cxx_debug='-Wall -ftemplate-depth-100 -O0 -fno-inline -g -pthread' cxx_debug='-Wall -ftemplate-depth-100 -O0 -fno-inline -g -pthread -DDEBUG'
cxx_release='-Wall -ftemplate-depth-100 -O2 -finline-functions -Wno-inline -pthread -DNDEBUG' cxx_release='-Wall -ftemplate-depth-100 -O2 -finline-functions -Wno-inline -pthread -DNDEBUG'
release_env = env.Copy(CXXFLAGS = cxx_release) release_env = env.Copy(CXXFLAGS = cxx_release)
@ -72,6 +89,9 @@ SConscript('src/SConscript')
#python ext #python ext
SConscript('python/SConscript') SConscript('python/SConscript')
#shapeindex
SConscript('util/shapeindex/SConscript')
#datasources #datasources
for datasource in Split(env['DATASOURCES']): for datasource in Split(env['DATASOURCES']):
env.BuildDir('build/datasources/'+datasource,'src/datasources/'+datasource,duplicate=0) env.BuildDir('build/datasources/'+datasource,'src/datasources/'+datasource,duplicate=0)

View file

@ -1,4 +1,22 @@
# This file is part of Mapnik (c++ mapping toolkit)
# Copyright (C) 2005 Artem Pavlenko
# #
# Mapnik is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License
# as published by the Free Software Foundation; either version 2
# of the License, or any later version.
#
# This program 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 General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
#
# $Id$
import glob import glob
Import('env') Import('env')

View file

@ -1,4 +1,22 @@
## # This file is part of Mapnik (c++ mapping toolkit)
# Copyright (C) 2005 Artem Pavlenko
#
# Mapnik is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License
# as published by the Free Software Foundation; either version 2
# of the License, or any later version.
#
# This program 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 General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
#
# $Id$
import glob import glob
Import('env') Import('env')

View file

@ -1,12 +1,28 @@
#mapnik # This file is part of Mapnik (c++ mapping toolkit)
# Copyright (C) 2005 Artem Pavlenko
#
# Mapnik is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License
# as published by the Free Software Foundation; either version 2
# of the License, or any later version.
#
# This program 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 General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
#
# $Id$
Import ('env') Import ('env')
prefix = env['PREFIX'] prefix = env['PREFIX']
boost_root = env['BOOST_ROOT'] boost_root = env['BOOST_ROOT']
postgresql_root = env['POSTGRESQL_ROOT'] postgresql_root = env['POSTGRESQL_ROOT']
agg_root = env['AGG_ROOT']
agg_headers = agg_root + '/include'
postgresql_headers=postgresql_root+"/include" postgresql_headers=postgresql_root+"/include"
postgresql_libs=postgresql_root+"/lib" postgresql_libs=postgresql_root+"/lib"
@ -18,7 +34,7 @@ postgis_src = Split(
""" """
) )
headers = ['#include',boost_root,agg_headers,postgresql_headers] headers = ['#include',boost_root,postgresql_headers]
postgis_datasource = env.SharedLibrary('postgis',source=postgis_src,SHLIBPREFIX='',CPPPATH=headers,LIBS="pq",LIBPATH=postgresql_libs) postgis_datasource = env.SharedLibrary('postgis',source=postgis_src,SHLIBPREFIX='',CPPPATH=headers,LIBS="pq",LIBPATH=postgresql_libs)
env.Install(prefix + '/datasources',postgis_datasource) env.Install(prefix + '/datasources',postgis_datasource)
env.Alias("install",prefix + '/datasources') env.Alias("install",prefix + '/datasources')

View file

@ -23,7 +23,6 @@
#include "libpq-fe.h" #include "libpq-fe.h"
#include "mapnik.hpp"
#include "resultset.hpp" #include "resultset.hpp"
using namespace mapnik; using namespace mapnik;

View file

@ -22,7 +22,10 @@
#define POSTGIS_HPP #define POSTGIS_HPP
#include "mapnik.hpp" #include "datasource.hpp"
#include "envelope.hpp"
#include "feature.hpp"
#include "connection_manager.hpp" #include "connection_manager.hpp"
#include <boost/lexical_cast.hpp> #include <boost/lexical_cast.hpp>

View file

@ -20,6 +20,8 @@
#include "postgis.hpp" #include "postgis.hpp"
#include "global.hpp"
#include "wkb.hpp"
using boost::lexical_cast; using boost::lexical_cast;
using boost::bad_lexical_cast; using boost::bad_lexical_cast;
@ -53,7 +55,7 @@ Feature* PostgisFeatureset::next()
for (unsigned pos=0;pos<num_attrs_;++pos) for (unsigned pos=0;pos<num_attrs_;++pos)
{ {
const char* buf=rs_->getValue(start + pos); const char* buf=rs_->getValue(start + pos);
int field_size = rs_->getFieldLength(start + pos); //int field_size = rs_->getFieldLength(start + pos);
int oid = rs_->getTypeOID(start + pos); int oid = rs_->getTypeOID(start + pos);
if (oid==23) //int4 if (oid==23) //int4

View file

@ -1,11 +1,26 @@
#mapnik # This file is part of Mapnik (c++ mapping toolkit)
# Copyright (C) 2005 Artem Pavlenko
#
# Mapnik is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License
# as published by the Free Software Foundation; either version 2
# of the License, or any later version.
#
# This program 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 General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
#
# $Id$
Import ('env') Import ('env')
prefix = env['PREFIX'] prefix = env['PREFIX']
boost_root = env['BOOST_ROOT'] boost_root = env['BOOST_ROOT']
agg_root = env['AGG_ROOT']
agg_headers = agg_root + '/include'
shape_src = Split( shape_src = Split(
""" """
@ -19,8 +34,8 @@ shape_src = Split(
""" """
) )
headers = ['#include',boost_root,agg_headers] headers = ['#include',boost_root]
shape_datasource = env.SharedLibrary('shape',source=shape_src,SHLIBPREFIX='',CPPPATH=headers) shape_datasource = env.SharedLibrary('shape',source=shape_src,SHLIBPREFIX='',LIBS="",CPPPATH=headers)
env.Install(prefix+"/datasources",shape_datasource) env.Install(prefix+"/datasources",shape_datasource)
env.Alias("install",prefix + '/datasources')

View file

@ -17,6 +17,7 @@
*/ */
#include "dbffile.hpp" #include "dbffile.hpp"
#include "utils.hpp"
#include <string> #include <string>

View file

@ -24,7 +24,7 @@
#include <fstream> #include <fstream>
#include <cassert> #include <cassert>
#include "mapnik.hpp" #include "feature.hpp"
using namespace mapnik; using namespace mapnik;

View file

@ -19,6 +19,7 @@
#include "shape.hpp" #include "shape.hpp"
#include "shape_featureset.hpp" #include "shape_featureset.hpp"
#include "shape_index_featureset.hpp" #include "shape_index_featureset.hpp"
#include "geom_util.hpp"
#include <iostream> #include <iostream>
#include <stdexcept> #include <stdexcept>

View file

@ -19,7 +19,8 @@
#ifndef SHAPE_HH #ifndef SHAPE_HH
#define SHAPE_HH #define SHAPE_HH
#include "mapnik.hpp" #include "datasource.hpp"
#include "envelope.hpp"
#include "shape_io.hpp" #include "shape_io.hpp"
using namespace mapnik; using namespace mapnik;

View file

@ -20,6 +20,7 @@
#define SHAPE_FS_HH #define SHAPE_FS_HH
#include "shape.hpp" #include "shape.hpp"
#include "geom_util.hpp"
using namespace mapnik; using namespace mapnik;

View file

@ -21,9 +21,10 @@
#ifndef SHAPEFILE_HH #ifndef SHAPEFILE_HH
#define SHAPEFILE_HH #define SHAPEFILE_HH
#include "mapnik.hpp"
#include <fstream> #include <fstream>
#include "envelope.hpp"
using namespace mapnik; using namespace mapnik;
struct shape_record struct shape_record

View file

@ -17,6 +17,7 @@
*/ */
#include "shp_index.hpp" #include "shp_index.hpp"
#include "geom_util.hpp"
template <typename filterT> template <typename filterT>
void shp_index<filterT>::query(const filterT& filter,std::ifstream& file,std::set<int>& pos) void shp_index<filterT>::query(const filterT& filter,std::ifstream& file,std::set<int>& pos)

View file

@ -19,7 +19,8 @@
#ifndef SHP_INDEX_HH #ifndef SHP_INDEX_HH
#define SHP_INDEX_HH #define SHP_INDEX_HH
#include "mapnik.hpp" #include "envelope.hpp"
#include "query.hpp"
#include <fstream> #include <fstream>
#include <set> #include <set>

View file

@ -21,7 +21,6 @@
#ifndef GEOM_UTIL_HPP #ifndef GEOM_UTIL_HPP
#define GEOM_UTIL_HPP #define GEOM_UTIL_HPP
#include "geometry.hpp"
#include <cmath> #include <cmath>
namespace mapnik namespace mapnik
@ -81,7 +80,7 @@ namespace mapnik
} }
template <typename Iter> template <typename Iter>
inline bool point_inside_path(Iter start,Iter end,double x,double y) inline bool point_inside_path(double x,double y,Iter start,Iter end)
{ {
bool inside=false; bool inside=false;
double x0=start->x; double x0=start->x;
@ -145,57 +144,15 @@ namespace mapnik
} }
#undef TOL #undef TOL
template <typename Iter>
inline bool point_on_path(double x,double y,const geometry<vertex2d>& geom) inline bool point_on_path(double x,double y,Iter start,Iter end)
{ {
bool on_path=false; return false;
if (geom.num_points()>1)
{
geometry<vertex2d>::path_iterator<NO_SHIFT> itr=geom.begin<NO_SHIFT>();
geometry<vertex2d>::path_iterator<NO_SHIFT> end=geom.end<NO_SHIFT>();
double x0=itr->x;
double y0=itr->y;
while (++itr!=end)
{
if (itr->cmd == SEG_MOVETO)
{
x0=itr->x;
y0=itr->y;
continue;
}
double x1=itr->x;
double y1=itr->y;
on_path = point_on_segment(x,y,x0,y0,x1,y1);
if (on_path)
break;
x0=itr->x;
y0=itr->y;
}
}
return on_path;
} }
inline bool point_on_points (double x,double y,const geometry_type& geom) template <typename Iter>
inline bool point_on_points (double x,double y,Iter start,Iter end)
{ {
geometry<vertex2d>::path_iterator<NO_SHIFT> itr=geom.begin<NO_SHIFT>();
geometry<vertex2d>::path_iterator<NO_SHIFT> end=geom.end<NO_SHIFT>();
while (itr!=end)
{
double dx = x - itr->x;
double dy = y - itr->y;
double d = sqrt(dx*dx+dy*dy);
if (d < 0.02)
{
std::cout<<"d="<<d<<" x="<<x<<" y="<<y<<" itr->x="<<itr->x<<" itr->y="<<itr->y<<std::endl;
return true;
}
++itr;
}
return false; return false;
} }
@ -221,7 +178,6 @@ namespace mapnik
return extent.contains(pt_); return extent.contains(pt_);
} }
}; };
} }
#endif //GEOM_UTIL_HPP #endif //GEOM_UTIL_HPP

View file

@ -25,6 +25,7 @@
#include "vertex_transform.hpp" #include "vertex_transform.hpp"
#include "ctrans.hpp" #include "ctrans.hpp"
#include "ptr.hpp" #include "ptr.hpp"
#include "geom_util.hpp"
namespace mapnik namespace mapnik
{ {
@ -183,6 +184,7 @@ namespace mapnik
template <typename T, template <typename> class Container=vertex_vector> template <typename T, template <typename> class Container=vertex_vector>
class point : public geometry<T,Container> class point : public geometry<T,Container>
{ {
typedef geometry<T,Container> geometry_base;
typedef typename geometry<T,Container>::value_type value_type; typedef typename geometry<T,Container>::value_type value_type;
using geometry<T,Container>::cont_; using geometry<T,Container>::cont_;
public: public:
@ -196,7 +198,10 @@ namespace mapnik
} }
bool hit_test(value_type x,value_type y) const bool hit_test(value_type x,value_type y) const
{ {
return point_on_points(x,y,*this); typedef typename geometry_base::template path_iterator<NO_SHIFT> path_iterator;
path_iterator start = geometry_base::template begin<NO_SHIFT>();
path_iterator end = geometry_base::template end<NO_SHIFT>();
return point_on_points(x,y,start,end);
} }
}; };
@ -221,13 +226,14 @@ namespace mapnik
typedef typename geometry_base::template path_iterator<NO_SHIFT> path_iterator; typedef typename geometry_base::template path_iterator<NO_SHIFT> path_iterator;
path_iterator start = geometry_base::template begin<NO_SHIFT>(); path_iterator start = geometry_base::template begin<NO_SHIFT>();
path_iterator end = geometry_base::template end<NO_SHIFT>(); path_iterator end = geometry_base::template end<NO_SHIFT>();
return point_inside_path(start,end,x,y); return point_inside_path(x,y, start,end);
} }
}; };
template <typename T, template <typename> class Container=vertex_vector> template <typename T, template <typename> class Container=vertex_vector>
class line_string : public geometry<T,Container> class line_string : public geometry<T,Container>
{ {
typedef geometry<T,Container> geometry_base;
typedef typename geometry<T,Container>::value_type value_type; typedef typename geometry<T,Container>::value_type value_type;
public: public:
line_string(int srid) line_string(int srid)
@ -241,7 +247,10 @@ namespace mapnik
bool hit_test(value_type x,value_type y) const bool hit_test(value_type x,value_type y) const
{ {
return point_on_path(x,y,*this); typedef typename geometry_base::template path_iterator<NO_SHIFT> path_iterator;
path_iterator start = geometry_base::template begin<NO_SHIFT>();
path_iterator end = geometry_base::template end<NO_SHIFT>();
return point_on_path(x,y,start,end);
} }
}; };

View file

@ -1,3 +1,22 @@
# This file is part of Mapnik (c++ mapping toolkit)
# Copyright (C) 2005 Artem Pavlenko
#
# Mapnik is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License
# as published by the Free Software Foundation; either version 2
# of the License, or any later version.
#
# This program 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 General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
#
# $Id$
import os import os
import SCons.Errors import SCons.Errors
import SCons.Defaults import SCons.Defaults

View file

@ -1,3 +1,22 @@
# This file is part of Mapnik (c++ mapping toolkit)
# Copyright (C) 2005 Artem Pavlenko
#
# Mapnik is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License
# as published by the Free Software Foundation; either version 2
# of the License, or any later version.
#
# This program 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 General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
#
# $Id$
#edit this file #edit this file
PREFIX = '/opt/mapnik' PREFIX = '/opt/mapnik'

View file

@ -1,4 +1,22 @@
## # This file is part of Mapnik (c++ mapping toolkit)
# Copyright (C) 2005 Artem Pavlenko
#
# Mapnik is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License
# as published by the Free Software Foundation; either version 2
# of the License, or any later version.
#
# This program 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 General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
#
# $Id$
import glob import glob
Import ('env') Import ('env')

View file

@ -1,23 +0,0 @@
/* config.hh. Generated by configure. */
/* config.hh.in. Generated from configure.ac by autoheader. */
/* Name of package */
#define PACKAGE "shapeindex"
/* Define to the address where bug reports for this package should be sent. */
#define PACKAGE_BUGREPORT "bugs@shapeindex"
/* Define to the full name of this package. */
#define PACKAGE_NAME "shapeindex"
/* Define to the full name and version of this package. */
#define PACKAGE_STRING "shapeindex 0.1"
/* Define to the one symbol short name of this package. */
#define PACKAGE_TARNAME "shapeindex"
/* Define to the version of this package. */
#define PACKAGE_VERSION "0.1"
/* Version number of package */
#define VERSION "0.1"

View file

@ -1,21 +0,0 @@
/* This file is part of Mapnik (c++ mapping toolkit)
* Copyright (C) 2005 Artem Pavlenko
*
* Mapnik is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or any later version.
*
* This program 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 General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
//$Id: quadtree.cc 17 2005-03-08 23:58:43Z pavlenko $
#include "quadtree.hh"

View file

@ -21,7 +21,7 @@
#ifndef QUADTREE_HH #ifndef QUADTREE_HH
#define QUADTREE_HH #define QUADTREE_HH
#include "mapnik.hh" #include "envelope.hpp"
#include <vector> #include <vector>
#include <fstream> #include <fstream>

View file

@ -18,192 +18,183 @@
//$Id: shapeindex.cc 27 2005-03-30 21:45:40Z pavlenko $ //$Id: shapeindex.cc 27 2005-03-30 21:45:40Z pavlenko $
#include <iostream> #include "shape.hpp"
#include <argp.h> #include "quadtree.hpp"
#include "config.hh"
#include "mapnik.hh"
#include "shape.hh"
#include "quadtree.hh"
#include <boost/tokenizer.hpp>
#include <boost/algorithm/string.hpp>
#include <boost/program_options.hpp>
#include <iostream>
#include <vector>
#include <string>
const int MAXDEPTH = 64; const int MAXDEPTH = 64;
const int DEFAULT_DEPTH = 16; const int DEFAULT_DEPTH = 8;
const double MINRATIO=0.5; const double MINRATIO=0.5;
const double MAXRATIO=0.8; const double MAXRATIO=0.8;
const double DEFAULT_RATIO=0.55; const double DEFAULT_RATIO=0.55;
const char* argp_program_version = "shapeindex utility version 0.1"; int main (int argc,char** argv)
const char* argp_program_bug_address="bugs@shapeindex"; {
using namespace mapnik;
static char doc[] = "shapeindex utility to create spatial index"; namespace po = boost::program_options;
using std::string;
static char args_doc[]="shape_file"; using std::vector;
static struct argp_option options[] = { bool verbose=false;
{"verbose",'v',0, 0,"Produce verbose output"}, unsigned int depth=DEFAULT_DEPTH;
{"quite", 'q',0, 0,"Don't produce any output"}, double ratio=DEFAULT_RATIO;
{"silent", 's',0, OPTION_ALIAS}, vector<string> shape_files;
{0,0,0,0, "shape index options:" },
{"depth", 'd',"VALUE",0,"maximum depth of the tree (default=16)"}, try
{"ratio", 'r',"VALUE",0,"split ratio between 0.5-0.9 (default 0.55)"},
{ 0 }
};
struct arguments {
char *args[2];
int silent;
int verbose;
int depth;
double ratio;
};
static error_t
parse_opt ( int key,char *arg, struct argp_state *state) {
struct arguments* arguments = (struct arguments*)state->input;
switch (key)
{ {
case 'q': po::options_description desc("shapeindex utility");
case 's': desc.add_options()
arguments->silent = 1; ("help,h", "produce usage message")
break; ("version,V","print version string")
case 'v': ("verbose,v","verbose output")
arguments->verbose = 1; ("depth,d", po::value<unsigned int>(), "max tree depth\n(default 8)")
break; ("ratio,r",po::value<double>(),"split ratio (default 0.55)")
case 'd': ("shape_files",po::value<vector<string> >(),"shape files to index file1 file2 ...fileN")
arguments->depth = arg ? atoi(arg) : DEFAULT_DEPTH; ;
break;
case 'r': po::positional_options_description p;
arguments->ratio = arg ? atof(arg) : DEFAULT_RATIO; p.add("shape_files",-1);
break; po::variables_map vm;
case ARGP_KEY_NO_ARGS: po::store(po::command_line_parser(argc, argv).options(desc).positional(p).run(), vm);
argp_usage (state); po::notify(vm);
case ARGP_KEY_ARG:
if (state->arg_num>=1) if (vm.count("version"))
//too many arguments. {
argp_usage (state); cout<<"version 0.2.0a" <<endl;
arguments->args[state->arg_num] = arg; return 1;
break; }
case ARGP_KEY_END:
if (state->arg_num < 1) if (vm.count("help"))
//not enough arguments {
argp_usage (state); cout << desc << "\n";
break; return 1;
default: }
return ARGP_ERR_UNKNOWN; if (vm.count("depth"))
{
depth = vm["depth"].as<unsigned int>();
}
if (vm.count("ratio"))
{
ratio = vm["ratio"].as<double>();
}
if (vm.count("shape_files"))
{
shape_files=vm["shape_files"].as< vector<string> >();
}
} }
return 0; catch (...)
} {
cerr << "Exception of unknown type!"<<endl;
static struct argp argp = { options, parse_opt, args_doc, doc };
using namespace mapnik;
int main (int argc,char** argv) {
struct arguments arguments;
arguments.silent = 0;
arguments.verbose = 0;
arguments.silent = 0;
arguments.depth = DEFAULT_DEPTH;
arguments.ratio = DEFAULT_RATIO;
argp_parse(&argp, argc, argv, 0, 0, &arguments);
std::cout<<"processing "<<arguments.args[0]<<std::endl;
std::cout<<"max tree depth:"<<arguments.depth<<std::endl;
std::cout<<"split ratio:"<<arguments.ratio<<std::endl;
shape_file shp;
std::string shapename(arguments.args[0]);
if (!shp.open(shapename+".shp")) {
std::cerr<<"error : cannot open "<< (shapename+".shp") <<"\n";
return -1; return -1;
} }
int file_code=shp.read_xdr_integer(); std::cout<<"max tree depth:"<<depth<<std::endl;
assert(file_code==9994); std::cout<<"split ratio:"<<ratio<<std::endl;
shp.skip(5*4);
int file_length=shp.read_xdr_integer(); vector<string>::const_iterator itr=shape_files.begin();
int version=shp.read_ndr_integer(); if (itr==shape_files.end())
int shape_type=shp.read_ndr_integer(); {
Envelope<double> extent; std::cout << "no shape files to index"<<std::endl;
shp.read_envelope(extent); return 0;
}
while (itr != shape_files.end())
{
std::cout<<"processing "<<*itr << std::endl;
shape_file shp;
std::string shapename(*itr++);
if (!shp.open(shapename+".shp")) {
std::cerr<<"error : cannot open "<< (shapename+".shp") <<"\n";
continue;
}
if (!arguments.silent) { int file_code=shp.read_xdr_integer();
//std::cout<<"length="<<file_length<<std::endl; assert(file_code==9994);
//std::cout<<"version="<<version<<std::endl; shp.skip(5*4);
int file_length=shp.read_xdr_integer();
int version=shp.read_ndr_integer();
int shape_type=shp.read_ndr_integer();
Envelope<double> extent;
shp.read_envelope(extent);
std::cout<<"length="<<file_length<<std::endl;
std::cout<<"version="<<version<<std::endl;
std::cout<<"type="<<shape_type<<std::endl; std::cout<<"type="<<shape_type<<std::endl;
std::cout<<"extent:"<<extent<<std::endl; std::cout<<"extent:"<<extent<<std::endl;
}
int pos=50;
int pos=50; shp.seek(pos*2);
shp.seek(pos*2); quadtree<int> tree(extent,depth,ratio);
quadtree<int> tree(extent,arguments.depth,arguments.ratio); int count=0;
int count=0; while (true) {
while (true) {
int offset=shp.pos();
int offset=shp.pos(); int record_number=shp.read_xdr_integer();
int record_number=shp.read_xdr_integer(); int content_length=shp.read_xdr_integer();
int content_length=shp.read_xdr_integer();
shp.skip(4); shp.skip(4);
Envelope<double> item_ext; Envelope<double> item_ext;
if (shape_type==shape_io::shape_point) if (shape_type==shape_io::shape_point)
{ {
double x=shp.read_double(); double x=shp.read_double();
double y=shp.read_double(); double y=shp.read_double();
shp.skip(2*content_length-2*8-4); shp.skip(2*content_length-2*8-4);
item_ext=Envelope<double>(x,y,x,y); item_ext=Envelope<double>(x,y,x,y);
} }
else if (shape_type==shape_io::shape_pointz) else if (shape_type==shape_io::shape_pointz)
{ {
double x=shp.read_double(); double x=shp.read_double();
double y=shp.read_double(); double y=shp.read_double();
double z=shp.read_double(); shp.read_double();
shp.skip(2*content_length-2*8-4); shp.skip(2*content_length-2*8-4);
item_ext=Envelope<double>(x,y,x,y); item_ext=Envelope<double>(x,y,x,y);
} }
else else
{ {
shp.read_envelope(item_ext); shp.read_envelope(item_ext);
shp.skip(2*content_length-4*8-4); shp.skip(2*content_length-4*8-4);
} }
tree.insert(offset,item_ext); tree.insert(offset,item_ext);
if (arguments.verbose) { if (verbose) {
std::cout<<"record number "<<record_number<<" box="<<item_ext<<std::endl; std::cout<<"record number "<<record_number<<" box="<<item_ext<<std::endl;
} }
pos+=4+content_length; pos+=4+content_length;
++count; ++count;
if (pos>=file_length) { if (pos>=file_length) {
break; break;
} }
} }
shp.close(); shp.close();
std::cout<<" number shapes="<<count<<std::endl; std::cout<<" number shapes="<<count<<std::endl;
std::fstream file((shapename+".index").c_str(), std::fstream file((shapename+".index").c_str(),
std::ios::in | std::ios::out | std::ios::trunc | std::ios::binary); std::ios::in | std::ios::out | std::ios::trunc | std::ios::binary);
if (!file) { if (!file) {
std::cerr << "cannot open index file for writing file \"" std::cerr << "cannot open index file for writing file \""
<<(shapename+".index")<<"\""<<std::endl; <<(shapename+".index")<<"\""<<std::endl;
} else { } else {
tree.trim(); tree.trim();
std::cout<<" number nodes="<<tree.count()<<std::endl;
std::cout<<" number nodes="<<tree.count()<<std::endl; tree.write(file);
file.close();
}
tree.write(file);
file.close();
} }
std::cout<<"done!"<<std::endl; std::cout<<"done!"<<std::endl;
return 0; return 0;