- fix indentation and trailing spaces (generally coding style) in ogr plugin partially related to #911
This commit is contained in:
parent
8877c681c4
commit
10d35add23
9 changed files with 561 additions and 511 deletions
|
@ -2,7 +2,7 @@
|
|||
*
|
||||
* This file is part of Mapnik (c++ mapping toolkit)
|
||||
*
|
||||
* Copyright (C) 2007 Artem Pavlenko
|
||||
* Copyright (C) 2011 Artem Pavlenko
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public
|
||||
|
@ -36,235 +36,246 @@ using mapnik::feature_ptr;
|
|||
using mapnik::geometry_utils;
|
||||
using mapnik::geometry_type;
|
||||
|
||||
void ogr_converter::convert_geometry (OGRGeometry* geom, feature_ptr feature, bool multiple_geometries)
|
||||
void ogr_converter::convert_geometry(OGRGeometry* geom, feature_ptr feature, bool multiple_geometries)
|
||||
{
|
||||
switch (wkbFlatten (geom->getGeometryType()))
|
||||
{
|
||||
case wkbPoint:
|
||||
convert_point (static_cast<OGRPoint*>(geom), feature);
|
||||
break;
|
||||
case wkbLineString:
|
||||
convert_linestring (static_cast<OGRLineString*>(geom), feature);
|
||||
break;
|
||||
case wkbPolygon:
|
||||
convert_polygon (static_cast<OGRPolygon*>(geom), feature);
|
||||
break;
|
||||
case wkbMultiPoint:
|
||||
if (multiple_geometries)
|
||||
convert_multipoint_2 (static_cast<OGRMultiPoint*>(geom), feature);
|
||||
else
|
||||
// Todo - using convert_multipoint_2 until we have proper multipoint handling in convert_multipoint
|
||||
// http://trac.mapnik.org/ticket/458
|
||||
//convert_multipoint (static_cast<OGRMultiPoint*>(geom), feature);
|
||||
convert_multipoint_2 (static_cast<OGRMultiPoint*>(geom), feature);
|
||||
break;
|
||||
case wkbMultiLineString:
|
||||
if (multiple_geometries)
|
||||
convert_multilinestring_2 (static_cast<OGRMultiLineString*>(geom), feature);
|
||||
else
|
||||
convert_multilinestring (static_cast<OGRMultiLineString*>(geom), feature);
|
||||
|
||||
break;
|
||||
case wkbMultiPolygon:
|
||||
if (multiple_geometries)
|
||||
convert_multipolygon_2 (static_cast<OGRMultiPolygon*>(geom), feature);
|
||||
else
|
||||
convert_multipolygon (static_cast<OGRMultiPolygon*>(geom), feature);
|
||||
break;
|
||||
case wkbGeometryCollection:
|
||||
convert_collection (static_cast<OGRGeometryCollection*>(geom), feature, multiple_geometries);
|
||||
break;
|
||||
case wkbLinearRing:
|
||||
convert_linestring (static_cast<OGRLinearRing*>(geom), feature);
|
||||
break;
|
||||
case wkbNone:
|
||||
case wkbUnknown:
|
||||
default:
|
||||
switch (wkbFlatten(geom->getGeometryType()))
|
||||
{
|
||||
case wkbPoint:
|
||||
convert_point(static_cast<OGRPoint*>(geom), feature);
|
||||
break;
|
||||
case wkbLineString:
|
||||
convert_linestring(static_cast<OGRLineString*>(geom), feature);
|
||||
break;
|
||||
case wkbPolygon:
|
||||
convert_polygon(static_cast<OGRPolygon*>(geom), feature);
|
||||
break;
|
||||
case wkbMultiPoint:
|
||||
if (multiple_geometries)
|
||||
{
|
||||
convert_multipoint_2(static_cast<OGRMultiPoint*>(geom), feature);
|
||||
}
|
||||
else
|
||||
{
|
||||
// Todo - using convert_multipoint_2 until we have proper multipoint handling in convert_multipoint
|
||||
// http://trac.mapnik.org/ticket/458
|
||||
//convert_multipoint(static_cast<OGRMultiPoint*>(geom), feature);
|
||||
convert_multipoint_2(static_cast<OGRMultiPoint*>(geom), feature);
|
||||
}
|
||||
break;
|
||||
case wkbMultiLineString:
|
||||
if (multiple_geometries)
|
||||
{
|
||||
convert_multilinestring_2(static_cast<OGRMultiLineString*>(geom), feature);
|
||||
}
|
||||
else
|
||||
{
|
||||
convert_multilinestring(static_cast<OGRMultiLineString*>(geom), feature);
|
||||
}
|
||||
break;
|
||||
case wkbMultiPolygon:
|
||||
if (multiple_geometries)
|
||||
{
|
||||
convert_multipolygon_2(static_cast<OGRMultiPolygon*>(geom), feature);
|
||||
}
|
||||
else
|
||||
{
|
||||
convert_multipolygon(static_cast<OGRMultiPolygon*>(geom), feature);
|
||||
}
|
||||
break;
|
||||
case wkbGeometryCollection:
|
||||
convert_collection(static_cast<OGRGeometryCollection*>(geom), feature, multiple_geometries);
|
||||
break;
|
||||
case wkbLinearRing:
|
||||
convert_linestring(static_cast<OGRLinearRing*>(geom), feature);
|
||||
break;
|
||||
case wkbNone:
|
||||
case wkbUnknown:
|
||||
default:
|
||||
#ifdef MAPNIK_DEBUG
|
||||
std::clog << "OGR Plugin: unknown <ogr> geometry_type=" << wkbFlatten (geom->getGeometryType()) << std::endl;
|
||||
std::clog << "OGR Plugin: unknown <ogr> geometry_type="
|
||||
<< wkbFlatten(geom->getGeometryType()) << std::endl;
|
||||
#endif
|
||||
break;
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
void ogr_converter::convert_point (OGRPoint* geom, feature_ptr feature)
|
||||
void ogr_converter::convert_point(OGRPoint* geom, feature_ptr feature)
|
||||
{
|
||||
geometry_type * point = new geometry_type(mapnik::Point);
|
||||
point->move_to (geom->getX(), geom->getY());
|
||||
feature->add_geometry (point);
|
||||
point->move_to(geom->getX(), geom->getY());
|
||||
feature->add_geometry(point);
|
||||
}
|
||||
|
||||
void ogr_converter::convert_linestring (OGRLineString* geom, feature_ptr feature)
|
||||
void ogr_converter::convert_linestring(OGRLineString* geom, feature_ptr feature)
|
||||
{
|
||||
int num_points = geom->getNumPoints ();
|
||||
geometry_type * line = new geometry_type(mapnik::LineString);
|
||||
line->set_capacity (num_points);
|
||||
line->move_to (geom->getX (0), geom->getY (0));
|
||||
for (int i=1;i<num_points;++i)
|
||||
int num_points = geom->getNumPoints();
|
||||
geometry_type* line = new geometry_type(mapnik::LineString);
|
||||
line->set_capacity(num_points);
|
||||
line->move_to(geom->getX(0), geom->getY(0));
|
||||
for (int i = 1; i < num_points; ++i)
|
||||
{
|
||||
line->line_to (geom->getX (i), geom->getY (i));
|
||||
line->line_to (geom->getX(i), geom->getY(i));
|
||||
}
|
||||
feature->add_geometry (line);
|
||||
feature->add_geometry(line);
|
||||
}
|
||||
|
||||
void ogr_converter::convert_polygon (OGRPolygon* geom, feature_ptr feature)
|
||||
void ogr_converter::convert_polygon(OGRPolygon* geom, feature_ptr feature)
|
||||
{
|
||||
OGRLinearRing* exterior = geom->getExteriorRing ();
|
||||
int num_points = exterior->getNumPoints ();
|
||||
int num_interior = geom->getNumInteriorRings ();
|
||||
OGRLinearRing* exterior = geom->getExteriorRing();
|
||||
int num_points = exterior->getNumPoints();
|
||||
int num_interior = geom->getNumInteriorRings();
|
||||
int capacity = 0;
|
||||
for (int r=0;r<num_interior;r++)
|
||||
for (int r = 0; r < num_interior; r++)
|
||||
{
|
||||
OGRLinearRing* interior = geom->getInteriorRing (r);
|
||||
capacity += interior->getNumPoints ();
|
||||
OGRLinearRing* interior = geom->getInteriorRing(r);
|
||||
capacity += interior->getNumPoints();
|
||||
}
|
||||
|
||||
geometry_type * poly = new geometry_type(mapnik::Polygon);
|
||||
poly->set_capacity (num_points + capacity);
|
||||
poly->move_to (exterior->getX (0), exterior->getY (0));
|
||||
for (int i=1;i<num_points;++i)
|
||||
geometry_type* poly = new geometry_type(mapnik::Polygon);
|
||||
poly->set_capacity(num_points + capacity);
|
||||
poly->move_to(exterior->getX(0), exterior->getY(0));
|
||||
for (int i = 1; i < num_points; ++i)
|
||||
{
|
||||
poly->line_to (exterior->getX (i), exterior->getY (i));
|
||||
poly->line_to(exterior->getX(i), exterior->getY(i));
|
||||
}
|
||||
for (int r=0;r<num_interior;r++)
|
||||
for (int r = 0; r < num_interior; r++)
|
||||
{
|
||||
OGRLinearRing* interior = geom->getInteriorRing (r);
|
||||
num_points = interior->getNumPoints ();
|
||||
poly->move_to(interior->getX (0), interior->getY (0));
|
||||
for (int i=1;i<num_points;++i)
|
||||
OGRLinearRing* interior = geom->getInteriorRing(r);
|
||||
num_points = interior->getNumPoints();
|
||||
poly->move_to(interior->getX(0), interior->getY(0));
|
||||
for (int i = 1; i < num_points; ++i)
|
||||
{
|
||||
poly->line_to(interior->getX (i), interior->getY (i));
|
||||
poly->line_to(interior->getX(i), interior->getY(i));
|
||||
}
|
||||
}
|
||||
feature->add_geometry (poly);
|
||||
feature->add_geometry(poly);
|
||||
}
|
||||
|
||||
void ogr_converter::convert_multipoint (OGRMultiPoint* geom, feature_ptr feature)
|
||||
void ogr_converter::convert_multipoint(OGRMultiPoint* geom, feature_ptr feature)
|
||||
{
|
||||
int num_geometries = geom->getNumGeometries ();
|
||||
geometry_type * point = new geometry_type(mapnik::Point);
|
||||
int num_geometries = geom->getNumGeometries();
|
||||
geometry_type* point = new geometry_type(mapnik::Point);
|
||||
|
||||
for (int i=0;i<num_geometries;i++)
|
||||
for (int i = 0; i < num_geometries; i++)
|
||||
{
|
||||
OGRPoint* ogrpoint = static_cast<OGRPoint*>(geom->getGeometryRef (i));
|
||||
point->move_to (ogrpoint->getX(), ogrpoint->getY());
|
||||
OGRPoint* ogrpoint = static_cast<OGRPoint*>(geom->getGeometryRef(i));
|
||||
point->move_to(ogrpoint->getX(), ogrpoint->getY());
|
||||
//Todo - need to accept multiple points per mapnik::Point
|
||||
}
|
||||
|
||||
// Todo - this only gets last point
|
||||
feature->add_geometry (point);
|
||||
feature->add_geometry(point);
|
||||
}
|
||||
|
||||
void ogr_converter::convert_multipoint_2 (OGRMultiPoint* geom, feature_ptr feature)
|
||||
void ogr_converter::convert_multipoint_2(OGRMultiPoint* geom, feature_ptr feature)
|
||||
{
|
||||
int num_geometries = geom->getNumGeometries ();
|
||||
for (int i=0;i<num_geometries;i++)
|
||||
int num_geometries = geom->getNumGeometries();
|
||||
for (int i = 0; i < num_geometries; i++)
|
||||
{
|
||||
convert_point (static_cast<OGRPoint*>(geom->getGeometryRef (i)), feature);
|
||||
convert_point(static_cast<OGRPoint*>(geom->getGeometryRef(i)), feature);
|
||||
}
|
||||
}
|
||||
|
||||
void ogr_converter::convert_multilinestring (OGRMultiLineString* geom, feature_ptr feature)
|
||||
void ogr_converter::convert_multilinestring(OGRMultiLineString* geom, feature_ptr feature)
|
||||
{
|
||||
int num_geometries = geom->getNumGeometries ();
|
||||
int num_geometries = geom->getNumGeometries();
|
||||
|
||||
int num_points = 0;
|
||||
for (int i=0;i<num_geometries;i++)
|
||||
for (int i = 0; i < num_geometries; i++)
|
||||
{
|
||||
OGRLineString* ls = static_cast<OGRLineString*>(geom->getGeometryRef (i));
|
||||
num_points += ls->getNumPoints ();
|
||||
OGRLineString* ls = static_cast<OGRLineString*>(geom->getGeometryRef(i));
|
||||
num_points += ls->getNumPoints();
|
||||
}
|
||||
|
||||
geometry_type * line = new geometry_type(mapnik::LineString);
|
||||
line->set_capacity (num_points);
|
||||
geometry_type* line = new geometry_type(mapnik::LineString);
|
||||
line->set_capacity(num_points);
|
||||
|
||||
for (int i=0;i<num_geometries;i++)
|
||||
for (int i = 0; i < num_geometries; i++)
|
||||
{
|
||||
OGRLineString* ls = static_cast<OGRLineString*>(geom->getGeometryRef (i));
|
||||
num_points = ls->getNumPoints ();
|
||||
line->move_to (ls->getX (0), ls->getY (0));
|
||||
for (int i=1;i<num_points;++i)
|
||||
OGRLineString* ls = static_cast<OGRLineString*>(geom->getGeometryRef(i));
|
||||
num_points = ls->getNumPoints();
|
||||
line->move_to(ls->getX(0), ls->getY(0));
|
||||
for (int i = 1; i < num_points; ++i)
|
||||
{
|
||||
line->line_to (ls->getX (i), ls->getY (i));
|
||||
line->line_to(ls->getX(i), ls->getY(i));
|
||||
}
|
||||
}
|
||||
|
||||
feature->add_geometry (line);
|
||||
feature->add_geometry(line);
|
||||
}
|
||||
|
||||
void ogr_converter::convert_multilinestring_2 (OGRMultiLineString* geom, feature_ptr feature)
|
||||
void ogr_converter::convert_multilinestring_2(OGRMultiLineString* geom, feature_ptr feature)
|
||||
{
|
||||
int num_geometries = geom->getNumGeometries ();
|
||||
for (int i=0;i<num_geometries;i++)
|
||||
int num_geometries = geom->getNumGeometries();
|
||||
for (int i = 0; i < num_geometries; i++)
|
||||
{
|
||||
convert_linestring (static_cast<OGRLineString*>(geom->getGeometryRef (i)), feature);
|
||||
convert_linestring(static_cast<OGRLineString*>(geom->getGeometryRef(i)), feature);
|
||||
}
|
||||
}
|
||||
|
||||
void ogr_converter::convert_multipolygon (OGRMultiPolygon* geom, feature_ptr feature)
|
||||
void ogr_converter::convert_multipolygon(OGRMultiPolygon* geom, feature_ptr feature)
|
||||
{
|
||||
int num_geometries = geom->getNumGeometries ();
|
||||
int num_geometries = geom->getNumGeometries();
|
||||
|
||||
int capacity = 0;
|
||||
for (int i=0;i<num_geometries;i++)
|
||||
for (int i = 0; i < num_geometries; i++)
|
||||
{
|
||||
OGRPolygon* p = static_cast<OGRPolygon*>(geom->getGeometryRef (i));
|
||||
OGRLinearRing* exterior = p->getExteriorRing ();
|
||||
capacity += exterior->getNumPoints ();
|
||||
for (int r=0;r<p->getNumInteriorRings ();r++)
|
||||
OGRPolygon* p = static_cast<OGRPolygon*>(geom->getGeometryRef(i));
|
||||
OGRLinearRing* exterior = p->getExteriorRing();
|
||||
capacity += exterior->getNumPoints();
|
||||
for (int r = 0; r < p->getNumInteriorRings(); r++)
|
||||
{
|
||||
OGRLinearRing* interior = p->getInteriorRing (r);
|
||||
capacity += interior->getNumPoints ();
|
||||
OGRLinearRing* interior = p->getInteriorRing(r);
|
||||
capacity += interior->getNumPoints();
|
||||
}
|
||||
}
|
||||
|
||||
geometry_type * poly = new geometry_type(mapnik::Polygon);
|
||||
poly->set_capacity (capacity);
|
||||
geometry_type* poly = new geometry_type(mapnik::Polygon);
|
||||
poly->set_capacity(capacity);
|
||||
|
||||
for (int i=0;i<num_geometries;i++)
|
||||
for (int i = 0; i < num_geometries; i++)
|
||||
{
|
||||
OGRPolygon* p = static_cast<OGRPolygon*>(geom->getGeometryRef (i));
|
||||
OGRLinearRing* exterior = p->getExteriorRing ();
|
||||
int num_points = exterior->getNumPoints ();
|
||||
int num_interior = p->getNumInteriorRings ();
|
||||
poly->move_to (exterior->getX (0), exterior->getY (0));
|
||||
for (int i=1;i<num_points;++i)
|
||||
OGRPolygon* p = static_cast<OGRPolygon*>(geom->getGeometryRef(i));
|
||||
OGRLinearRing* exterior = p->getExteriorRing();
|
||||
int num_points = exterior->getNumPoints();
|
||||
int num_interior = p->getNumInteriorRings();
|
||||
poly->move_to(exterior->getX(0), exterior->getY(0));
|
||||
for (int i = 1; i < num_points; ++i)
|
||||
{
|
||||
poly->line_to (exterior->getX (i), exterior->getY (i));
|
||||
poly->line_to(exterior->getX(i), exterior->getY(i));
|
||||
}
|
||||
for (int r=0;r<num_interior;r++)
|
||||
for (int r = 0; r < num_interior; r++)
|
||||
{
|
||||
OGRLinearRing* interior = p->getInteriorRing (r);
|
||||
num_points = interior->getNumPoints ();
|
||||
poly->move_to(interior->getX (0), interior->getY (0));
|
||||
for (int i=1;i<num_points;++i)
|
||||
OGRLinearRing* interior = p->getInteriorRing(r);
|
||||
num_points = interior->getNumPoints();
|
||||
poly->move_to(interior->getX(0), interior->getY(0));
|
||||
for (int i = 1; i < num_points; ++i)
|
||||
{
|
||||
poly->line_to(interior->getX (i), interior->getY (i));
|
||||
poly->line_to(interior->getX(i), interior->getY(i));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
feature->add_geometry (poly);
|
||||
feature->add_geometry(poly);
|
||||
}
|
||||
|
||||
void ogr_converter::convert_multipolygon_2 (OGRMultiPolygon* geom, feature_ptr feature)
|
||||
void ogr_converter::convert_multipolygon_2(OGRMultiPolygon* geom, feature_ptr feature)
|
||||
{
|
||||
int num_geometries = geom->getNumGeometries ();
|
||||
for (int i=0;i<num_geometries;i++)
|
||||
int num_geometries = geom->getNumGeometries();
|
||||
for (int i = 0; i < num_geometries; i++)
|
||||
{
|
||||
convert_polygon (static_cast<OGRPolygon*>(geom->getGeometryRef (i)), feature);
|
||||
convert_polygon(static_cast<OGRPolygon*>(geom->getGeometryRef(i)), feature);
|
||||
}
|
||||
}
|
||||
|
||||
void ogr_converter::convert_collection (OGRGeometryCollection* geom, feature_ptr feature, bool multiple_geometries)
|
||||
void ogr_converter::convert_collection(OGRGeometryCollection* geom, feature_ptr feature, bool multiple_geometries)
|
||||
{
|
||||
int num_geometries = geom->getNumGeometries ();
|
||||
for (int i=0;i<num_geometries;i++)
|
||||
int num_geometries = geom->getNumGeometries();
|
||||
for (int i = 0; i < num_geometries; i++)
|
||||
{
|
||||
OGRGeometry* g = geom->getGeometryRef (i);
|
||||
OGRGeometry* g = geom->getGeometryRef(i);
|
||||
if (g != NULL)
|
||||
{
|
||||
convert_geometry (g, feature, multiple_geometries);
|
||||
convert_geometry(g, feature, multiple_geometries);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -2,7 +2,7 @@
|
|||
*
|
||||
* This file is part of Mapnik (c++ mapping toolkit)
|
||||
*
|
||||
* Copyright (C) 2007 Artem Pavlenko
|
||||
* Copyright (C) 2011 Artem Pavlenko
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public
|
||||
|
@ -32,19 +32,19 @@
|
|||
|
||||
class ogr_converter
|
||||
{
|
||||
public:
|
||||
public:
|
||||
|
||||
static void convert_geometry (OGRGeometry* geom, mapnik::feature_ptr feature, bool multiple_geometries);
|
||||
static void convert_collection (OGRGeometryCollection* geom, mapnik::feature_ptr feature, bool multiple_geometries);
|
||||
static void convert_point (OGRPoint* geom, mapnik::feature_ptr feature);
|
||||
static void convert_linestring (OGRLineString* geom, mapnik::feature_ptr feature);
|
||||
static void convert_polygon (OGRPolygon* geom, mapnik::feature_ptr feature);
|
||||
static void convert_multipoint (OGRMultiPoint* geom, mapnik::feature_ptr feature);
|
||||
static void convert_multipoint_2 (OGRMultiPoint* geom, mapnik::feature_ptr feature);
|
||||
static void convert_multilinestring (OGRMultiLineString* geom, mapnik::feature_ptr feature);
|
||||
static void convert_multilinestring_2 (OGRMultiLineString* geom, mapnik::feature_ptr feature);
|
||||
static void convert_multipolygon (OGRMultiPolygon* geom, mapnik::feature_ptr feature);
|
||||
static void convert_multipolygon_2 (OGRMultiPolygon* geom, mapnik::feature_ptr feature);
|
||||
static void convert_geometry (OGRGeometry* geom, mapnik::feature_ptr feature, bool multiple_geometries);
|
||||
static void convert_collection (OGRGeometryCollection* geom, mapnik::feature_ptr feature, bool multiple_geometries);
|
||||
static void convert_point (OGRPoint* geom, mapnik::feature_ptr feature);
|
||||
static void convert_linestring (OGRLineString* geom, mapnik::feature_ptr feature);
|
||||
static void convert_polygon (OGRPolygon* geom, mapnik::feature_ptr feature);
|
||||
static void convert_multipoint (OGRMultiPoint* geom, mapnik::feature_ptr feature);
|
||||
static void convert_multipoint_2 (OGRMultiPoint* geom, mapnik::feature_ptr feature);
|
||||
static void convert_multilinestring (OGRMultiLineString* geom, mapnik::feature_ptr feature);
|
||||
static void convert_multilinestring_2 (OGRMultiLineString* geom, mapnik::feature_ptr feature);
|
||||
static void convert_multipolygon (OGRMultiPolygon* geom, mapnik::feature_ptr feature);
|
||||
static void convert_multipolygon_2 (OGRMultiPolygon* geom, mapnik::feature_ptr feature);
|
||||
};
|
||||
|
||||
#endif // OGR_FEATURESET_HPP
|
||||
#endif // OGR_CONVERTER_HPP
|
||||
|
|
|
@ -2,7 +2,7 @@
|
|||
*
|
||||
* This file is part of Mapnik (c++ mapping toolkit)
|
||||
*
|
||||
* Copyright (C) 2007 Artem Pavlenko
|
||||
* Copyright (C) 2011 Artem Pavlenko
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public
|
||||
|
@ -53,35 +53,42 @@ using mapnik::filter_at_point;
|
|||
|
||||
|
||||
ogr_datasource::ogr_datasource(parameters const& params, bool bind)
|
||||
: datasource(params),
|
||||
extent_(),
|
||||
type_(datasource::Vector),
|
||||
desc_(*params.get<std::string>("type"), *params.get<std::string>("encoding","utf-8")),
|
||||
indexed_(false)
|
||||
: datasource(params),
|
||||
extent_(),
|
||||
type_(datasource::Vector),
|
||||
desc_(*params.get<std::string>("type"), *params.get<std::string>("encoding","utf-8")),
|
||||
indexed_(false)
|
||||
{
|
||||
boost::optional<std::string> file = params.get<std::string>("file");
|
||||
boost::optional<std::string> string = params.get<std::string>("string");
|
||||
if (!file && !string) throw datasource_exception("missing <file> or <string> parameter");
|
||||
boost::optional<std::string> file = params.get<std::string>("file");
|
||||
boost::optional<std::string> string = params.get<std::string>("string");
|
||||
if (! file && ! string)
|
||||
{
|
||||
throw datasource_exception("missing <file> or <string> parameter");
|
||||
}
|
||||
|
||||
multiple_geometries_ = *params.get<mapnik::boolean>("multiple_geometries",false);
|
||||
multiple_geometries_ = *params.get<mapnik::boolean>("multiple_geometries",false);
|
||||
|
||||
if (string)
|
||||
{
|
||||
if (string)
|
||||
{
|
||||
dataset_name_ = *string;
|
||||
}
|
||||
else
|
||||
{
|
||||
boost::optional<std::string> base = params.get<std::string>("base");
|
||||
if (base)
|
||||
dataset_name_ = *base + "/" + *file;
|
||||
else
|
||||
dataset_name_ = *file;
|
||||
}
|
||||
|
||||
if (bind)
|
||||
{
|
||||
this->bind();
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
boost::optional<std::string> base = params.get<std::string>("base");
|
||||
if (base)
|
||||
{
|
||||
dataset_name_ = *base + "/" + *file;
|
||||
}
|
||||
else
|
||||
{
|
||||
dataset_name_ = *file;
|
||||
}
|
||||
}
|
||||
|
||||
if (bind)
|
||||
{
|
||||
this->bind();
|
||||
}
|
||||
}
|
||||
|
||||
ogr_datasource::~ogr_datasource()
|
||||
|
@ -94,236 +101,265 @@ ogr_datasource::~ogr_datasource()
|
|||
|
||||
void ogr_datasource::bind() const
|
||||
{
|
||||
if (is_bound_) return;
|
||||
if (is_bound_) return;
|
||||
|
||||
// initialize ogr formats
|
||||
OGRRegisterAll();
|
||||
|
||||
// open ogr driver
|
||||
dataset_ = OGRSFDriverRegistrar::Open ((dataset_name_).c_str(), FALSE);
|
||||
if (!dataset_)
|
||||
{
|
||||
std::string err = CPLGetLastErrorMsg();
|
||||
if( err.size() == 0 ) {
|
||||
throw datasource_exception("OGR Plugin: connection failed: " + dataset_name_ + " was not found or is not a supported format");
|
||||
} else {
|
||||
throw datasource_exception("OGR Plugin: " + err);
|
||||
}
|
||||
}
|
||||
// initialize ogr formats
|
||||
OGRRegisterAll();
|
||||
|
||||
// initialize layer
|
||||
|
||||
boost::optional<std::string> layer_by_name = params_.get<std::string>("layer");
|
||||
boost::optional<unsigned> layer_by_index = params_.get<unsigned>("layer_by_index");
|
||||
|
||||
if (layer_by_name && layer_by_index)
|
||||
throw datasource_exception("OGR Plugin: you can only select an ogr layer by name ('layer' parameter) or by number ('layer_by_index' parameter), do not supply both parameters" );
|
||||
// open ogr driver
|
||||
dataset_ = OGRSFDriverRegistrar::Open((dataset_name_).c_str(), FALSE);
|
||||
if (! dataset_)
|
||||
{
|
||||
const std::string err = CPLGetLastErrorMsg();
|
||||
if (err.size() == 0)
|
||||
{
|
||||
throw datasource_exception("OGR Plugin: connection failed: " + dataset_name_ + " was not found or is not a supported format");
|
||||
}
|
||||
else
|
||||
{
|
||||
throw datasource_exception("OGR Plugin: " + err);
|
||||
}
|
||||
}
|
||||
|
||||
if (layer_by_name)
|
||||
{
|
||||
layerName_ = *layer_by_name;
|
||||
layer_ = dataset_->GetLayerByName (layerName_.c_str());
|
||||
}
|
||||
else if (layer_by_index)
|
||||
{
|
||||
unsigned num_layers = dataset_->GetLayerCount();
|
||||
if (*layer_by_index >= num_layers)
|
||||
{
|
||||
std::ostringstream s;
|
||||
s << "OGR Plugin: only ";
|
||||
s << num_layers;
|
||||
s << " layer(s) exist, cannot find layer by index '" << *layer_by_index << "'";
|
||||
|
||||
throw datasource_exception(s.str());
|
||||
}
|
||||
OGRLayer *ogr_layer = dataset_->GetLayer(*layer_by_index);
|
||||
if (ogr_layer)
|
||||
{
|
||||
OGRFeatureDefn* def = ogr_layer->GetLayerDefn();
|
||||
if (def != 0) {
|
||||
layerName_ = def->GetName();
|
||||
layer_ = ogr_layer;
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
std::ostringstream s;
|
||||
s << "OGR Plugin: missing <layer> or <layer_by_index> parameter, available layers are: ";
|
||||
unsigned num_layers = dataset_->GetLayerCount();
|
||||
bool found = false;
|
||||
for (unsigned i = 0; i < num_layers; ++i )
|
||||
{
|
||||
OGRLayer *ogr_layer = dataset_->GetLayer(i);
|
||||
OGRFeatureDefn* def = ogr_layer->GetLayerDefn();
|
||||
if (def != 0) {
|
||||
found = true;
|
||||
s << " '" << def->GetName() << "' ";
|
||||
}
|
||||
}
|
||||
if (!found) {
|
||||
s << "None (no layers were found in dataset)";
|
||||
}
|
||||
throw datasource_exception(s.str());
|
||||
}
|
||||
// initialize layer
|
||||
|
||||
if (!layer_)
|
||||
{
|
||||
std::string s("OGR Plugin: ");
|
||||
if (layer_by_name) s += "cannot find layer by name '" + *layer_by_name;
|
||||
else if (layer_by_index) s += "cannot find layer by index number '" + *layer_by_index;
|
||||
s += "' in dataset '" + dataset_name_ + "'";
|
||||
throw datasource_exception(s);
|
||||
}
|
||||
|
||||
// initialize envelope
|
||||
OGREnvelope envelope;
|
||||
layer_->GetExtent (&envelope);
|
||||
extent_.init (envelope.MinX, envelope.MinY, envelope.MaxX, envelope.MaxY);
|
||||
boost::optional<std::string> layer_by_name = params_.get<std::string>("layer");
|
||||
boost::optional<unsigned> layer_by_index = params_.get<unsigned>("layer_by_index");
|
||||
|
||||
// scan for index file
|
||||
// TODO - layer names don't match dataset name, so this will break for
|
||||
// any layer types of ogr than shapefiles, etc
|
||||
// fix here and in ogrindex
|
||||
size_t breakpoint = dataset_name_.find_last_of (".");
|
||||
if (breakpoint == std::string::npos) breakpoint = dataset_name_.length();
|
||||
index_name_ = dataset_name_.substr(0, breakpoint) + ".ogrindex";
|
||||
std::ifstream index_file (index_name_.c_str(), std::ios::in | std::ios::binary);
|
||||
if (index_file)
|
||||
{
|
||||
indexed_=true;
|
||||
index_file.close();
|
||||
}
|
||||
// enable this warning once the ogrindex tool is a bit more stable/mature
|
||||
//else
|
||||
/*{
|
||||
std::clog << "### Notice: no ogrindex file found for " + dataset_name_ + ", use the 'ogrindex' program to build an index for faster rendering\n";
|
||||
}*/
|
||||
if (layer_by_name && layer_by_index)
|
||||
{
|
||||
throw datasource_exception("OGR Plugin: you can only select an ogr layer by name ('layer' parameter) or by number ('layer_by_index' parameter), do not supply both parameters" );
|
||||
}
|
||||
|
||||
// deal with attributes descriptions
|
||||
OGRFeatureDefn* def = layer_->GetLayerDefn ();
|
||||
if (def != 0)
|
||||
{
|
||||
int fld_count = def->GetFieldCount ();
|
||||
for (int i = 0; i < fld_count; i++)
|
||||
{
|
||||
OGRFieldDefn* fld = def->GetFieldDefn (i);
|
||||
if (layer_by_name)
|
||||
{
|
||||
layerName_ = *layer_by_name;
|
||||
layer_ = dataset_->GetLayerByName(layerName_.c_str());
|
||||
}
|
||||
else if (layer_by_index)
|
||||
{
|
||||
const unsigned num_layers = dataset_->GetLayerCount();
|
||||
if (*layer_by_index >= num_layers)
|
||||
{
|
||||
std::ostringstream s;
|
||||
s << "OGR Plugin: only ";
|
||||
s << num_layers;
|
||||
s << " layer(s) exist, cannot find layer by index '" << *layer_by_index << "'";
|
||||
|
||||
std::string fld_name = fld->GetNameRef ();
|
||||
OGRFieldType type_oid = fld->GetType ();
|
||||
throw datasource_exception(s.str());
|
||||
}
|
||||
|
||||
switch (type_oid)
|
||||
{
|
||||
case OFTInteger:
|
||||
desc_.add_descriptor(attribute_descriptor(fld_name,mapnik::Integer));
|
||||
break;
|
||||
OGRLayer* ogr_layer = dataset_->GetLayer(*layer_by_index);
|
||||
if (ogr_layer)
|
||||
{
|
||||
OGRFeatureDefn* def = ogr_layer->GetLayerDefn();
|
||||
if (def != 0)
|
||||
{
|
||||
layerName_ = def->GetName();
|
||||
layer_ = ogr_layer;
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
std::ostringstream s;
|
||||
s << "OGR Plugin: missing <layer> or <layer_by_index> parameter, available layers are: ";
|
||||
|
||||
case OFTReal:
|
||||
desc_.add_descriptor(attribute_descriptor(fld_name,mapnik::Double));
|
||||
break;
|
||||
|
||||
case OFTString:
|
||||
case OFTWideString: // deprecated
|
||||
desc_.add_descriptor(attribute_descriptor(fld_name,mapnik::String));
|
||||
break;
|
||||
|
||||
case OFTBinary:
|
||||
desc_.add_descriptor(attribute_descriptor(fld_name,mapnik::Object));
|
||||
break;
|
||||
unsigned num_layers = dataset_->GetLayerCount();
|
||||
bool layer_found = false;
|
||||
for (unsigned i = 0; i < num_layers; ++i )
|
||||
{
|
||||
OGRLayer* ogr_layer = dataset_->GetLayer(i);
|
||||
OGRFeatureDefn* ogr_layer_def = ogr_layer->GetLayerDefn();
|
||||
if (ogr_layer_def != 0)
|
||||
{
|
||||
layer_found = true;
|
||||
s << " '" << ogr_layer_def->GetName() << "' ";
|
||||
}
|
||||
}
|
||||
|
||||
case OFTIntegerList:
|
||||
case OFTRealList:
|
||||
case OFTStringList:
|
||||
case OFTWideStringList: // deprecated !
|
||||
#ifdef MAPNIK_DEBUG
|
||||
std::clog << "OGR Plugin: unhandled type_oid=" << type_oid << std::endl;
|
||||
if (! layer_found)
|
||||
{
|
||||
s << "None (no layers were found in dataset)";
|
||||
}
|
||||
|
||||
throw datasource_exception(s.str());
|
||||
}
|
||||
|
||||
if (! layer_)
|
||||
{
|
||||
std::string s("OGR Plugin: ");
|
||||
|
||||
if (layer_by_name)
|
||||
{
|
||||
s += "cannot find layer by name '" + *layer_by_name;
|
||||
}
|
||||
else if (layer_by_index)
|
||||
{
|
||||
s += "cannot find layer by index number '" + *layer_by_index;
|
||||
}
|
||||
|
||||
s += "' in dataset '" + dataset_name_ + "'";
|
||||
|
||||
throw datasource_exception(s);
|
||||
}
|
||||
|
||||
// initialize envelope
|
||||
OGREnvelope envelope;
|
||||
layer_->GetExtent(&envelope);
|
||||
extent_.init(envelope.MinX, envelope.MinY, envelope.MaxX, envelope.MaxY);
|
||||
|
||||
// scan for index file
|
||||
// TODO - layer names don't match dataset name, so this will break for
|
||||
// any layer types of ogr than shapefiles, etc
|
||||
// fix here and in ogrindex
|
||||
size_t breakpoint = dataset_name_.find_last_of(".");
|
||||
if (breakpoint == std::string::npos)
|
||||
{
|
||||
breakpoint = dataset_name_.length();
|
||||
}
|
||||
index_name_ = dataset_name_.substr(0, breakpoint) + ".ogrindex";
|
||||
|
||||
std::ifstream index_file (index_name_.c_str(), std::ios::in | std::ios::binary);
|
||||
if (index_file)
|
||||
{
|
||||
indexed_ = true;
|
||||
index_file.close();
|
||||
}
|
||||
#if 0
|
||||
// TODO - enable this warning once the ogrindex tool is a bit more stable/mature
|
||||
else
|
||||
{
|
||||
std::clog << "### Notice: no ogrindex file found for " << dataset_name_
|
||||
<< ", use the 'ogrindex' program to build an index for faster rendering"
|
||||
<< std::endl;
|
||||
}
|
||||
#endif
|
||||
break;
|
||||
|
||||
case OFTDate:
|
||||
case OFTTime:
|
||||
case OFTDateTime: // unhandled !
|
||||
#ifdef MAPNIK_DEBUG
|
||||
std::clog << "OGR Plugin: unhandled type_oid=" << type_oid << std::endl;
|
||||
#endif
|
||||
desc_.add_descriptor(attribute_descriptor(fld_name,mapnik::Object));
|
||||
break;
|
||||
// deal with attributes descriptions
|
||||
OGRFeatureDefn* def = layer_->GetLayerDefn();
|
||||
if (def != 0)
|
||||
{
|
||||
const int fld_count = def->GetFieldCount();
|
||||
for (int i = 0; i < fld_count; i++)
|
||||
{
|
||||
OGRFieldDefn* fld = def->GetFieldDefn(i);
|
||||
|
||||
default: // unknown
|
||||
const std::string fld_name = fld->GetNameRef();
|
||||
const OGRFieldType type_oid = fld->GetType();
|
||||
|
||||
switch (type_oid)
|
||||
{
|
||||
case OFTInteger:
|
||||
desc_.add_descriptor(attribute_descriptor(fld_name, mapnik::Integer));
|
||||
break;
|
||||
|
||||
case OFTReal:
|
||||
desc_.add_descriptor(attribute_descriptor(fld_name, mapnik::Double));
|
||||
break;
|
||||
|
||||
case OFTString:
|
||||
case OFTWideString: // deprecated
|
||||
desc_.add_descriptor(attribute_descriptor(fld_name, mapnik::String));
|
||||
break;
|
||||
|
||||
case OFTBinary:
|
||||
desc_.add_descriptor(attribute_descriptor(fld_name, mapnik::Object));
|
||||
break;
|
||||
|
||||
case OFTIntegerList:
|
||||
case OFTRealList:
|
||||
case OFTStringList:
|
||||
case OFTWideStringList: // deprecated !
|
||||
#ifdef MAPNIK_DEBUG
|
||||
std::clog << "OGR Plugin: unknown type_oid=" << type_oid << std::endl;
|
||||
std::clog << "OGR Plugin: unhandled type_oid=" << type_oid << std::endl;
|
||||
#endif
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
is_bound_ = true;
|
||||
break;
|
||||
|
||||
case OFTDate:
|
||||
case OFTTime:
|
||||
case OFTDateTime: // unhandled !
|
||||
#ifdef MAPNIK_DEBUG
|
||||
std::clog << "OGR Plugin: unhandled type_oid=" << type_oid << std::endl;
|
||||
#endif
|
||||
desc_.add_descriptor(attribute_descriptor(fld_name, mapnik::Object));
|
||||
break;
|
||||
|
||||
default: // unknown
|
||||
#ifdef MAPNIK_DEBUG
|
||||
std::clog << "OGR Plugin: unknown type_oid=" << type_oid << std::endl;
|
||||
#endif
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
is_bound_ = true;
|
||||
}
|
||||
|
||||
std::string ogr_datasource::name()
|
||||
{
|
||||
return "ogr";
|
||||
return "ogr";
|
||||
}
|
||||
|
||||
int ogr_datasource::type() const
|
||||
{
|
||||
return type_;
|
||||
return type_;
|
||||
}
|
||||
|
||||
box2d<double> ogr_datasource::envelope() const
|
||||
{
|
||||
if (!is_bound_) bind();
|
||||
return extent_;
|
||||
if (! is_bound_) bind();
|
||||
return extent_;
|
||||
}
|
||||
|
||||
layer_descriptor ogr_datasource::get_descriptor() const
|
||||
{
|
||||
if (!is_bound_) bind();
|
||||
return desc_;
|
||||
if (! is_bound_) bind();
|
||||
return desc_;
|
||||
}
|
||||
|
||||
featureset_ptr ogr_datasource::features(query const& q) const
|
||||
{
|
||||
if (!is_bound_) bind();
|
||||
if (! is_bound_) bind();
|
||||
|
||||
if (dataset_ && layer_)
|
||||
{
|
||||
|
||||
if (dataset_ && layer_)
|
||||
{
|
||||
#if 0
|
||||
// TODO - actually filter fields!
|
||||
// http://trac.osgeo.org/gdal/wiki/rfc29_desired_fields
|
||||
// http://trac.osgeo.org/gdal/wiki/rfc28_sqlfunc
|
||||
#if 0
|
||||
|
||||
std::ostringstream s;
|
||||
|
||||
s << "select ";
|
||||
std::set<std::string> const& props=q.property_names();
|
||||
std::set<std::string>::const_iterator pos=props.begin();
|
||||
std::set<std::string>::const_iterator end=props.end();
|
||||
std::set<std::string> const& props = q.property_names();
|
||||
std::set<std::string>::const_iterator pos = props.begin();
|
||||
std::set<std::string>::const_iterator end = props.end();
|
||||
while (pos != end)
|
||||
{
|
||||
s <<",\""<<*pos<<"\"";
|
||||
s << ",\"" << *pos << "\"";
|
||||
++pos;
|
||||
}
|
||||
s << " from " << layerName_ ;
|
||||
|
||||
// execute existing SQL
|
||||
OGRLayer* layer = dataset_->ExecuteSQL (s.str(), poly);
|
||||
OGRLayer* layer = dataset_->ExecuteSQL(s.str(), poly);
|
||||
|
||||
// layer must be freed
|
||||
dataset_->ReleaseResultSet (layer);
|
||||
dataset_->ReleaseResultSet(layer);
|
||||
#endif
|
||||
|
||||
if (indexed_)
|
||||
{
|
||||
filter_in_box filter(q.get_bbox());
|
||||
|
||||
return featureset_ptr(new ogr_index_featureset<filter_in_box> (*dataset_,
|
||||
*layer_,
|
||||
filter,
|
||||
index_name_,
|
||||
desc_.get_encoding(),
|
||||
multiple_geometries_));
|
||||
return featureset_ptr(new ogr_index_featureset<filter_in_box>(*dataset_,
|
||||
*layer_,
|
||||
filter,
|
||||
index_name_,
|
||||
desc_.get_encoding(),
|
||||
multiple_geometries_));
|
||||
}
|
||||
else
|
||||
{
|
||||
|
@ -333,16 +369,16 @@ featureset_ptr ogr_datasource::features(query const& q) const
|
|||
desc_.get_encoding(),
|
||||
multiple_geometries_));
|
||||
}
|
||||
}
|
||||
return featureset_ptr();
|
||||
}
|
||||
return featureset_ptr();
|
||||
}
|
||||
|
||||
featureset_ptr ogr_datasource::features_at_point(coord2d const& pt) const
|
||||
{
|
||||
if (!is_bound_) bind();
|
||||
if (!is_bound_) bind();
|
||||
|
||||
if (dataset_ && layer_)
|
||||
{
|
||||
if (dataset_ && layer_)
|
||||
{
|
||||
if (indexed_)
|
||||
{
|
||||
filter_at_point filter(pt);
|
||||
|
@ -366,7 +402,6 @@ featureset_ptr ogr_datasource::features_at_point(coord2d const& pt) const
|
|||
desc_.get_encoding(),
|
||||
multiple_geometries_));
|
||||
}
|
||||
}
|
||||
return featureset_ptr();
|
||||
}
|
||||
return featureset_ptr();
|
||||
}
|
||||
|
||||
|
|
|
@ -2,7 +2,7 @@
|
|||
*
|
||||
* This file is part of Mapnik (c++ mapping toolkit)
|
||||
*
|
||||
* Copyright (C) 2007 Artem Pavlenko
|
||||
* Copyright (C) 2011 Artem Pavlenko
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public
|
||||
|
@ -37,28 +37,29 @@
|
|||
|
||||
class ogr_datasource : public mapnik::datasource
|
||||
{
|
||||
public:
|
||||
ogr_datasource(mapnik::parameters const& params, bool bind=true);
|
||||
virtual ~ogr_datasource ();
|
||||
int type() const;
|
||||
static std::string name();
|
||||
mapnik::featureset_ptr features(mapnik::query const& q) const;
|
||||
mapnik::featureset_ptr features_at_point(mapnik::coord2d const& pt) const;
|
||||
mapnik::box2d<double> envelope() const;
|
||||
mapnik::layer_descriptor get_descriptor() const;
|
||||
void bind() const;
|
||||
private:
|
||||
mutable mapnik::box2d<double> extent_;
|
||||
int type_;
|
||||
std::string dataset_name_;
|
||||
mutable std::string index_name_;
|
||||
mutable OGRDataSource* dataset_;
|
||||
mutable OGRLayer* layer_;
|
||||
mutable std::string layerName_;
|
||||
mutable mapnik::layer_descriptor desc_;
|
||||
bool multiple_geometries_;
|
||||
mutable bool indexed_;
|
||||
public:
|
||||
ogr_datasource(mapnik::parameters const& params, bool bind=true);
|
||||
virtual ~ogr_datasource ();
|
||||
|
||||
int type() const;
|
||||
static std::string name();
|
||||
mapnik::featureset_ptr features(mapnik::query const& q) const;
|
||||
mapnik::featureset_ptr features_at_point(mapnik::coord2d const& pt) const;
|
||||
mapnik::box2d<double> envelope() const;
|
||||
mapnik::layer_descriptor get_descriptor() const;
|
||||
void bind() const;
|
||||
|
||||
private:
|
||||
mutable mapnik::box2d<double> extent_;
|
||||
int type_;
|
||||
std::string dataset_name_;
|
||||
mutable std::string index_name_;
|
||||
mutable OGRDataSource* dataset_;
|
||||
mutable OGRLayer* layer_;
|
||||
mutable std::string layerName_;
|
||||
mutable mapnik::layer_descriptor desc_;
|
||||
bool multiple_geometries_;
|
||||
mutable bool indexed_;
|
||||
};
|
||||
|
||||
|
||||
#endif // OGR_DATASOURCE_HPP
|
||||
|
|
|
@ -2,7 +2,7 @@
|
|||
*
|
||||
* This file is part of Mapnik (c++ mapping toolkit)
|
||||
*
|
||||
* Copyright (C) 2007 Artem Pavlenko
|
||||
* Copyright (C) 2011 Artem Pavlenko
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public
|
||||
|
@ -51,4 +51,3 @@ private:
|
|||
};
|
||||
|
||||
#endif // OGR_FEATURE_PTR_HPP
|
||||
|
||||
|
|
|
@ -2,7 +2,7 @@
|
|||
*
|
||||
* This file is part of Mapnik (c++ mapping toolkit)
|
||||
*
|
||||
* Copyright (C) 2007 Artem Pavlenko
|
||||
* Copyright (C) 2011 Artem Pavlenko
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public
|
||||
|
@ -51,13 +51,13 @@ ogr_featureset::ogr_featureset(OGRDataSource & dataset,
|
|||
OGRGeometry & extent,
|
||||
const std::string& encoding,
|
||||
const bool multiple_geometries)
|
||||
: dataset_(dataset),
|
||||
layer_(layer),
|
||||
layerdef_(layer.GetLayerDefn()),
|
||||
tr_(new transcoder(encoding)),
|
||||
fidcolumn_(layer_.GetFIDColumn ()),
|
||||
multiple_geometries_(multiple_geometries),
|
||||
count_(0)
|
||||
: dataset_(dataset),
|
||||
layer_(layer),
|
||||
layerdef_(layer.GetLayerDefn()),
|
||||
tr_(new transcoder(encoding)),
|
||||
fidcolumn_(layer_.GetFIDColumn ()),
|
||||
multiple_geometries_(multiple_geometries),
|
||||
count_(0)
|
||||
{
|
||||
layer_.SetSpatialFilter (&extent);
|
||||
}
|
||||
|
@ -67,13 +67,13 @@ ogr_featureset::ogr_featureset(OGRDataSource & dataset,
|
|||
const mapnik::box2d<double> & extent,
|
||||
const std::string& encoding,
|
||||
const bool multiple_geometries)
|
||||
: dataset_(dataset),
|
||||
layer_(layer),
|
||||
layerdef_(layer.GetLayerDefn()),
|
||||
tr_(new transcoder(encoding)),
|
||||
fidcolumn_(layer_.GetFIDColumn()),
|
||||
multiple_geometries_(multiple_geometries),
|
||||
count_(0)
|
||||
: dataset_(dataset),
|
||||
layer_(layer),
|
||||
layerdef_(layer.GetLayerDefn()),
|
||||
tr_(new transcoder(encoding)),
|
||||
fidcolumn_(layer_.GetFIDColumn()),
|
||||
multiple_geometries_(multiple_geometries),
|
||||
count_(0)
|
||||
{
|
||||
layer_.SetSpatialFilterRect (extent.minx(),
|
||||
extent.miny(),
|
||||
|
@ -81,27 +81,31 @@ ogr_featureset::ogr_featureset(OGRDataSource & dataset,
|
|||
extent.maxy());
|
||||
}
|
||||
|
||||
ogr_featureset::~ogr_featureset() {}
|
||||
ogr_featureset::~ogr_featureset()
|
||||
{
|
||||
}
|
||||
|
||||
feature_ptr ogr_featureset::next()
|
||||
{
|
||||
ogr_feature_ptr feat (layer_.GetNextFeature());
|
||||
|
||||
if ((*feat) != NULL)
|
||||
{
|
||||
// ogr feature ids start at 0, so add one to stay
|
||||
// consistent with other mapnik datasources that start at 1
|
||||
int feature_id = ((*feat)->GetFID() + 1);
|
||||
const int feature_id = ((*feat)->GetFID() + 1);
|
||||
feature_ptr feature(feature_factory::create(feature_id));
|
||||
|
||||
OGRGeometry* geom=(*feat)->GetGeometryRef();
|
||||
if (geom && !geom->IsEmpty())
|
||||
OGRGeometry* geom = (*feat)->GetGeometryRef();
|
||||
if (geom && ! geom->IsEmpty())
|
||||
{
|
||||
ogr_converter::convert_geometry (geom, feature, multiple_geometries_);
|
||||
ogr_converter::convert_geometry(geom, feature, multiple_geometries_);
|
||||
}
|
||||
#ifdef MAPNIK_DEBUG
|
||||
else
|
||||
{
|
||||
std::clog << "### Warning: feature with null geometry: " << (*feat)->GetFID() << "\n";
|
||||
std::clog << "OGR Plugin: feature with null geometry: "
|
||||
<< (*feat)->GetFID() << std::endl;
|
||||
}
|
||||
#endif
|
||||
++count_;
|
||||
|
@ -109,30 +113,30 @@ feature_ptr ogr_featureset::next()
|
|||
int fld_count = layerdef_->GetFieldCount();
|
||||
for (int i = 0; i < fld_count; i++)
|
||||
{
|
||||
OGRFieldDefn* fld = layerdef_->GetFieldDefn (i);
|
||||
OGRFieldType type_oid = fld->GetType ();
|
||||
std::string fld_name = fld->GetNameRef ();
|
||||
OGRFieldDefn* fld = layerdef_->GetFieldDefn(i);
|
||||
const OGRFieldType type_oid = fld->GetType();
|
||||
const std::string fld_name = fld->GetNameRef();
|
||||
|
||||
switch (type_oid)
|
||||
{
|
||||
case OFTInteger:
|
||||
{
|
||||
boost::put(*feature,fld_name,(*feat)->GetFieldAsInteger (i));
|
||||
break;
|
||||
boost::put(*feature, fld_name, (*feat)->GetFieldAsInteger(i));
|
||||
break;
|
||||
}
|
||||
|
||||
case OFTReal:
|
||||
{
|
||||
boost::put(*feature,fld_name,(*feat)->GetFieldAsDouble (i));
|
||||
break;
|
||||
boost::put(*feature, fld_name, (*feat)->GetFieldAsDouble(i));
|
||||
break;
|
||||
}
|
||||
|
||||
case OFTString:
|
||||
case OFTWideString: // deprecated !
|
||||
{
|
||||
UnicodeString ustr = tr_->transcode((*feat)->GetFieldAsString (i));
|
||||
boost::put(*feature,fld_name,ustr);
|
||||
break;
|
||||
UnicodeString ustr = tr_->transcode((*feat)->GetFieldAsString(i));
|
||||
boost::put(*feature, fld_name, ustr);
|
||||
break;
|
||||
}
|
||||
|
||||
case OFTIntegerList:
|
||||
|
@ -140,37 +144,37 @@ feature_ptr ogr_featureset::next()
|
|||
case OFTStringList:
|
||||
case OFTWideStringList: // deprecated !
|
||||
{
|
||||
#ifdef MAPNIK_DEBUG
|
||||
std::clog << "OGR Plugin: unhandled type_oid=" << type_oid << std::endl;
|
||||
#endif
|
||||
break;
|
||||
#ifdef MAPNIK_DEBUG
|
||||
std::clog << "OGR Plugin: unhandled type_oid=" << type_oid << std::endl;
|
||||
#endif
|
||||
break;
|
||||
}
|
||||
|
||||
case OFTBinary:
|
||||
{
|
||||
#ifdef MAPNIK_DEBUG
|
||||
std::clog << "OGR Plugin: unhandled type_oid=" << type_oid << std::endl;
|
||||
#endif
|
||||
//boost::put(*feature,name,feat->GetFieldAsBinary (i, size));
|
||||
break;
|
||||
#ifdef MAPNIK_DEBUG
|
||||
std::clog << "OGR Plugin: unhandled type_oid=" << type_oid << std::endl;
|
||||
#endif
|
||||
//boost::put(*feature,name,feat->GetFieldAsBinary (i, size));
|
||||
break;
|
||||
}
|
||||
|
||||
case OFTDate:
|
||||
case OFTTime:
|
||||
case OFTDateTime: // unhandled !
|
||||
{
|
||||
#ifdef MAPNIK_DEBUG
|
||||
std::clog << "OGR Plugin: unhandled type_oid=" << type_oid << std::endl;
|
||||
#endif
|
||||
break;
|
||||
#ifdef MAPNIK_DEBUG
|
||||
std::clog << "OGR Plugin: unhandled type_oid=" << type_oid << std::endl;
|
||||
#endif
|
||||
break;
|
||||
}
|
||||
|
||||
default: // unknown
|
||||
{
|
||||
#ifdef MAPNIK_DEBUG
|
||||
std::clog << "OGR Plugin: unknown type_oid=" << type_oid << std::endl;
|
||||
#endif
|
||||
break;
|
||||
#ifdef MAPNIK_DEBUG
|
||||
std::clog << "OGR Plugin: unknown type_oid=" << type_oid << std::endl;
|
||||
#endif
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -182,4 +186,3 @@ feature_ptr ogr_featureset::next()
|
|||
#endif
|
||||
return feature_ptr();
|
||||
}
|
||||
|
||||
|
|
|
@ -2,7 +2,7 @@
|
|||
*
|
||||
* This file is part of Mapnik (c++ mapping toolkit)
|
||||
*
|
||||
* Copyright (C) 2007 Artem Pavlenko
|
||||
* Copyright (C) 2011 Artem Pavlenko
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public
|
||||
|
@ -37,30 +37,32 @@
|
|||
|
||||
class ogr_featureset : public mapnik::Featureset
|
||||
{
|
||||
OGRDataSource & dataset_;
|
||||
OGRLayer & layer_;
|
||||
OGRFeatureDefn * layerdef_;
|
||||
boost::scoped_ptr<mapnik::transcoder> tr_;
|
||||
const char* fidcolumn_;
|
||||
bool multiple_geometries_;
|
||||
mutable int count_;
|
||||
public:
|
||||
ogr_featureset(OGRDataSource & dataset,
|
||||
OGRLayer & layer,
|
||||
OGRGeometry & extent,
|
||||
const std::string& encoding,
|
||||
const bool multiple_geometries);
|
||||
public:
|
||||
ogr_featureset(OGRDataSource & dataset,
|
||||
OGRLayer & layer,
|
||||
OGRGeometry & extent,
|
||||
const std::string& encoding,
|
||||
const bool multiple_geometries);
|
||||
|
||||
ogr_featureset(OGRDataSource & dataset,
|
||||
OGRLayer & layer,
|
||||
const mapnik::box2d<double> & extent,
|
||||
const std::string& encoding,
|
||||
const bool multiple_geometries);
|
||||
virtual ~ogr_featureset();
|
||||
mapnik::feature_ptr next();
|
||||
private:
|
||||
ogr_featureset(const ogr_featureset&);
|
||||
const ogr_featureset& operator=(const ogr_featureset&);
|
||||
ogr_featureset(OGRDataSource & dataset,
|
||||
OGRLayer & layer,
|
||||
const mapnik::box2d<double> & extent,
|
||||
const std::string& encoding,
|
||||
const bool multiple_geometries);
|
||||
virtual ~ogr_featureset();
|
||||
mapnik::feature_ptr next();
|
||||
|
||||
private:
|
||||
ogr_featureset(const ogr_featureset&);
|
||||
const ogr_featureset& operator=(const ogr_featureset&);
|
||||
|
||||
OGRDataSource& dataset_;
|
||||
OGRLayer& layer_;
|
||||
OGRFeatureDefn* layerdef_;
|
||||
boost::scoped_ptr<mapnik::transcoder> tr_;
|
||||
const char* fidcolumn_;
|
||||
bool multiple_geometries_;
|
||||
mutable int count_;
|
||||
};
|
||||
|
||||
#endif // OGR_FEATURESET_HPP
|
||||
|
|
|
@ -2,7 +2,7 @@
|
|||
*
|
||||
* This file is part of Mapnik (c++ mapping toolkit)
|
||||
*
|
||||
* Copyright (C) 2006 Artem Pavlenko
|
||||
* Copyright (C) 2011 Artem Pavlenko
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public
|
||||
|
@ -37,18 +37,18 @@ template <typename filterT, typename IStream = std::ifstream>
|
|||
class ogr_index
|
||||
{
|
||||
public:
|
||||
static void query(const filterT& filter, IStream& file,std::vector<int>& pos);
|
||||
static void query(const filterT& filter, IStream& file, std::vector<int>& pos);
|
||||
private:
|
||||
ogr_index();
|
||||
~ogr_index();
|
||||
ogr_index(const ogr_index&);
|
||||
ogr_index& operator=(const ogr_index&);
|
||||
static int read_ndr_integer(IStream & in);
|
||||
static void read_envelope(IStream & in,box2d<double> &envelope);
|
||||
static void query_node(const filterT& filter,IStream & in,std::vector<int>& pos);
|
||||
static int read_ndr_integer(IStream& in);
|
||||
static void read_envelope(IStream& in, box2d<double>& envelope);
|
||||
static void query_node(const filterT& filter, IStream& in, std::vector<int>& pos);
|
||||
};
|
||||
|
||||
template <typename filterT,typename IStream>
|
||||
template <typename filterT, typename IStream>
|
||||
void ogr_index<filterT, IStream>::query(const filterT& filter,IStream & file,std::vector<int>& pos)
|
||||
{
|
||||
file.seekg(16,std::ios::beg);
|
||||
|
@ -56,50 +56,49 @@ void ogr_index<filterT, IStream>::query(const filterT& filter,IStream & file,std
|
|||
}
|
||||
|
||||
template <typename filterT, typename IStream>
|
||||
void ogr_index<filterT,IStream>::query_node(const filterT& filter,IStream & file,std::vector<int>& ids)
|
||||
void ogr_index<filterT,IStream>::query_node(const filterT& filter, IStream& file, std::vector<int>& ids)
|
||||
{
|
||||
int offset=read_ndr_integer(file);
|
||||
const int offset = read_ndr_integer(file);
|
||||
|
||||
box2d<double> node_ext;
|
||||
read_envelope(file,node_ext);
|
||||
read_envelope(file, node_ext);
|
||||
|
||||
int num_shapes=read_ndr_integer(file);
|
||||
const int num_shapes = read_ndr_integer(file);
|
||||
|
||||
if (!filter.pass(node_ext))
|
||||
if (! filter.pass(node_ext))
|
||||
{
|
||||
file.seekg(offset+num_shapes*4+4,std::ios::cur);
|
||||
file.seekg(offset + num_shapes * 4 + 4, std::ios::cur);
|
||||
return;
|
||||
}
|
||||
|
||||
for (int i=0;i<num_shapes;++i)
|
||||
for (int i = 0; i < num_shapes; ++i)
|
||||
{
|
||||
int id=read_ndr_integer(file);
|
||||
const int id = read_ndr_integer(file);
|
||||
ids.push_back(id);
|
||||
}
|
||||
|
||||
int children=read_ndr_integer(file);
|
||||
const int children = read_ndr_integer(file);
|
||||
|
||||
for (int j=0;j<children;++j)
|
||||
for (int j = 0; j < children; ++j)
|
||||
{
|
||||
query_node(filter,file,ids);
|
||||
query_node(filter, file, ids);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
template <typename filterT,typename IStream>
|
||||
int ogr_index<filterT,IStream>::read_ndr_integer(IStream & file)
|
||||
template <typename filterT, typename IStream>
|
||||
int ogr_index<filterT,IStream>::read_ndr_integer(IStream& file)
|
||||
{
|
||||
char b[4];
|
||||
file.read(b,4);
|
||||
return (b[0]&0xff) | (b[1]&0xff)<<8 | (b[2]&0xff)<<16 | (b[3]&0xff)<<24;
|
||||
file.read(b, 4);
|
||||
return (b[0] & 0xff) | (b[1] & 0xff) << 8 | (b[2] & 0xff) << 16 | (b[3] & 0xff) << 24;
|
||||
}
|
||||
|
||||
|
||||
template <typename filterT,typename IStream>
|
||||
void ogr_index<filterT,IStream>::read_envelope(IStream & file,box2d<double>& envelope)
|
||||
template <typename filterT, typename IStream>
|
||||
void ogr_index<filterT, IStream>::read_envelope(IStream& file, box2d<double>& envelope)
|
||||
{
|
||||
file.read(reinterpret_cast<char*>(&envelope),sizeof(envelope));
|
||||
file.read(reinterpret_cast<char*>(&envelope), sizeof(envelope));
|
||||
}
|
||||
|
||||
|
||||
#endif //SHP_INDEX_HH
|
||||
#endif // OGR_INDEX_HH
|
||||
|
|
|
@ -2,7 +2,7 @@
|
|||
*
|
||||
* This file is part of Mapnik (c++ mapping toolkit)
|
||||
*
|
||||
* Copyright (C) 2007 Artem Pavlenko
|
||||
* Copyright (C) 2011 Artem Pavlenko
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public
|
||||
|
@ -32,29 +32,29 @@
|
|||
template <typename filterT>
|
||||
class ogr_index_featureset : public mapnik::Featureset
|
||||
{
|
||||
OGRDataSource & dataset_;
|
||||
OGRLayer & layer_;
|
||||
OGRFeatureDefn * layerdef_;
|
||||
filterT filter_;
|
||||
std::vector<int> ids_;
|
||||
std::vector<int>::iterator itr_;
|
||||
boost::scoped_ptr<mapnik::transcoder> tr_;
|
||||
const char* fidcolumn_;
|
||||
bool multiple_geometries_;
|
||||
public:
|
||||
ogr_index_featureset(OGRDataSource& dataset,
|
||||
OGRLayer& layer,
|
||||
const filterT& filter,
|
||||
const std::string& index_file,
|
||||
const std::string& encoding,
|
||||
const bool multiple_geometries);
|
||||
virtual ~ogr_index_featureset();
|
||||
mapnik::feature_ptr next();
|
||||
|
||||
public:
|
||||
ogr_index_featureset(OGRDataSource & dataset,
|
||||
OGRLayer & layer,
|
||||
const filterT& filter,
|
||||
const std::string& index_file,
|
||||
const std::string& encoding,
|
||||
const bool multiple_geometries);
|
||||
virtual ~ogr_index_featureset();
|
||||
mapnik::feature_ptr next();
|
||||
private:
|
||||
//no copying
|
||||
ogr_index_featureset(const ogr_index_featureset&);
|
||||
ogr_index_featureset& operator=(const ogr_index_featureset&);
|
||||
private:
|
||||
ogr_index_featureset(const ogr_index_featureset&);
|
||||
ogr_index_featureset& operator=(const ogr_index_featureset&);
|
||||
|
||||
OGRDataSource& dataset_;
|
||||
OGRLayer& layer_;
|
||||
OGRFeatureDefn* layerdef_;
|
||||
filterT filter_;
|
||||
std::vector<int> ids_;
|
||||
std::vector<int>::iterator itr_;
|
||||
boost::scoped_ptr<mapnik::transcoder> tr_;
|
||||
const char* fidcolumn_;
|
||||
bool multiple_geometries_;
|
||||
};
|
||||
|
||||
#endif // OGR_FEATURESET_HPP
|
||||
#endif // OGR_INDEX_FEATURESET_HPP
|
||||
|
|
Loading…
Add table
Reference in a new issue