Merge branch 'master' of github.com:mapnik/mapnik into expr-v2
Conflicts: src/agg/process_building_symbolizer.cpp src/cairo_context.cpp src/cairo_renderer.cpp src/grid/process_building_symbolizer.cpp src/grid/process_line_pattern_symbolizer.cpp src/grid/process_text_symbolizer.cpp tests/python_tests/images/support/marker-text-line-scale-factor-0.899.png tests/python_tests/images/support/marker-text-line-scale-factor-1.5.png tests/python_tests/images/support/marker-text-line-scale-factor-1.png tests/python_tests/images/support/marker-text-line-scale-factor-10.png tests/python_tests/images/support/marker-text-line-scale-factor-100.png tests/python_tests/images/support/marker-text-line-scale-factor-2.png tests/python_tests/images/support/marker-text-line-scale-factor-5.png tests/visual_tests/images/lines-5-200-200-1.0-agg-reference.png tests/visual_tests/images/lines-5-200-200-2.0-agg-reference.png tests/visual_tests/images/lines-5-400-400-1.0-agg-reference.png tests/visual_tests/images/lines-5-400-400-2.0-agg-reference.png tests/visual_tests/images/lines-5-600-600-1.0-agg-reference.png tests/visual_tests/images/lines-5-600-600-2.0-agg-reference.png tests/visual_tests/images/lines-5-800-800-1.0-agg-reference.png tests/visual_tests/images/lines-5-800-800-2.0-agg-reference.png tests/visual_tests/images/lines-6-200-200-2.0-agg-reference.png tests/visual_tests/images/lines-6-400-400-2.0-agg-reference.png tests/visual_tests/images/lines-6-600-600-2.0-agg-reference.png tests/visual_tests/images/lines-6-800-800-2.0-agg-reference.png tests/visual_tests/test.py
16
.travis.yml
|
@ -2,27 +2,34 @@ language: cpp
|
|||
|
||||
compiler:
|
||||
- gcc
|
||||
- clang
|
||||
|
||||
# http://about.travis-ci.org/blog/2013-11-29-postgresql-92-93-now-available/
|
||||
addons:
|
||||
postgresql: "9.3"
|
||||
|
||||
before_install:
|
||||
# we need at least g++-4.7 for c++11 features
|
||||
- if [ "${CXX}" = 'g++' ]; then sudo add-apt-repository -y ppa:ubuntu-toolchain-r/test; fi;
|
||||
- sudo add-apt-repository -y ppa:ubuntu-toolchain-r/test
|
||||
# grab more recent gdal/proj
|
||||
- sudo add-apt-repository -y ppa:ubuntugis/ubuntugis-unstable
|
||||
# more recent boost
|
||||
- sudo add-apt-repository -y ppa:mapnik/boost
|
||||
- sudo apt-get update -y
|
||||
# upgrade compilers
|
||||
- if [ "${CXX}" = 'g++' ]; then sudo apt-get install -y gcc-4.7 g++-4.7; fi;
|
||||
- sudo apt-get install -y make libboost-dev libboost-filesystem-dev libboost-program-options-dev libboost-python-dev libboost-regex-dev libboost-system-dev libboost-thread-dev python-nose libicu-dev libpng-dev libjpeg-dev libtiff-dev libwebp-dev libz-dev libfreetype6-dev libxml2-dev libproj-dev libcairo-dev python-cairo-dev libsqlite3-dev postgresql-server-dev*
|
||||
- sudo apt-get install -y gcc-4.8 g++-4.8
|
||||
- sudo apt-get install -y make libboost-dev libboost-filesystem-dev libboost-program-options-dev libboost-python-dev libboost-regex-dev libboost-system-dev libboost-thread-dev python-nose libicu-dev libpng-dev libjpeg-dev libtiff-dev libwebp-dev libz-dev libfreetype6-dev libxml2-dev libproj-dev libcairo-dev python-cairo-dev libsqlite3-dev
|
||||
- wget http://mapnik.s3.amazonaws.com/deps/harfbuzz-0.9.24.tar.bz2
|
||||
- tar xf harfbuzz-0.9.24.tar.bz2
|
||||
- cd harfbuzz-0.9.24
|
||||
- ./configure && make && sudo make install
|
||||
- sudo ldconfig
|
||||
- cd ../
|
||||
- createdb template_postgis
|
||||
- psql -c "CREATE EXTENSION postgis" template_postgis
|
||||
|
||||
install:
|
||||
- if [ "${CXX}" = 'g++' ]; then export CXX="g++-4.7" && export CC="gcc-4.7"; fi;
|
||||
- if [ "${CXX}" = 'g++' ]; then export CXX="g++-4.8" && export CC="gcc-4.8"; fi;
|
||||
- ./configure CXX=${CXX} CC=${CC} DEMO=False BINDINGS=${BINDINGS} BENCHMARK=${BENCHMARK} CPP_TESTS=${CPP_TESTS} CAIRO=True FAST=True || cat config.log
|
||||
- JOBS=1 make
|
||||
|
||||
|
@ -45,4 +52,3 @@ notifications:
|
|||
email:
|
||||
on_success: [never]
|
||||
on_failure: [change]
|
||||
|
||||
|
|
|
@ -14,6 +14,12 @@ Released ...
|
|||
|
||||
Summary: TODO
|
||||
|
||||
- PostGIS: Added support for rendering 3D and 4D geometries (previously silently skipped) (#44)
|
||||
|
||||
- AGG renderer: fixed geometry offsetting to work after smoothing to produce more consistent results (#2202)
|
||||
|
||||
- AGG renderer: increased `vertex_dist_epsilon` to ensure nearly coincident points are discarded more readily (#2196)
|
||||
|
||||
- GDAL plugin: Added back support for user driven `nodata` on rgb(a) images (#2023)
|
||||
|
||||
- GDAL plugin: Allowed nodata to override alpha band if set on rgba images (#2023)
|
||||
|
|
|
@ -616,9 +616,11 @@ def parse_config(context, config, checks='--libs --cflags'):
|
|||
if not parsed:
|
||||
if config in ('GDAL_CONFIG'):
|
||||
# optional deps...
|
||||
if tool not in env['SKIPPED_DEPS']:
|
||||
env['SKIPPED_DEPS'].append(tool)
|
||||
conf.rollback_option(config)
|
||||
else: # freetype and libxml2, not optional
|
||||
if tool not in env['MISSING_DEPS']:
|
||||
env['MISSING_DEPS'].append(tool)
|
||||
context.Result( ret )
|
||||
return ret
|
||||
|
@ -675,6 +677,7 @@ def ogr_enabled(context):
|
|||
context.Message( 'Checking if gdal is ogr enabled... ')
|
||||
ret = context.TryAction('%s --ogr-enabled' % env['GDAL_CONFIG'])[0]
|
||||
if not ret:
|
||||
if 'ogr' not in env['SKIPPED_DEPS']:
|
||||
env['SKIPPED_DEPS'].append('ogr')
|
||||
context.Result( ret )
|
||||
return ret
|
||||
|
@ -1427,8 +1430,7 @@ if not preconfigured:
|
|||
conf.parse_pg_config('PG_CONFIG')
|
||||
elif plugin == 'ogr':
|
||||
if conf.ogr_enabled():
|
||||
if not 'gdal' in env['REQUESTED_PLUGINS']:
|
||||
conf.parse_config('GDAL_CONFIG',checks='--libs')
|
||||
if conf.parse_config('GDAL_CONFIG',checks='--libs'):
|
||||
conf.parse_config('GDAL_CONFIG',checks='--cflags')
|
||||
libname = conf.get_pkg_lib('GDAL_CONFIG','ogr')
|
||||
if libname:
|
||||
|
|
|
@ -25,8 +25,9 @@
|
|||
|
||||
// boost
|
||||
#include <boost/version.hpp>
|
||||
#include <boost/config.hpp>
|
||||
|
||||
#if BOOST_VERSION < 105300
|
||||
#if BOOST_VERSION < 105300 || defined BOOST_NO_CXX11_SMART_PTR
|
||||
|
||||
// https://github.com/mapnik/mapnik/issues/2022
|
||||
#include <memory>
|
||||
|
|
2
deps/agg/include/agg_math.h
vendored
|
@ -27,7 +27,7 @@ namespace agg
|
|||
|
||||
//------------------------------------------------------vertex_dist_epsilon
|
||||
// Coinciding points maximal distance (Epsilon)
|
||||
const double vertex_dist_epsilon = 1e-14;
|
||||
const double vertex_dist_epsilon = 1e-5;
|
||||
|
||||
//-----------------------------------------------------intersection_epsilon
|
||||
// See calc_intersection
|
||||
|
|
|
@ -46,7 +46,6 @@ template <typename Geometry>
|
|||
struct MAPNIK_DECL offset_converter
|
||||
{
|
||||
typedef std::size_t size_type;
|
||||
//typedef typename Geometry::value_type value_type;
|
||||
|
||||
offset_converter(Geometry & geom)
|
||||
: geom_(geom)
|
||||
|
@ -62,10 +61,7 @@ struct MAPNIK_DECL offset_converter
|
|||
enum status
|
||||
{
|
||||
initial,
|
||||
process,
|
||||
last_vertex,
|
||||
angle_joint,
|
||||
end
|
||||
process
|
||||
};
|
||||
|
||||
double get_offset() const
|
||||
|
@ -98,19 +94,27 @@ struct MAPNIK_DECL offset_converter
|
|||
unsigned vertex(double * x, double * y)
|
||||
{
|
||||
if (offset_ == 0.0)
|
||||
{
|
||||
return geom_.vertex(x, y);
|
||||
}
|
||||
|
||||
if (status_ == initial)
|
||||
{
|
||||
init_vertices();
|
||||
}
|
||||
|
||||
if (pos_ >= vertices_.size())
|
||||
{
|
||||
return SEG_END;
|
||||
}
|
||||
|
||||
pre_ = (pos_ ? cur_ : pre_first_);
|
||||
cur_ = vertices_[pos_++];
|
||||
cur_ = vertices_.at(pos_++);
|
||||
|
||||
if (pos_ == vertices_.size())
|
||||
{
|
||||
return output_vertex(x, y);
|
||||
}
|
||||
|
||||
double const check_dist = offset_ * threshold_;
|
||||
double const check_dist2 = check_dist * check_dist;
|
||||
|
@ -127,13 +131,19 @@ struct MAPNIK_DECL offset_converter
|
|||
double const dy = u0.y - cur_.y;
|
||||
|
||||
if (dx*dx + dy*dy > check_dist2)
|
||||
{
|
||||
break;
|
||||
}
|
||||
|
||||
if (!intersection(pre_, cur_, &vt, u0, u1, &ut))
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
if (vt < 0.0 || vt > t || ut < 0.0 || ut > 1.0)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
t = vt;
|
||||
pos_ = i+1;
|
||||
|
@ -162,12 +172,18 @@ private:
|
|||
static double explement_reflex_angle(double angle)
|
||||
{
|
||||
if (angle > pi)
|
||||
{
|
||||
return angle - 2 * pi;
|
||||
}
|
||||
else if (angle < -pi)
|
||||
{
|
||||
return angle + 2 * pi;
|
||||
}
|
||||
else
|
||||
{
|
||||
return angle;
|
||||
}
|
||||
}
|
||||
|
||||
static bool intersection(vertex2d const& u1, vertex2d const& u2, double* ut,
|
||||
vertex2d const& v1, vertex2d const& v2, double* vt)
|
||||
|
@ -186,7 +202,9 @@ private:
|
|||
double const dn = vx * uy - ux * vy;
|
||||
|
||||
if (dn > -1e-6 && dn < 1e-6)
|
||||
{
|
||||
return false; // they are parallel
|
||||
}
|
||||
|
||||
*vt = up / dn;
|
||||
*ut = (*vt * vx + dx) / ux;
|
||||
|
@ -200,7 +218,9 @@ private:
|
|||
double const dn = vy * ux - uy * vx;
|
||||
|
||||
if (dn > -1e-6 && dn < 1e-6)
|
||||
{
|
||||
return false; // they are parallel
|
||||
}
|
||||
|
||||
*vt = up / dn;
|
||||
*ut = (*vt * vy + dy) / uy;
|
||||
|
@ -251,7 +271,9 @@ private:
|
|||
status init_vertices()
|
||||
{
|
||||
if (status_ != initial) // already initialized
|
||||
{
|
||||
return status_;
|
||||
}
|
||||
|
||||
vertex2d v1(vertex2d::no_init);
|
||||
vertex2d v2(vertex2d::no_init);
|
||||
|
@ -261,7 +283,9 @@ private:
|
|||
v2.cmd = geom_.vertex(&v2.x, &v2.y);
|
||||
|
||||
if (v2.cmd == SEG_END) // not enough vertices in source
|
||||
{
|
||||
return status_ = process;
|
||||
}
|
||||
|
||||
double angle_a = 0;
|
||||
double angle_b = std::atan2((v2.y - v1.y), (v2.x - v1.x));
|
||||
|
@ -290,16 +314,24 @@ private:
|
|||
if (offset_ < 0.0)
|
||||
{
|
||||
if (joint_angle > 0.0)
|
||||
{
|
||||
joint_angle = joint_angle - 2 * pi;
|
||||
}
|
||||
else
|
||||
bulge_steps = 1 + int(std::floor(half_turns / pi));
|
||||
{
|
||||
bulge_steps = 1 + static_cast<int>(std::floor(half_turns / pi));
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if (joint_angle < 0.0)
|
||||
{
|
||||
joint_angle = joint_angle + 2 * pi;
|
||||
}
|
||||
else
|
||||
bulge_steps = 1 + int(floor(half_turns / pi));
|
||||
{
|
||||
bulge_steps = 1 + static_cast<int>(std::floor(half_turns / pi));
|
||||
}
|
||||
}
|
||||
|
||||
#ifdef MAPNIK_LOG
|
||||
|
|
|
@ -36,9 +36,6 @@
|
|||
// boost
|
||||
|
||||
|
||||
// stl
|
||||
#include <cassert>
|
||||
|
||||
extern "C"
|
||||
{
|
||||
#include <png.h>
|
||||
|
@ -542,11 +539,9 @@ void save_as_png8_oct(T1 & file,
|
|||
std::vector<rgb> pal;
|
||||
trees[j].setOffset( static_cast<unsigned>(palette.size()));
|
||||
trees[j].create_palette(pal);
|
||||
assert(pal.size() <= opts.colors);
|
||||
leftovers = cols[j] - static_cast<unsigned>(pal.size());
|
||||
cols[j] = static_cast<unsigned>(pal.size());
|
||||
palette.insert(palette.begin(), pal.begin(), pal.end());
|
||||
assert(palette.size() <= 256);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -684,7 +679,6 @@ void save_as_png8_hex(T1 & file,
|
|||
//transparency values per palette index
|
||||
std::vector<mapnik::rgba> pal;
|
||||
tree.create_palette(pal);
|
||||
assert(int(pal.size()) <= opts.colors);
|
||||
std::vector<mapnik::rgb> palette;
|
||||
std::vector<unsigned> alphaTable;
|
||||
for(unsigned i=0; i<pal.size(); i++)
|
||||
|
|
|
@ -171,8 +171,10 @@ private:
|
|||
}
|
||||
|
||||
polygon_2d subject_poly;
|
||||
double x,y;
|
||||
double prev_x, prev_y;
|
||||
double x = 0;
|
||||
double y = 0;
|
||||
double prev_x = 0;
|
||||
double prev_y = 0;
|
||||
geom_.rewind(0);
|
||||
unsigned ring_count = 0;
|
||||
while (true)
|
||||
|
|
38
include/mapnik/std.hpp
Normal file
|
@ -0,0 +1,38 @@
|
|||
/*****************************************************************************
|
||||
*
|
||||
* This file is part of Mapnik (c++ mapping toolkit)
|
||||
*
|
||||
* Copyright (C) 2014 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
|
||||
*
|
||||
*****************************************************************************/
|
||||
|
||||
#ifndef MAPNIK_STD_HPP
|
||||
#define MAPNIK_STD_HPP
|
||||
|
||||
#include <memory>
|
||||
|
||||
namespace std {
|
||||
|
||||
// C++14 backfill from http://herbsutter.com/gotw/_102/
|
||||
template<typename T, typename ...Args>
|
||||
inline ::std::unique_ptr<T> make_unique(Args&& ...args) {
|
||||
return ::std::unique_ptr<T>(new T(::std::forward<Args>(args)...));
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
#endif
|
|
@ -21,6 +21,7 @@
|
|||
*****************************************************************************/
|
||||
|
||||
// mapnik
|
||||
#include <mapnik/std.hpp>
|
||||
#include <mapnik/global.hpp>
|
||||
#include <mapnik/debug.hpp>
|
||||
#include <mapnik/image_data.hpp>
|
||||
|
@ -449,9 +450,9 @@ feature_ptr gdal_featureset::get_feature_at_point(mapnik::coord2d const& pt)
|
|||
{
|
||||
// construct feature
|
||||
feature_ptr feature = feature_factory::create(ctx_,1);
|
||||
geometry_type * point = new geometry_type(mapnik::geometry_type::types::Point);
|
||||
std::unique_ptr<geometry_type> point = std::make_unique<geometry_type>(mapnik::geometry_type::types::Point);
|
||||
point->move_to(pt.x, pt.y);
|
||||
feature->add_geometry(point);
|
||||
feature->add_geometry(point.release());
|
||||
feature->put_new("value",value);
|
||||
if (raster_has_nodata)
|
||||
{
|
||||
|
|
|
@ -259,9 +259,9 @@ void occi_featureset::convert_geometry(SDOGeometry* geom, feature_ptr feature)
|
|||
SDOPointType* sdopoint = geom->getSdo_point();
|
||||
if (sdopoint && ! sdopoint->isNull())
|
||||
{
|
||||
geometry_type* point = new geometry_type(mapnik::geometry_type::types::Point);
|
||||
std::unique_ptr<geometry_type> point = std::make_unique<geometry_type>(mapnik::geometry_type::types::Point);
|
||||
point->move_to(sdopoint->getX(), sdopoint->getY());
|
||||
feature->add_geometry(point);
|
||||
feature->add_geometry(point.release());
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
|
|
@ -165,8 +165,8 @@ void ogr_datasource::init(mapnik::parameters const& params)
|
|||
int num_layers = dataset_->GetLayerCount();
|
||||
if (*layer_by_index >= num_layers)
|
||||
{
|
||||
std::ostringstream s("OGR Plugin: only ");
|
||||
s << num_layers << " layer(s) exist, cannot find layer by index '" << *layer_by_index << "'";
|
||||
std::ostringstream s;
|
||||
s << "OGR Plugin: only " << num_layers << " layer(s) exist, cannot find layer by index '" << *layer_by_index << "'";
|
||||
throw datasource_exception(s.str());
|
||||
}
|
||||
|
||||
|
@ -214,7 +214,8 @@ void ogr_datasource::init(mapnik::parameters const& params)
|
|||
|
||||
if (! layer_.is_valid())
|
||||
{
|
||||
std::ostringstream s("OGR Plugin: ");
|
||||
std::ostringstream s;
|
||||
s << "OGR Plugin: ";
|
||||
|
||||
if (layer_by_name)
|
||||
{
|
||||
|
@ -452,8 +453,8 @@ void validate_attribute_names(query const& q, std::vector<attribute_descriptor>
|
|||
|
||||
if (! found_name)
|
||||
{
|
||||
std::ostringstream s("OGR Plugin: no attribute '");
|
||||
s << *pos << "'. Valid attributes are: ";
|
||||
std::ostringstream s;
|
||||
s << "OGR Plugin: no attribute named '" << *pos << "'. Valid attributes are: ";
|
||||
std::vector<attribute_descriptor>::const_iterator e_itr = names.begin();
|
||||
std::vector<attribute_descriptor>::const_iterator e_end = names.end();
|
||||
for ( ;e_itr!=e_end;++e_itr)
|
||||
|
|
|
@ -21,6 +21,7 @@
|
|||
|
||||
Import ('plugin_base')
|
||||
Import ('env')
|
||||
from copy import copy
|
||||
|
||||
PLUGIN_NAME = 'osm'
|
||||
|
||||
|
@ -37,9 +38,24 @@ plugin_sources = Split(
|
|||
""" % locals()
|
||||
)
|
||||
|
||||
plugin_env['LIBS'] = []
|
||||
if env['RUNTIME_LINK'] == 'static':
|
||||
# pkg-config is more reliable than pg_config across platforms
|
||||
cmd = 'pkg-config libcurl --libs --static'
|
||||
try:
|
||||
plugin_env.ParseConfig(cmd)
|
||||
except OSError, e:
|
||||
# if this fails likely only system curl is available
|
||||
# on OS X at least the system curl lacks a pkg-config file
|
||||
# so static linking is not viable anyway
|
||||
plugin_env.Append(LIBS='curl')
|
||||
else:
|
||||
plugin_env.Append(LIBS='curl')
|
||||
|
||||
plugin_env.Append(LIBS='xml2')
|
||||
|
||||
# Link Library to Dependencies
|
||||
libraries = [ 'xml2' ]
|
||||
libraries.append('curl')
|
||||
libraries = copy(plugin_env['LIBS'])
|
||||
libraries.append(env['ICU_LIB_NAME'])
|
||||
libraries.append('boost_system%s' % env['BOOST_APPEND'])
|
||||
|
||||
|
|
|
@ -22,6 +22,7 @@
|
|||
*****************************************************************************/
|
||||
|
||||
// mapnik
|
||||
#include <mapnik/std.hpp>
|
||||
#include <mapnik/geometry.hpp>
|
||||
#include <mapnik/feature.hpp>
|
||||
#include <mapnik/feature_factory.hpp>
|
||||
|
@ -64,9 +65,9 @@ feature_ptr osm_featureset<filterT>::next()
|
|||
feature = feature_factory::create(ctx_, cur_item->id);
|
||||
double lat = static_cast<osm_node*>(cur_item)->lat;
|
||||
double lon = static_cast<osm_node*>(cur_item)->lon;
|
||||
geometry_type* point = new geometry_type(mapnik::geometry_type::types::Point);
|
||||
std::unique_ptr<geometry_type> point = std::make_unique<geometry_type>(mapnik::geometry_type::types::Point);
|
||||
point->move_to(lon, lat);
|
||||
feature->add_geometry(point);
|
||||
feature->add_geometry(point.release());
|
||||
}
|
||||
else if (dataset_->current_item_is_way())
|
||||
{
|
||||
|
@ -82,15 +83,12 @@ feature_ptr osm_featureset<filterT>::next()
|
|||
|
||||
if (!cur_item) return feature_ptr();
|
||||
feature = feature_factory::create(ctx_, cur_item->id);
|
||||
geometry_type* geom;
|
||||
mapnik::geometry_type::types geom_type = mapnik::geometry_type::types::LineString;
|
||||
if (static_cast<osm_way*>(cur_item)->is_polygon())
|
||||
{
|
||||
geom = new geometry_type(mapnik::geometry_type::types::Polygon);
|
||||
}
|
||||
else
|
||||
{
|
||||
geom = new geometry_type(mapnik::geometry_type::types::LineString);
|
||||
geom_type = mapnik::geometry_type::types::Polygon;
|
||||
}
|
||||
std::unique_ptr<geometry_type> geom = std::make_unique<geometry_type>(geom_type);
|
||||
|
||||
geom->move_to(static_cast<osm_way*>(cur_item)->nodes[0]->lon,
|
||||
static_cast<osm_way*>(cur_item)->nodes[0]->lat);
|
||||
|
@ -102,7 +100,7 @@ feature_ptr osm_featureset<filterT>::next()
|
|||
geom->line_to(static_cast<osm_way*>(cur_item)->nodes[count]->lon,
|
||||
static_cast<osm_way*>(cur_item)->nodes[count]->lat);
|
||||
}
|
||||
feature->add_geometry(geom);
|
||||
feature->add_geometry(geom.release());
|
||||
}
|
||||
else
|
||||
{
|
||||
|
|
|
@ -34,23 +34,21 @@ plugin_sources = Split(
|
|||
""" % locals()
|
||||
)
|
||||
|
||||
# Link Library to Dependencies
|
||||
cxxflags = []
|
||||
plugin_env['LIBS'] = []
|
||||
libraries = ['pq']
|
||||
|
||||
#if env['THREADING'] == 'multi':
|
||||
# libraries.append('boost_thread%s' % env['BOOST_APPEND'])
|
||||
|
||||
if env['RUNTIME_LINK'] == 'static':
|
||||
# pg_config does not seem to report correct deps of libpq
|
||||
# on os x so resort to hardcoding for now
|
||||
if env['PLATFORM'] == 'Darwin':
|
||||
libraries.extend(['ldap', 'pam', 'ssl', 'crypto', 'krb5'])
|
||||
# pkg-config is more reliable than pg_config across platforms
|
||||
cmd = 'pkg-config libpq --libs --static'
|
||||
try:
|
||||
plugin_env.ParseConfig(cmd)
|
||||
except OSError, e:
|
||||
plugin_env.Append(LIBS='pq')
|
||||
else:
|
||||
# TODO - parse back into libraries variable
|
||||
plugin_env.ParseConfig('pg_config --libs')
|
||||
if plugin_env['LIBS']:
|
||||
libraries.extend(copy(plugin_env['LIBS']))
|
||||
plugin_env.Append(LIBS='pq')
|
||||
|
||||
# Link Library to Dependencies
|
||||
libraries = copy(plugin_env['LIBS'])
|
||||
|
||||
if env['PLUGIN_LINKING'] == 'shared':
|
||||
libraries.insert(0,'mapnik')
|
||||
|
|
|
@ -77,32 +77,38 @@ public:
|
|||
}
|
||||
}
|
||||
|
||||
bool execute(std::string const& sql) const
|
||||
bool execute(std::string const& sql)
|
||||
{
|
||||
#ifdef MAPNIK_STATS
|
||||
mapnik::progress_timer __stats__(std::clog, std::string("postgis_connection::execute ") + sql);
|
||||
#endif
|
||||
|
||||
PGresult *result = PQexec(conn_, sql.c_str());
|
||||
if ( ! executeAsyncQuery(sql) ) return false;
|
||||
PGresult *result = 0;
|
||||
// fetch multiple times until NULL is returned,
|
||||
// to handle multi-statement queries
|
||||
while ( PGresult *tmp = getResult() ) {
|
||||
if ( result ) PQclear(result);
|
||||
result = tmp;
|
||||
}
|
||||
bool ok = (result && (PQresultStatus(result) == PGRES_COMMAND_OK));
|
||||
if ( result ) PQclear(result);
|
||||
return ok;
|
||||
}
|
||||
|
||||
std::shared_ptr<ResultSet> executeQuery(std::string const& sql, int type = 0) const
|
||||
std::shared_ptr<ResultSet> executeQuery(std::string const& sql, int type = 0)
|
||||
{
|
||||
#ifdef MAPNIK_STATS
|
||||
mapnik::progress_timer __stats__(std::clog, std::string("postgis_connection::execute_query ") + sql);
|
||||
#endif
|
||||
|
||||
PGresult* result = 0;
|
||||
if (type == 1)
|
||||
{
|
||||
result = PQexecParams(conn_,sql.c_str(), 0, 0, 0, 0, 0, 1);
|
||||
if ( executeAsyncQuery(sql, type) ) {
|
||||
// fetch multiple times until NULL is returned,
|
||||
// to handle multi-statement queries
|
||||
while ( PGresult *tmp = getResult() ) {
|
||||
if ( result ) PQclear(result);
|
||||
result = tmp;
|
||||
}
|
||||
else
|
||||
{
|
||||
result = PQexec(conn_, sql.c_str());
|
||||
}
|
||||
|
||||
if (! result || (PQresultStatus(result) != PGRES_TUPLES_OK))
|
||||
|
@ -112,10 +118,7 @@ public:
|
|||
err_msg += "\nin executeQuery Full sql was: '";
|
||||
err_msg += sql;
|
||||
err_msg += "'\n";
|
||||
if (result)
|
||||
{
|
||||
PQclear(result);
|
||||
}
|
||||
if ( result ) PQclear(result);
|
||||
throw mapnik::datasource_exception(err_msg);
|
||||
}
|
||||
|
||||
|
@ -163,10 +166,15 @@ public:
|
|||
return result;
|
||||
}
|
||||
|
||||
PGresult* getResult()
|
||||
{
|
||||
PGresult *result = PQgetResult(conn_);
|
||||
return result;
|
||||
}
|
||||
|
||||
std::shared_ptr<ResultSet> getNextAsyncResult()
|
||||
{
|
||||
PGresult *result = PQgetResult(conn_);
|
||||
PGresult *result = getResult();
|
||||
if( result && (PQresultStatus(result) != PGRES_TUPLES_OK))
|
||||
{
|
||||
std::string err_msg = "Postgis Plugin: ";
|
||||
|
@ -183,7 +191,7 @@ public:
|
|||
|
||||
std::shared_ptr<ResultSet> getAsyncResult()
|
||||
{
|
||||
PGresult *result = PQgetResult(conn_);
|
||||
PGresult *result = getResult();
|
||||
if ( !result || (PQresultStatus(result) != PGRES_TUPLES_OK))
|
||||
{
|
||||
std::string err_msg = "Postgis Plugin: ";
|
||||
|
|
|
@ -49,7 +49,7 @@
|
|||
|
||||
DATASOURCE_PLUGIN(postgis_datasource)
|
||||
|
||||
const double postgis_datasource::FMAX = std::numeric_limits<double>::max();
|
||||
const double postgis_datasource::FMAX = std::numeric_limits<float>::max();
|
||||
const std::string postgis_datasource::GEOMETRY_COLUMNS = "geometry_columns";
|
||||
const std::string postgis_datasource::SPATIAL_REF_SYS = "spatial_ref_system";
|
||||
|
||||
|
@ -445,11 +445,20 @@ postgis_datasource::~postgis_datasource()
|
|||
CnxPool_ptr pool = ConnectionManager::instance().getPool(creator_.id());
|
||||
if (pool)
|
||||
{
|
||||
try {
|
||||
shared_ptr<Connection> conn = pool->borrowObject();
|
||||
if (conn)
|
||||
{
|
||||
conn->close();
|
||||
}
|
||||
} catch (mapnik::datasource_exception const& ex) {
|
||||
// happens when borrowObject tries to
|
||||
// create a new connection and fails.
|
||||
// In turn, new connection would be needed
|
||||
// when our broke and was thus no good to
|
||||
// be borrowed
|
||||
// See https://github.com/mapnik/mapnik/issues/2191
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -1017,8 +1026,7 @@ boost::optional<mapnik::datasource::geometry_t> postgis_datasource::get_geometry
|
|||
}
|
||||
else // geometry
|
||||
{
|
||||
result.reset(mapnik::datasource::Collection);
|
||||
return result;
|
||||
g_type = "";
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -21,6 +21,7 @@
|
|||
*****************************************************************************/
|
||||
|
||||
// mapnik
|
||||
#include <mapnik/std.hpp>
|
||||
#include <mapnik/graphics.hpp>
|
||||
#include <mapnik/feature.hpp>
|
||||
#include <mapnik/agg_renderer.hpp>
|
||||
|
|
|
@ -84,8 +84,10 @@ void agg_renderer<T0,T1>::process(line_symbolizer const& sym,
|
|||
typedef agg::pixfmt_custom_blend_rgba<blender_type, agg::rendering_buffer> pixfmt_comp_type;
|
||||
typedef agg::renderer_base<pixfmt_comp_type> renderer_base;
|
||||
typedef boost::mpl::vector<clip_line_tag, transform_tag,
|
||||
offset_transform_tag, affine_transform_tag,
|
||||
simplify_tag, smooth_tag, dash_tag, stroke_tag> conv_types;
|
||||
affine_transform_tag,
|
||||
simplify_tag, smooth_tag,
|
||||
offset_transform_tag,
|
||||
dash_tag, stroke_tag> conv_types;
|
||||
|
||||
pixfmt_comp_type pixf(buf);
|
||||
pixf.comp_op(get<agg::comp_op_e>(sym, keys::comp_op, feature, agg::comp_op_src_over));
|
||||
|
|
|
@ -59,7 +59,8 @@ system = 'boost_system%s' % env['BOOST_APPEND']
|
|||
|
||||
# clear out and re-set libs for this env
|
||||
# note: order matters on linux: see lorder | tsort
|
||||
lib_env['LIBS'] = [filesystem,regex]
|
||||
lib_env['LIBS'] = [filesystem,
|
||||
regex]
|
||||
|
||||
if env['HAS_CAIRO']:
|
||||
lib_env.Append(LIBS=env['CAIRO_ALL_LIBS'])
|
||||
|
|
|
@ -20,6 +20,8 @@
|
|||
*
|
||||
*****************************************************************************/
|
||||
|
||||
#if defined(HAVE_CAIRO)
|
||||
|
||||
#include <mapnik/cairo_context.hpp>
|
||||
#include <mapnik/text/text_properties.hpp>
|
||||
#include <mapnik/font_set.hpp>
|
||||
|
@ -524,3 +526,7 @@ cairo_face_ptr cairo_face_manager::get_face(face_ptr face)
|
|||
}
|
||||
|
||||
}
|
||||
} //ns mapnik
|
||||
|
||||
#endif
|
||||
|
||||
|
|
|
@ -23,6 +23,7 @@
|
|||
#if defined(HAVE_CAIRO)
|
||||
|
||||
// mapnik
|
||||
#include <mapnik/std.hpp>
|
||||
#include <mapnik/rule.hpp>
|
||||
#include <mapnik/debug.hpp>
|
||||
#include <mapnik/layer.hpp>
|
||||
|
@ -334,8 +335,10 @@ void cairo_renderer_base::process(line_symbolizer const& sym,
|
|||
proj_transform const& prj_trans)
|
||||
{
|
||||
typedef boost::mpl::vector<clip_line_tag, transform_tag,
|
||||
offset_transform_tag, affine_transform_tag,
|
||||
simplify_tag, smooth_tag, dash_tag, stroke_tag> conv_types;
|
||||
affine_transform_tag,
|
||||
simplify_tag, smooth_tag,
|
||||
offset_transform_tag,
|
||||
dash_tag, stroke_tag> conv_types;
|
||||
cairo_save_restore guard(context_);
|
||||
composite_mode_e comp_op = get<composite_mode_e>(sym, keys::comp_op, feature, src_over);
|
||||
auto geom_transform = get_optional<transform_type>(sym, keys::geometry_transform);
|
||||
|
|
|
@ -20,6 +20,8 @@
|
|||
*
|
||||
*****************************************************************************/
|
||||
|
||||
#if defined(GRID_RENDERER)
|
||||
|
||||
// mapnik
|
||||
#include <mapnik/grid/grid.hpp>
|
||||
#include <mapnik/debug.hpp>
|
||||
|
@ -146,3 +148,5 @@ void hit_grid<T>::add_feature(mapnik::feature_impl & feature)
|
|||
template class hit_grid<mapnik::value_integer>;
|
||||
|
||||
}
|
||||
|
||||
#endif
|
||||
|
|
|
@ -20,6 +20,8 @@
|
|||
*
|
||||
*****************************************************************************/
|
||||
|
||||
#if defined(GRID_RENDERER)
|
||||
|
||||
// mapnik
|
||||
#include <mapnik/grid/grid_rasterizer.hpp>
|
||||
#include <mapnik/grid/grid_renderer.hpp>
|
||||
|
@ -201,3 +203,5 @@ void grid_renderer<T>::render_marker(mapnik::feature_impl & feature, unsigned in
|
|||
template class grid_renderer<grid>;
|
||||
|
||||
}
|
||||
|
||||
#endif
|
||||
|
|
|
@ -20,7 +20,10 @@
|
|||
*
|
||||
*****************************************************************************/
|
||||
|
||||
#if defined(GRID_RENDERER)
|
||||
|
||||
// mapnik
|
||||
#include <mapnik/std.hpp>
|
||||
#include <mapnik/feature.hpp>
|
||||
#include <mapnik/grid/grid_rasterizer.hpp>
|
||||
#include <mapnik/grid/grid_renderer.hpp>
|
||||
|
@ -99,3 +102,5 @@ template void grid_renderer<grid>::process(building_symbolizer const&,
|
|||
proj_transform const&);
|
||||
|
||||
}
|
||||
|
||||
#endif
|
||||
|
|
|
@ -20,6 +20,8 @@
|
|||
*
|
||||
*****************************************************************************/
|
||||
|
||||
#if defined(GRID_RENDERER)
|
||||
|
||||
// mapnik
|
||||
#include <mapnik/feature.hpp>
|
||||
#include <mapnik/grid/grid_rasterizer.hpp>
|
||||
|
@ -67,7 +69,6 @@ void grid_renderer<T>::process(line_pattern_symbolizer const& sym,
|
|||
double simplify_tolerance = get<value_double>(sym, keys::simplify_tolerance, feature, 0.0);
|
||||
double smooth = get<value_double>(sym, keys::smooth, feature, false);
|
||||
|
||||
typedef coord_transform<CoordTransform,geometry_type> path_type;
|
||||
typedef typename grid_renderer_base_type::pixfmt_type pixfmt_type;
|
||||
typedef typename grid_renderer_base_type::pixfmt_type::color_type color_type;
|
||||
typedef agg::renderer_scanline_bin_solid<grid_renderer_base_type> renderer_type;
|
||||
|
@ -148,3 +149,6 @@ template void grid_renderer<grid>::process(line_pattern_symbolizer const&,
|
|||
proj_transform const&);
|
||||
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
|
|
|
@ -20,6 +20,8 @@
|
|||
*
|
||||
*****************************************************************************/
|
||||
|
||||
#if defined(GRID_RENDERER)
|
||||
|
||||
// mapnik
|
||||
#include <mapnik/feature.hpp>
|
||||
#include <mapnik/grid/grid_rasterizer.hpp>
|
||||
|
@ -122,3 +124,5 @@ template void grid_renderer<grid>::process(line_symbolizer const&,
|
|||
proj_transform const&);
|
||||
|
||||
}
|
||||
|
||||
#endif
|
||||
|
|
|
@ -20,6 +20,8 @@
|
|||
*
|
||||
*****************************************************************************/
|
||||
|
||||
#if defined(GRID_RENDERER)
|
||||
|
||||
/*
|
||||
|
||||
porting notes -->
|
||||
|
@ -151,3 +153,5 @@ template void grid_renderer<grid>::process(markers_symbolizer const&,
|
|||
mapnik::feature_impl &,
|
||||
proj_transform const&);
|
||||
}
|
||||
|
||||
#endif
|
||||
|
|
|
@ -20,6 +20,8 @@
|
|||
*
|
||||
*****************************************************************************/
|
||||
|
||||
#if defined(GRID_RENDERER)
|
||||
|
||||
// mapnik
|
||||
#include <mapnik/feature.hpp>
|
||||
#include <mapnik/grid/grid_rasterizer.hpp>
|
||||
|
@ -71,3 +73,5 @@ template void grid_renderer<grid>::process(point_symbolizer const&,
|
|||
proj_transform const&);
|
||||
|
||||
}
|
||||
|
||||
#endif
|
||||
|
|
|
@ -20,6 +20,8 @@
|
|||
*
|
||||
*****************************************************************************/
|
||||
|
||||
#if defined(GRID_RENDERER)
|
||||
|
||||
// boost
|
||||
|
||||
|
||||
|
@ -118,3 +120,6 @@ template void grid_renderer<grid>::process(polygon_pattern_symbolizer const&,
|
|||
proj_transform const&);
|
||||
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
|
|
|
@ -20,6 +20,8 @@
|
|||
*
|
||||
*****************************************************************************/
|
||||
|
||||
#if defined(GRID_RENDERER)
|
||||
|
||||
// boost
|
||||
|
||||
|
||||
|
@ -85,3 +87,5 @@ template void grid_renderer<grid>::process(polygon_symbolizer const&,
|
|||
proj_transform const&);
|
||||
|
||||
}
|
||||
|
||||
#endif
|
||||
|
|
|
@ -20,6 +20,8 @@
|
|||
*
|
||||
*****************************************************************************/
|
||||
|
||||
#if defined(GRID_RENDERER)
|
||||
|
||||
// mapnik
|
||||
#include <mapnik/feature.hpp>
|
||||
#include <mapnik/debug.hpp>
|
||||
|
@ -41,3 +43,5 @@ template void grid_renderer<grid>::process(raster_symbolizer const&,
|
|||
proj_transform const&);
|
||||
|
||||
}
|
||||
|
||||
#endif
|
||||
|
|
|
@ -21,6 +21,8 @@
|
|||
*
|
||||
*****************************************************************************/
|
||||
|
||||
#if defined(GRID_RENDERER)
|
||||
|
||||
// mapnik
|
||||
#include <mapnik/feature.hpp>
|
||||
#include <mapnik/grid/grid_rasterizer.hpp>
|
||||
|
@ -84,3 +86,5 @@ template void grid_renderer<grid>::process(shield_symbolizer const&,
|
|||
proj_transform const&);
|
||||
|
||||
}
|
||||
|
||||
#endif
|
||||
|
|
|
@ -20,6 +20,8 @@
|
|||
*
|
||||
*****************************************************************************/
|
||||
|
||||
#if defined(GRID_RENDERER)
|
||||
|
||||
// mapnik
|
||||
#include <mapnik/feature.hpp>
|
||||
#include <mapnik/grid/grid_renderer.hpp>
|
||||
|
@ -68,3 +70,4 @@ template void grid_renderer<grid>::process(text_symbolizer const&,
|
|||
|
||||
}
|
||||
|
||||
#endif
|
||||
|
|
|
@ -20,6 +20,8 @@
|
|||
*
|
||||
*****************************************************************************/
|
||||
|
||||
#if defined(SVG_RENDERER)
|
||||
|
||||
// mapnik
|
||||
#include <mapnik/svg/output/svg_renderer.hpp>
|
||||
|
||||
|
@ -37,3 +39,5 @@ template void svg_renderer<std::ostream_iterator<char> >::process(building_symbo
|
|||
mapnik::feature_impl & feature,
|
||||
proj_transform const& prj_trans);
|
||||
}
|
||||
|
||||
#endif
|
||||
|
|
|
@ -20,6 +20,8 @@
|
|||
*
|
||||
*****************************************************************************/
|
||||
|
||||
#if defined(SVG_RENDERER)
|
||||
|
||||
// mapnik
|
||||
#include <mapnik/svg/output/svg_renderer.hpp>
|
||||
|
||||
|
@ -37,3 +39,5 @@ template void svg_renderer<std::ostream_iterator<char> >::process(line_pattern_s
|
|||
mapnik::feature_impl & feature,
|
||||
proj_transform const& prj_trans);
|
||||
}
|
||||
|
||||
#endif
|
||||
|
|
|
@ -20,6 +20,8 @@
|
|||
*
|
||||
*****************************************************************************/
|
||||
|
||||
#if defined(SVG_RENDERER)
|
||||
|
||||
// mapnik
|
||||
#include <mapnik/svg/output/svg_renderer.hpp>
|
||||
|
||||
|
@ -48,3 +50,6 @@ template void svg_renderer<std::ostream_iterator<char> >::process(line_symbolize
|
|||
mapnik::feature_impl & feature,
|
||||
proj_transform const& prj_trans);
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
|
|
|
@ -20,6 +20,8 @@
|
|||
*
|
||||
*****************************************************************************/
|
||||
|
||||
#if defined(SVG_RENDERER)
|
||||
|
||||
// mapnik
|
||||
#include <mapnik/svg/output/svg_renderer.hpp>
|
||||
|
||||
|
@ -37,3 +39,5 @@ template void svg_renderer<std::ostream_iterator<char> >::process(markers_symbol
|
|||
mapnik::feature_impl & feature,
|
||||
proj_transform const& prj_trans);
|
||||
}
|
||||
|
||||
#endif
|
||||
|
|
|
@ -20,6 +20,8 @@
|
|||
*
|
||||
*****************************************************************************/
|
||||
|
||||
#if defined(SVG_RENDERER)
|
||||
|
||||
// mapnik
|
||||
#include <mapnik/svg/output/svg_renderer.hpp>
|
||||
|
||||
|
@ -37,3 +39,5 @@ template void svg_renderer<std::ostream_iterator<char> >::process(point_symboliz
|
|||
mapnik::feature_impl & feature,
|
||||
proj_transform const& prj_trans);
|
||||
}
|
||||
|
||||
#endif
|
||||
|
|
|
@ -20,6 +20,8 @@
|
|||
*
|
||||
*****************************************************************************/
|
||||
|
||||
#if defined(SVG_RENDERER)
|
||||
|
||||
// mapnik
|
||||
#include <mapnik/svg/output/svg_renderer.hpp>
|
||||
|
||||
|
@ -37,3 +39,5 @@ template void svg_renderer<std::ostream_iterator<char> >::process(polygon_patter
|
|||
mapnik::feature_impl & feature,
|
||||
proj_transform const& prj_trans);
|
||||
}
|
||||
|
||||
#endif
|
||||
|
|
|
@ -20,6 +20,8 @@
|
|||
*
|
||||
*****************************************************************************/
|
||||
|
||||
#if defined(SVG_RENDERER)
|
||||
|
||||
// mapnik
|
||||
#include <mapnik/svg/output/svg_renderer.hpp>
|
||||
|
||||
|
@ -41,3 +43,5 @@ template void svg_renderer<std::ostream_iterator<char> >::process(polygon_symbol
|
|||
mapnik::feature_impl & feature,
|
||||
proj_transform const& prj_trans);
|
||||
}
|
||||
|
||||
#endif
|
||||
|
|
|
@ -20,6 +20,8 @@
|
|||
*
|
||||
*****************************************************************************/
|
||||
|
||||
#if defined(SVG_RENDERER)
|
||||
|
||||
// mapnik
|
||||
#include <mapnik/svg/output/svg_renderer.hpp>
|
||||
|
||||
|
@ -37,3 +39,5 @@ template void svg_renderer<std::ostream_iterator<char> >::process(raster_symboli
|
|||
mapnik::feature_impl & feature,
|
||||
proj_transform const& prj_trans);
|
||||
}
|
||||
|
||||
#endif
|
||||
|
|
|
@ -20,6 +20,8 @@
|
|||
*
|
||||
*****************************************************************************/
|
||||
|
||||
#if defined(SVG_RENDERER)
|
||||
|
||||
// mapnik
|
||||
#include <mapnik/svg/output/svg_renderer.hpp>
|
||||
|
||||
|
@ -37,3 +39,5 @@ template void svg_renderer<std::ostream_iterator<char> >::process(shield_symboli
|
|||
mapnik::feature_impl & feature,
|
||||
proj_transform const& prj_trans);
|
||||
}
|
||||
|
||||
#endif
|
||||
|
|
|
@ -20,6 +20,8 @@
|
|||
*
|
||||
*****************************************************************************/
|
||||
|
||||
#if defined(SVG_RENDERER)
|
||||
|
||||
// mapnik
|
||||
#include <mapnik/svg/output/svg_renderer.hpp>
|
||||
|
||||
|
@ -91,3 +93,6 @@ template bool svg_renderer<std::ostream_iterator<char> >::process(rule::symboliz
|
|||
proj_transform const& prj_trans);
|
||||
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
|
|
|
@ -20,6 +20,8 @@
|
|||
*
|
||||
*****************************************************************************/
|
||||
|
||||
#if defined(SVG_RENDERER)
|
||||
|
||||
// mapnik
|
||||
#include <mapnik/svg/output/svg_renderer.hpp>
|
||||
|
||||
|
@ -37,3 +39,5 @@ template void svg_renderer<std::ostream_iterator<char> >::process(text_symbolize
|
|||
mapnik::feature_impl & feature,
|
||||
proj_transform const& prj_trans);
|
||||
}
|
||||
|
||||
#endif
|
||||
|
|
|
@ -20,6 +20,8 @@
|
|||
*
|
||||
*****************************************************************************/
|
||||
|
||||
#if defined(SVG_RENDERER)
|
||||
|
||||
// mapnik
|
||||
#include <mapnik/svg/output/svg_generator.hpp>
|
||||
#include <mapnik/geometry.hpp>
|
||||
|
@ -109,3 +111,6 @@ namespace mapnik { namespace svg {
|
|||
|
||||
template class svg_generator<std::ostream_iterator<char> >;
|
||||
}}
|
||||
|
||||
#endif
|
||||
|
||||
|
|
|
@ -21,6 +21,8 @@
|
|||
*
|
||||
*****************************************************************************/
|
||||
|
||||
#if defined(SVG_RENDERER)
|
||||
|
||||
// mapnik
|
||||
#include <mapnik/svg/output/svg_output_attributes.hpp>
|
||||
|
||||
|
@ -288,3 +290,6 @@ namespace mapnik { namespace svg {
|
|||
svg_namespace_url_ = SVG_NAMESPACE_URL;
|
||||
}
|
||||
}}
|
||||
|
||||
#endif
|
||||
|
||||
|
|
|
@ -20,6 +20,8 @@
|
|||
*
|
||||
*****************************************************************************/
|
||||
|
||||
#if defined(SVG_RENDERER)
|
||||
|
||||
// mapnik
|
||||
#include <mapnik/debug.hpp>
|
||||
#include <mapnik/svg/output/svg_renderer.hpp>
|
||||
|
@ -102,3 +104,5 @@ void svg_renderer<T>::end_layer_processing(layer const& lay)
|
|||
|
||||
template class svg_renderer<std::ostream_iterator<char> >;
|
||||
}
|
||||
|
||||
#endif
|
||||
|
|
|
@ -21,6 +21,7 @@
|
|||
*****************************************************************************/
|
||||
|
||||
// mapnik
|
||||
#include <mapnik/std.hpp>
|
||||
#include <mapnik/debug.hpp>
|
||||
#include <mapnik/image_reader.hpp>
|
||||
|
||||
|
@ -165,7 +166,7 @@ webp_reader<T>::webp_reader(std::string const& filename)
|
|||
std::size_t file_size = end - beg;
|
||||
file.seekg (0, std::ios::beg);
|
||||
|
||||
std::unique_ptr<buffer_policy_type> buffer(new buffer_policy_type(file_size));
|
||||
auto buffer = std::make_unique<buffer_policy_type>(file_size);
|
||||
file.read(reinterpret_cast<char*>(buffer->data()), buffer->size());
|
||||
if (!file)
|
||||
{
|
||||
|
|
161
src/wkb.cpp
|
@ -21,6 +21,7 @@
|
|||
*****************************************************************************/
|
||||
|
||||
// mapnik
|
||||
#include <mapnik/std.hpp>
|
||||
#include <mapnik/debug.hpp>
|
||||
#include <mapnik/global.hpp>
|
||||
#include <mapnik/wkb.hpp>
|
||||
|
@ -62,13 +63,30 @@ public:
|
|||
wkbMultiLineString=5,
|
||||
wkbMultiPolygon=6,
|
||||
wkbGeometryCollection=7,
|
||||
// Z
|
||||
wkbPointZ=1001,
|
||||
wkbLineStringZ=1002,
|
||||
wkbPolygonZ=1003,
|
||||
wkbMultiPointZ=1004,
|
||||
wkbMultiLineStringZ=1005,
|
||||
wkbMultiPolygonZ=1006,
|
||||
wkbGeometryCollectionZ=1007
|
||||
wkbGeometryCollectionZ=1007,
|
||||
// M
|
||||
wkbPointM=2001,
|
||||
wkbLineStringM=2002,
|
||||
wkbPolygonM=2003,
|
||||
wkbMultiPointM=2004,
|
||||
wkbMultiLineStringM=2005,
|
||||
wkbMultiPolygonM=2006,
|
||||
wkbGeometryCollectionM=2007,
|
||||
// ZM
|
||||
wkbPointZM=3001,
|
||||
wkbLineStringZM=3002,
|
||||
wkbPolygonZM=3003,
|
||||
wkbMultiPointZM=3004,
|
||||
wkbMultiLineStringZM=3005,
|
||||
wkbMultiPolygonZM=3006,
|
||||
wkbGeometryCollectionZM=3007
|
||||
};
|
||||
|
||||
wkb_reader(const char* wkb, std::size_t size, wkbFormat format)
|
||||
|
@ -142,24 +160,50 @@ public:
|
|||
read_collection(paths);
|
||||
break;
|
||||
case wkbPointZ:
|
||||
case wkbPointM:
|
||||
read_point_xyz(paths);
|
||||
break;
|
||||
case wkbPointZM:
|
||||
read_point_xyzm(paths);
|
||||
break;
|
||||
case wkbLineStringZ:
|
||||
case wkbLineStringM:
|
||||
read_linestring_xyz(paths);
|
||||
break;
|
||||
case wkbLineStringZM:
|
||||
read_linestring_xyzm(paths);
|
||||
break;
|
||||
case wkbPolygonZ:
|
||||
case wkbPolygonM:
|
||||
read_polygon_xyz(paths);
|
||||
break;
|
||||
case wkbPolygonZM:
|
||||
read_polygon_xyzm(paths);
|
||||
break;
|
||||
case wkbMultiPointZ:
|
||||
case wkbMultiPointM:
|
||||
read_multipoint_xyz(paths);
|
||||
break;
|
||||
case wkbMultiPointZM:
|
||||
read_multipoint_xyzm(paths);
|
||||
break;
|
||||
case wkbMultiLineStringZ:
|
||||
case wkbMultiLineStringM:
|
||||
read_multilinestring_xyz(paths);
|
||||
break;
|
||||
case wkbMultiLineStringZM:
|
||||
read_multilinestring_xyzm(paths);
|
||||
break;
|
||||
case wkbMultiPolygonZ:
|
||||
case wkbMultiPolygonM:
|
||||
read_multipolygon_xyz(paths);
|
||||
break;
|
||||
case wkbMultiPolygonZM:
|
||||
read_multipolygon_xyzm(paths);
|
||||
break;
|
||||
case wkbGeometryCollectionZ:
|
||||
case wkbGeometryCollectionM:
|
||||
case wkbGeometryCollectionZM:
|
||||
read_collection(paths);
|
||||
break;
|
||||
default:
|
||||
|
@ -245,12 +289,33 @@ private:
|
|||
}
|
||||
}
|
||||
|
||||
void read_coords_xyzm(CoordinateArray& ar)
|
||||
{
|
||||
if (! needSwap_)
|
||||
{
|
||||
for (unsigned i = 0; i < ar.size(); ++i)
|
||||
{
|
||||
read_double_ndr(wkb_ + pos_, ar[i].x);
|
||||
read_double_ndr(wkb_ + pos_ + 8, ar[i].y);
|
||||
pos_ += 32; // skip XYZM
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
for (unsigned i = 0; i < ar.size(); ++i)
|
||||
{
|
||||
read_double_xdr(wkb_ + pos_, ar[i].x);
|
||||
read_double_xdr(wkb_ + pos_ + 8, ar[i].y);
|
||||
pos_ += 32; // skip XYZM
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void read_point(boost::ptr_vector<geometry_type> & paths)
|
||||
{
|
||||
double x = read_double();
|
||||
double y = read_double();
|
||||
std::unique_ptr<geometry_type> pt(new geometry_type(geometry_type::types::Point));
|
||||
auto pt = std::make_unique<geometry_type>(geometry_type::types::Point);
|
||||
pt->move_to(x, y);
|
||||
paths.push_back(pt.release());
|
||||
}
|
||||
|
@ -269,12 +334,22 @@ private:
|
|||
{
|
||||
double x = read_double();
|
||||
double y = read_double();
|
||||
std::unique_ptr<geometry_type> pt(new geometry_type(geometry_type::types::Point));
|
||||
auto pt = std::make_unique<geometry_type>(geometry_type::types::Point);
|
||||
pos_ += 8; // double z = read_double();
|
||||
pt->move_to(x, y);
|
||||
paths.push_back(pt.release());
|
||||
}
|
||||
|
||||
void read_point_xyzm(boost::ptr_vector<geometry_type> & paths)
|
||||
{
|
||||
double x = read_double();
|
||||
double y = read_double();
|
||||
std::auto_ptr<geometry_type> pt(new geometry_type(geometry_type::types::Point));
|
||||
pos_ += 16;
|
||||
pt->move_to(x, y);
|
||||
paths.push_back(pt);
|
||||
}
|
||||
|
||||
void read_multipoint_xyz(boost::ptr_vector<geometry_type> & paths)
|
||||
{
|
||||
int num_points = read_integer();
|
||||
|
@ -285,6 +360,16 @@ private:
|
|||
}
|
||||
}
|
||||
|
||||
void read_multipoint_xyzm(boost::ptr_vector<geometry_type> & paths)
|
||||
{
|
||||
int num_points = read_integer();
|
||||
for (int i = 0; i < num_points; ++i)
|
||||
{
|
||||
pos_ += 5;
|
||||
read_point_xyzm(paths);
|
||||
}
|
||||
}
|
||||
|
||||
void read_linestring(boost::ptr_vector<geometry_type> & paths)
|
||||
{
|
||||
int num_points = read_integer();
|
||||
|
@ -292,7 +377,7 @@ private:
|
|||
{
|
||||
CoordinateArray ar(num_points);
|
||||
read_coords(ar);
|
||||
std::unique_ptr<geometry_type> line(new geometry_type(geometry_type::types::LineString));
|
||||
auto line = std::make_unique<geometry_type>(geometry_type::types::LineString);
|
||||
line->move_to(ar[0].x, ar[0].y);
|
||||
for (int i = 1; i < num_points; ++i)
|
||||
{
|
||||
|
@ -319,7 +404,7 @@ private:
|
|||
{
|
||||
CoordinateArray ar(num_points);
|
||||
read_coords_xyz(ar);
|
||||
std::unique_ptr<geometry_type> line(new geometry_type(geometry_type::types::LineString));
|
||||
auto line = std::make_unique<geometry_type>(geometry_type::types::LineString);
|
||||
line->move_to(ar[0].x, ar[0].y);
|
||||
for (int i = 1; i < num_points; ++i)
|
||||
{
|
||||
|
@ -329,6 +414,23 @@ private:
|
|||
}
|
||||
}
|
||||
|
||||
void read_linestring_xyzm(boost::ptr_vector<geometry_type> & paths)
|
||||
{
|
||||
int num_points = read_integer();
|
||||
if (num_points > 0)
|
||||
{
|
||||
CoordinateArray ar(num_points);
|
||||
read_coords_xyzm(ar);
|
||||
std::auto_ptr<geometry_type> line(new geometry_type(geometry_type::types::LineString));
|
||||
line->move_to(ar[0].x, ar[0].y);
|
||||
for (int i = 1; i < num_points; ++i)
|
||||
{
|
||||
line->line_to(ar[i].x, ar[i].y);
|
||||
}
|
||||
paths.push_back(line);
|
||||
}
|
||||
}
|
||||
|
||||
void read_multilinestring_xyz(boost::ptr_vector<geometry_type> & paths)
|
||||
{
|
||||
int num_lines = read_integer();
|
||||
|
@ -339,13 +441,22 @@ private:
|
|||
}
|
||||
}
|
||||
|
||||
void read_multilinestring_xyzm(boost::ptr_vector<geometry_type> & paths)
|
||||
{
|
||||
int num_lines = read_integer();
|
||||
for (int i = 0; i < num_lines; ++i)
|
||||
{
|
||||
pos_ += 5;
|
||||
read_linestring_xyzm(paths);
|
||||
}
|
||||
}
|
||||
|
||||
void read_polygon(boost::ptr_vector<geometry_type> & paths)
|
||||
{
|
||||
int num_rings = read_integer();
|
||||
if (num_rings > 0)
|
||||
{
|
||||
std::unique_ptr<geometry_type> poly(new geometry_type(geometry_type::types::Polygon));
|
||||
auto poly = std::make_unique<geometry_type>(geometry_type::types::Polygon);
|
||||
for (int i = 0; i < num_rings; ++i)
|
||||
{
|
||||
int num_points = read_integer();
|
||||
|
@ -381,7 +492,7 @@ private:
|
|||
int num_rings = read_integer();
|
||||
if (num_rings > 0)
|
||||
{
|
||||
std::unique_ptr<geometry_type> poly(new geometry_type(geometry_type::types::Polygon));
|
||||
auto poly = std::make_unique<geometry_type>(geometry_type::types::Polygon);
|
||||
for (int i = 0; i < num_rings; ++i)
|
||||
{
|
||||
int num_points = read_integer();
|
||||
|
@ -402,6 +513,32 @@ private:
|
|||
}
|
||||
}
|
||||
|
||||
void read_polygon_xyzm(boost::ptr_vector<geometry_type> & paths)
|
||||
{
|
||||
int num_rings = read_integer();
|
||||
if (num_rings > 0)
|
||||
{
|
||||
std::auto_ptr<geometry_type> poly(new geometry_type(geometry_type::types::Polygon));
|
||||
for (int i = 0; i < num_rings; ++i)
|
||||
{
|
||||
int num_points = read_integer();
|
||||
if (num_points > 0)
|
||||
{
|
||||
CoordinateArray ar(num_points);
|
||||
read_coords_xyzm(ar);
|
||||
poly->move_to(ar[0].x, ar[0].y);
|
||||
for (int j = 1; j < num_points; ++j)
|
||||
{
|
||||
poly->line_to(ar[j].x, ar[j].y);
|
||||
}
|
||||
poly->close_path();
|
||||
}
|
||||
}
|
||||
if (poly->size() > 2) // ignore if polygon has less than 3 vertices
|
||||
paths.push_back(poly);
|
||||
}
|
||||
}
|
||||
|
||||
void read_multipolygon_xyz(boost::ptr_vector<geometry_type> & paths)
|
||||
{
|
||||
int num_polys = read_integer();
|
||||
|
@ -412,6 +549,16 @@ private:
|
|||
}
|
||||
}
|
||||
|
||||
void read_multipolygon_xyzm(boost::ptr_vector<geometry_type> & paths)
|
||||
{
|
||||
int num_polys = read_integer();
|
||||
for (int i = 0; i < num_polys; ++i)
|
||||
{
|
||||
pos_ += 5;
|
||||
read_polygon_xyzm(paths);
|
||||
}
|
||||
}
|
||||
|
||||
void read_collection(boost::ptr_vector<geometry_type> & paths)
|
||||
{
|
||||
int num_geometries = read_integer();
|
||||
|
|
|
@ -20,6 +20,7 @@
|
|||
#include <mapnik/symbolizer.hpp>
|
||||
#include <vector>
|
||||
#include <algorithm>
|
||||
#include <mapnik/std.hpp>
|
||||
|
||||
#include "utils.hpp"
|
||||
|
||||
|
@ -43,9 +44,9 @@ int main(int argc, char** argv)
|
|||
mapnik::transcoder tr("utf-8");
|
||||
mapnik::value_unicode_string ustr = tr.transcode("hello world!");
|
||||
feature->put("name",ustr);
|
||||
mapnik::geometry_type * pt = new mapnik::geometry_type(mapnik::geometry_type::types::Point);
|
||||
auto pt = std::make_unique<mapnik::geometry_type>(mapnik::geometry_type::types::Point);
|
||||
pt->move_to(128,128);
|
||||
feature->add_geometry(pt);
|
||||
feature->add_geometry(pt.release());
|
||||
std::shared_ptr<mapnik::memory_datasource> ds = std::make_shared<mapnik::memory_datasource>();
|
||||
ds->push(feature);
|
||||
mapnik::Map m(256,256);
|
||||
|
|
Before Width: | Height: | Size: 47 KiB After Width: | Height: | Size: 47 KiB |
Before Width: | Height: | Size: 17 KiB After Width: | Height: | Size: 17 KiB |
|
@ -164,6 +164,34 @@ INSERT INTO test11(label,geom) values ('label_7',GeomFromEWKT('SRID=4326;MULTIPO
|
|||
INSERT INTO test11(label,geom) values ('label_8',GeomFromEWKT('SRID=4326;GEOMETRYCOLLECTION(POLYGON((1 1, 2 1, 2 2, 1 2,1 1)),POINT(2 3),LINESTRING(2 3,3 4))'));
|
||||
"""
|
||||
|
||||
insert_table_12 = """
|
||||
CREATE TABLE test12(gid serial PRIMARY KEY, name varchar(40), geom geometry);
|
||||
INSERT INTO test12(name,geom) values ('Point',GeomFromEWKT('SRID=4326;POINT(0 0)'));
|
||||
INSERT INTO test12(name,geom) values ('PointZ',GeomFromEWKT('SRID=4326;POINTZ(0 0 0)'));
|
||||
INSERT INTO test12(name,geom) values ('PointM',GeomFromEWKT('SRID=4326;POINTM(0 0 0)'));
|
||||
INSERT INTO test12(name,geom) values ('PointZM',GeomFromEWKT('SRID=4326;POINTZM(0 0 0 0)'));
|
||||
INSERT INTO test12(name,geom) values ('MultiPoint',GeomFromEWKT('SRID=4326;MULTIPOINT(0 0, 1 1)'));
|
||||
INSERT INTO test12(name,geom) values ('MultiPointZ',GeomFromEWKT('SRID=4326;MULTIPOINTZ(0 0 0, 1 1 1)'));
|
||||
INSERT INTO test12(name,geom) values ('MultiPointM',GeomFromEWKT('SRID=4326;MULTIPOINTM(0 0 0, 1 1 1)'));
|
||||
INSERT INTO test12(name,geom) values ('MultiPointZM',GeomFromEWKT('SRID=4326;MULTIPOINTZM(0 0 0 0, 1 1 1 1)'));
|
||||
INSERT INTO test12(name,geom) values ('LineString',GeomFromEWKT('SRID=4326;LINESTRING(0 0, 1 1)'));
|
||||
INSERT INTO test12(name,geom) values ('LineStringZ',GeomFromEWKT('SRID=4326;LINESTRINGZ(0 0 0, 1 1 1)'));
|
||||
INSERT INTO test12(name,geom) values ('LineStringM',GeomFromEWKT('SRID=4326;LINESTRINGM(0 0 0, 1 1 1)'));
|
||||
INSERT INTO test12(name,geom) values ('LineStringZM',GeomFromEWKT('SRID=4326;LINESTRINGZM(0 0 0 0, 1 1 1 1)'));
|
||||
INSERT INTO test12(name,geom) values ('Polygon',GeomFromEWKT('SRID=4326;POLYGON((0 0, 1 1, 2 2, 0 0))'));
|
||||
INSERT INTO test12(name,geom) values ('PolygonZ',GeomFromEWKT('SRID=4326;POLYGONZ((0 0 0, 1 1 1, 2 2 2, 0 0 0))'));
|
||||
INSERT INTO test12(name,geom) values ('PolygonM',GeomFromEWKT('SRID=4326;POLYGONZ((0 0 0, 1 1 1, 2 2 2, 0 0 0))'));
|
||||
INSERT INTO test12(name,geom) values ('PolygonZM',GeomFromEWKT('SRID=4326;POLYGONZM((0 0 0 0, 1 1 1 1, 2 2 2 2, 0 0 0 0))'));
|
||||
INSERT INTO test12(name,geom) values ('MultiLineString',GeomFromEWKT('SRID=4326;MULTILINESTRING((0 0, 1 1),(2 2, 3 3))'));
|
||||
INSERT INTO test12(name,geom) values ('MultiLineStringZ',GeomFromEWKT('SRID=4326;MULTILINESTRINGZ((0 0 0, 1 1 1),(2 2 2, 3 3 3))'));
|
||||
INSERT INTO test12(name,geom) values ('MultiLineStringM',GeomFromEWKT('SRID=4326;MULTILINESTRINGM((0 0 0, 1 1 1),(2 2 2, 3 3 3))'));
|
||||
INSERT INTO test12(name,geom) values ('MultiLineStringZM',GeomFromEWKT('SRID=4326;MULTILINESTRINGZM((0 0 0 0, 1 1 1 1),(2 2 2 2, 3 3 3 3))'));
|
||||
INSERT INTO test12(name,geom) values ('MultiPolygon',GeomFromEWKT('SRID=4326;MULTIPOLYGON(((0 0, 1 1, 2 2, 0 0)),((0 0, 1 1, 2 2, 0 0)))'));
|
||||
INSERT INTO test12(name,geom) values ('MultiPolygonZ',GeomFromEWKT('SRID=4326;MULTIPOLYGONZ(((0 0 0, 1 1 1, 2 2 2, 0 0 0)),((0 0 0, 1 1 1, 2 2 2, 0 0 0)))'));
|
||||
INSERT INTO test12(name,geom) values ('MultiPolygonM',GeomFromEWKT('SRID=4326;MULTIPOLYGONM(((0 0 0, 1 1 1, 2 2 2, 0 0 0)),((0 0 0, 1 1 1, 2 2 2, 0 0 0)))'));
|
||||
INSERT INTO test12(name,geom) values ('MultiPolygonZM',GeomFromEWKT('SRID=4326;MULTIPOLYGONZM(((0 0 0 0, 1 1 1 1, 2 2 2 2, 0 0 0 0)),((0 0 0 0, 1 1 1 1, 2 2 2 2, 0 0 0 0)))'));
|
||||
"""
|
||||
|
||||
|
||||
def postgis_setup():
|
||||
call('dropdb %s' % MAPNIK_TEST_DBNAME,silent=True)
|
||||
|
@ -182,6 +210,7 @@ def postgis_setup():
|
|||
call('''psql -q %s -c "%s"''' % (MAPNIK_TEST_DBNAME,insert_table_9),silent=False)
|
||||
call('''psql -q %s -c "%s"''' % (MAPNIK_TEST_DBNAME,insert_table_10),silent=False)
|
||||
call('''psql -q %s -c "%s"''' % (MAPNIK_TEST_DBNAME,insert_table_11),silent=False)
|
||||
call('''psql -q %s -c "%s"''' % (MAPNIK_TEST_DBNAME,insert_table_12),silent=False)
|
||||
|
||||
def postgis_takedown():
|
||||
pass
|
||||
|
@ -757,6 +786,231 @@ if 'postgis' in mapnik.DatasourceCache.plugin_names() \
|
|||
# This used to raise an exception before correction of issue 2042
|
||||
mapnik.render_to_file(map2,'world2.png', 'png')
|
||||
|
||||
def test_handling_of_zm_dimensions():
|
||||
ds = mapnik.PostGIS(dbname=MAPNIK_TEST_DBNAME,
|
||||
table='(select gid,ST_CoordDim(geom) as dim,name,geom from test12) as tmp',
|
||||
geometry_field='geom')
|
||||
eq_(len(ds.fields()),3)
|
||||
eq_(ds.fields(),['gid', 'dim', 'name'])
|
||||
eq_(ds.field_types(),['int', 'int', 'str'])
|
||||
fs = ds.featureset()
|
||||
# Point (2d)
|
||||
feat = fs.next()
|
||||
eq_(feat.id(),1)
|
||||
eq_(feat['gid'],1)
|
||||
eq_(feat['dim'],2)
|
||||
eq_(feat['name'],'Point')
|
||||
geoms = feat.geometries()
|
||||
eq_(len(geoms),1)
|
||||
eq_(geoms[0].to_wkt(),'Point(0 0)')
|
||||
# PointZ
|
||||
feat = fs.next()
|
||||
eq_(feat.id(),2)
|
||||
eq_(feat['gid'],2)
|
||||
eq_(feat['dim'],3)
|
||||
eq_(feat['name'],'PointZ')
|
||||
geoms = feat.geometries()
|
||||
eq_(len(geoms),1)
|
||||
eq_(geoms[0].to_wkt(),'Point(0 0)')
|
||||
# PointM
|
||||
feat = fs.next()
|
||||
eq_(feat.id(),3)
|
||||
eq_(feat['gid'],3)
|
||||
eq_(feat['dim'],3)
|
||||
eq_(feat['name'],'PointM')
|
||||
geoms = feat.geometries()
|
||||
eq_(len(geoms),1)
|
||||
eq_(geoms[0].to_wkt(),'Point(0 0)')
|
||||
# PointZM
|
||||
feat = fs.next()
|
||||
eq_(feat.id(),4)
|
||||
eq_(feat['gid'],4)
|
||||
eq_(feat['dim'],4)
|
||||
eq_(feat['name'],'PointZM')
|
||||
geoms = feat.geometries()
|
||||
eq_(len(geoms),1)
|
||||
eq_(geoms[0].to_wkt(),'Point(0 0)')
|
||||
# MultiPoint
|
||||
feat = fs.next()
|
||||
eq_(feat.id(),5)
|
||||
eq_(feat['gid'],5)
|
||||
eq_(feat['dim'],2)
|
||||
eq_(feat['name'],'MultiPoint')
|
||||
geoms = feat.geometries()
|
||||
eq_(len(geoms),2)
|
||||
eq_(geoms[0].to_wkt(),'Point(0 0)')
|
||||
eq_(geoms[1].to_wkt(),'Point(1 1)')
|
||||
# MultiPointZ
|
||||
feat = fs.next()
|
||||
eq_(feat.id(),6)
|
||||
eq_(feat['gid'],6)
|
||||
eq_(feat['dim'],3)
|
||||
eq_(feat['name'],'MultiPointZ')
|
||||
geoms = feat.geometries()
|
||||
eq_(len(geoms),2)
|
||||
eq_(geoms[0].to_wkt(),'Point(0 0)')
|
||||
eq_(geoms[1].to_wkt(),'Point(1 1)')
|
||||
# MultiPointM
|
||||
feat = fs.next()
|
||||
eq_(feat.id(),7)
|
||||
eq_(feat['gid'],7)
|
||||
eq_(feat['dim'],3)
|
||||
eq_(feat['name'],'MultiPointM')
|
||||
geoms = feat.geometries()
|
||||
eq_(len(geoms),2)
|
||||
eq_(geoms[0].to_wkt(),'Point(0 0)')
|
||||
eq_(geoms[1].to_wkt(),'Point(1 1)')
|
||||
# MultiPointZM
|
||||
feat = fs.next()
|
||||
eq_(feat.id(),8)
|
||||
eq_(feat['gid'],8)
|
||||
eq_(feat['dim'],4)
|
||||
eq_(feat['name'],'MultiPointZM')
|
||||
geoms = feat.geometries()
|
||||
eq_(len(geoms),2)
|
||||
eq_(geoms[0].to_wkt(),'Point(0 0)')
|
||||
eq_(geoms[1].to_wkt(),'Point(1 1)')
|
||||
# LineString
|
||||
feat = fs.next()
|
||||
eq_(feat.id(),9)
|
||||
eq_(feat['gid'],9)
|
||||
eq_(feat['dim'],2)
|
||||
eq_(feat['name'],'LineString')
|
||||
geoms = feat.geometries()
|
||||
eq_(len(geoms),1)
|
||||
eq_(geoms[0].to_wkt(),'LineString(0 0,1 1)')
|
||||
# LineStringZ
|
||||
feat = fs.next()
|
||||
eq_(feat.id(),10)
|
||||
eq_(feat['gid'],10)
|
||||
eq_(feat['dim'],3)
|
||||
eq_(feat['name'],'LineStringZ')
|
||||
geoms = feat.geometries()
|
||||
eq_(len(geoms),1)
|
||||
eq_(geoms[0].to_wkt(),'LineString(0 0,1 1)')
|
||||
# LineStringM
|
||||
feat = fs.next()
|
||||
eq_(feat.id(),11)
|
||||
eq_(feat['gid'],11)
|
||||
eq_(feat['dim'],3)
|
||||
eq_(feat['name'],'LineStringM')
|
||||
geoms = feat.geometries()
|
||||
eq_(len(geoms),1)
|
||||
eq_(geoms[0].to_wkt(),'LineString(0 0,1 1)')
|
||||
# LineStringZM
|
||||
feat = fs.next()
|
||||
eq_(feat.id(),12)
|
||||
eq_(feat['gid'],12)
|
||||
eq_(feat['dim'],4)
|
||||
eq_(feat['name'],'LineStringZM')
|
||||
geoms = feat.geometries()
|
||||
eq_(len(geoms),1)
|
||||
eq_(geoms[0].to_wkt(),'LineString(0 0,1 1)')
|
||||
# Polygon
|
||||
feat = fs.next()
|
||||
eq_(feat.id(),13)
|
||||
eq_(feat['gid'],13)
|
||||
eq_(feat['name'],'Polygon')
|
||||
geoms = feat.geometries()
|
||||
eq_(len(geoms),1)
|
||||
eq_(geoms[0].to_wkt(),'Polygon((0 0,1 1,2 2,0 0))')
|
||||
# PolygonZ
|
||||
feat = fs.next()
|
||||
eq_(feat.id(),14)
|
||||
eq_(feat['gid'],14)
|
||||
eq_(feat['name'],'PolygonZ')
|
||||
geoms = feat.geometries()
|
||||
eq_(len(geoms),1)
|
||||
eq_(geoms[0].to_wkt(),'Polygon((0 0,1 1,2 2,0 0))')
|
||||
# PolygonM
|
||||
feat = fs.next()
|
||||
eq_(feat.id(),15)
|
||||
eq_(feat['gid'],15)
|
||||
eq_(feat['name'],'PolygonM')
|
||||
geoms = feat.geometries()
|
||||
eq_(len(geoms),1)
|
||||
eq_(geoms[0].to_wkt(),'Polygon((0 0,1 1,2 2,0 0))')
|
||||
# PolygonZM
|
||||
feat = fs.next()
|
||||
eq_(feat.id(),16)
|
||||
eq_(feat['gid'],16)
|
||||
eq_(feat['name'],'PolygonZM')
|
||||
geoms = feat.geometries()
|
||||
eq_(len(geoms),1)
|
||||
eq_(geoms[0].to_wkt(),'Polygon((0 0,1 1,2 2,0 0))')
|
||||
# MultiLineString
|
||||
feat = fs.next()
|
||||
eq_(feat.id(),17)
|
||||
eq_(feat['gid'],17)
|
||||
eq_(feat['name'],'MultiLineString')
|
||||
geoms = feat.geometries()
|
||||
eq_(len(geoms),2)
|
||||
eq_(geoms[0].to_wkt(),'LineString(0 0,1 1)')
|
||||
eq_(geoms[1].to_wkt(),'LineString(2 2,3 3)')
|
||||
# MultiLineStringZ
|
||||
feat = fs.next()
|
||||
eq_(feat.id(),18)
|
||||
eq_(feat['gid'],18)
|
||||
eq_(feat['name'],'MultiLineStringZ')
|
||||
geoms = feat.geometries()
|
||||
eq_(len(geoms),2)
|
||||
eq_(geoms[0].to_wkt(),'LineString(0 0,1 1)')
|
||||
eq_(geoms[1].to_wkt(),'LineString(2 2,3 3)')
|
||||
# MultiLineStringM
|
||||
feat = fs.next()
|
||||
eq_(feat.id(),19)
|
||||
eq_(feat['gid'],19)
|
||||
eq_(feat['name'],'MultiLineStringM')
|
||||
geoms = feat.geometries()
|
||||
eq_(len(geoms),2)
|
||||
eq_(geoms[0].to_wkt(),'LineString(0 0,1 1)')
|
||||
eq_(geoms[1].to_wkt(),'LineString(2 2,3 3)')
|
||||
# MultiLineStringZM
|
||||
feat = fs.next()
|
||||
eq_(feat.id(),20)
|
||||
eq_(feat['gid'],20)
|
||||
eq_(feat['name'],'MultiLineStringZM')
|
||||
geoms = feat.geometries()
|
||||
eq_(len(geoms),2)
|
||||
eq_(geoms[0].to_wkt(),'LineString(0 0,1 1)')
|
||||
eq_(geoms[1].to_wkt(),'LineString(2 2,3 3)')
|
||||
# MultiPolygon
|
||||
feat = fs.next()
|
||||
eq_(feat.id(),21)
|
||||
eq_(feat['gid'],21)
|
||||
eq_(feat['name'],'MultiPolygon')
|
||||
geoms = feat.geometries()
|
||||
eq_(len(geoms),2)
|
||||
eq_(geoms[0].to_wkt(),'Polygon((0 0,1 1,2 2,0 0))')
|
||||
eq_(geoms[1].to_wkt(),'Polygon((0 0,1 1,2 2,0 0))')
|
||||
# MultiPolygonZ
|
||||
feat = fs.next()
|
||||
eq_(feat.id(),22)
|
||||
eq_(feat['gid'],22)
|
||||
eq_(feat['name'],'MultiPolygonZ')
|
||||
geoms = feat.geometries()
|
||||
eq_(len(geoms),2)
|
||||
eq_(geoms[0].to_wkt(),'Polygon((0 0,1 1,2 2,0 0))')
|
||||
eq_(geoms[1].to_wkt(),'Polygon((0 0,1 1,2 2,0 0))')
|
||||
# MultiPolygonM
|
||||
feat = fs.next()
|
||||
eq_(feat.id(),23)
|
||||
eq_(feat['gid'],23)
|
||||
eq_(feat['name'],'MultiPolygonM')
|
||||
geoms = feat.geometries()
|
||||
eq_(len(geoms),2)
|
||||
eq_(geoms[0].to_wkt(),'Polygon((0 0,1 1,2 2,0 0))')
|
||||
eq_(geoms[1].to_wkt(),'Polygon((0 0,1 1,2 2,0 0))')
|
||||
# MultiPolygonZM
|
||||
feat = fs.next()
|
||||
eq_(feat.id(),24)
|
||||
eq_(feat['gid'],24)
|
||||
eq_(feat['name'],'MultiPolygonZM')
|
||||
geoms = feat.geometries()
|
||||
eq_(len(geoms),2)
|
||||
eq_(geoms[0].to_wkt(),'Polygon((0 0,1 1,2 2,0 0))')
|
||||
eq_(geoms[1].to_wkt(),'Polygon((0 0,1 1,2 2,0 0))')
|
||||
|
||||
|
||||
atexit.register(postgis_takedown)
|
||||
|
||||
|
|
|
@ -44,9 +44,9 @@ if 'shape' in mapnik.DatasourceCache.plugin_names():
|
|||
mapnik.render(m,im)
|
||||
actual = '/tmp/mapnik-wgs842merc-reprojection-render.png'
|
||||
expected = 'images/support/mapnik-wgs842merc-reprojection-render.png'
|
||||
im.save(actual)
|
||||
im.save(actual,'png32')
|
||||
expected_im = mapnik.Image.open(expected)
|
||||
eq_(im.tostring(),expected_im.tostring(), 'failed comparing actual (%s) and expected (%s)' % (actual,'tests/python_tests/'+ expected))
|
||||
eq_(im.tostring('png32'),expected_im.tostring('png32'), 'failed comparing actual (%s) and expected (%s)' % (actual,'tests/python_tests/'+ expected))
|
||||
|
||||
def test_visual_zoom_all_rendering2():
|
||||
m = mapnik.Map(512,512)
|
||||
|
@ -56,9 +56,9 @@ if 'shape' in mapnik.DatasourceCache.plugin_names():
|
|||
mapnik.render(m,im)
|
||||
actual = '/tmp/mapnik-merc2wgs84-reprojection-render.png'
|
||||
expected = 'images/support/mapnik-merc2wgs84-reprojection-render.png'
|
||||
im.save(actual)
|
||||
im.save(actual,'png32')
|
||||
expected_im = mapnik.Image.open(expected)
|
||||
eq_(im.tostring(),expected_im.tostring(), 'failed comparing actual (%s) and expected (%s)' % (actual,'tests/python_tests/'+ expected))
|
||||
eq_(im.tostring('png32'),expected_im.tostring('png32'), 'failed comparing actual (%s) and expected (%s)' % (actual,'tests/python_tests/'+ expected))
|
||||
|
||||
# maximum-extent read from map.xml
|
||||
def test_visual_zoom_all_rendering3():
|
||||
|
@ -69,9 +69,9 @@ if 'shape' in mapnik.DatasourceCache.plugin_names():
|
|||
mapnik.render(m,im)
|
||||
actual = '/tmp/mapnik-merc2merc-reprojection-render1.png'
|
||||
expected = 'images/support/mapnik-merc2merc-reprojection-render1.png'
|
||||
im.save(actual)
|
||||
im.save(actual,'png32')
|
||||
expected_im = mapnik.Image.open(expected)
|
||||
eq_(im.tostring(),expected_im.tostring(), 'failed comparing actual (%s) and expected (%s)' % (actual,'tests/python_tests/'+ expected))
|
||||
eq_(im.tostring('png32'),expected_im.tostring('png32'), 'failed comparing actual (%s) and expected (%s)' % (actual,'tests/python_tests/'+ expected))
|
||||
|
||||
# no maximum-extent
|
||||
def test_visual_zoom_all_rendering4():
|
||||
|
@ -83,9 +83,9 @@ if 'shape' in mapnik.DatasourceCache.plugin_names():
|
|||
mapnik.render(m,im)
|
||||
actual = '/tmp/mapnik-merc2merc-reprojection-render2.png'
|
||||
expected = 'images/support/mapnik-merc2merc-reprojection-render2.png'
|
||||
im.save(actual)
|
||||
im.save(actual,'png32')
|
||||
expected_im = mapnik.Image.open(expected)
|
||||
eq_(im.tostring(),expected_im.tostring(), 'failed comparing actual (%s) and expected (%s)' % (actual,'tests/python_tests/'+ expected))
|
||||
eq_(im.tostring('png32'),expected_im.tostring('png32'), 'failed comparing actual (%s) and expected (%s)' % (actual,'tests/python_tests/'+ expected))
|
||||
|
||||
if __name__ == "__main__":
|
||||
setup()
|
||||
|
|
|
@ -39,7 +39,7 @@ def compare_map(xml):
|
|||
new_map = mapnik.Map(256, 256)
|
||||
mapnik.load_map(new_map, test_map,False,absolute_base)
|
||||
open(test_map2,'w').write(mapnik.save_map_to_string(new_map))
|
||||
diff = ' diff %s %s' % (os.path.abspath(test_map),os.path.abspath(test_map2))
|
||||
diff = ' diff -u %s %s' % (os.path.abspath(test_map),os.path.abspath(test_map2))
|
||||
try:
|
||||
eq_(open(test_map).read(),open(test_map2).read())
|
||||
except AssertionError, e:
|
||||
|
|
|
@ -1,5 +1,6 @@
|
|||
# -*- coding: utf-8 -*-
|
||||
|
||||
import os
|
||||
import sys
|
||||
import mapnik
|
||||
|
||||
|
@ -10,6 +11,11 @@ except ImportError:
|
|||
|
||||
COMPUTE_THRESHOLD = 16
|
||||
|
||||
# testcase images are generated on OS X
|
||||
# so they should exactly match
|
||||
if os.uname()[0] == 'Darwin':
|
||||
COMPUTE_THRESHOLD = 2
|
||||
|
||||
# returns true if pixels are not identical
|
||||
def compare_pixels(pixel1, pixel2, alpha=True):
|
||||
if pixel1 == pixel2:
|
||||
|
|
BIN
tests/visual_tests/data/line.dbf
Executable file
BIN
tests/visual_tests/data/line.shp
Executable file
BIN
tests/visual_tests/data/line.shx
Executable file
|
@ -0,0 +1,137 @@
|
|||
{
|
||||
"keys": [
|
||||
"",
|
||||
"1"
|
||||
],
|
||||
"data": {},
|
||||
"grid": [
|
||||
" ",
|
||||
" ",
|
||||
" ",
|
||||
" ",
|
||||
" ",
|
||||
" ",
|
||||
" ",
|
||||
" ",
|
||||
" ",
|
||||
" ",
|
||||
" ",
|
||||
" ",
|
||||
" ",
|
||||
" ",
|
||||
" ",
|
||||
" ",
|
||||
" ",
|
||||
" ",
|
||||
" ",
|
||||
" ",
|
||||
" ",
|
||||
" !!! !! ",
|
||||
" !!!!!!!!! !!!!!!!! ",
|
||||
" !!! !!!! !!!! !!! ",
|
||||
" !!! !!!!! !!! !!! !!!!! !! ",
|
||||
" !! !!!!!!!! !!! !!! !!!!!!!! !! ",
|
||||
" !!!!! ! !! !! !!! !! !! !!! !! ",
|
||||
" !! !! !!!!! !! !! !! !! !!!!! !!!!!! ",
|
||||
" !! ! !!! !!!!! !! !! !! !!! !! !! !!! ",
|
||||
" !! !! !!!!!!! !!!! !! !! !!!!!!!!! !! !! ",
|
||||
" !! !!!!!!! !! !! !! !! !!!!!!!!!!!!!! !! !! ",
|
||||
" !!!! !!!! !! ! !! !!!!!!!!! !!!!!! !! ",
|
||||
" !! !! !!! !! !!!! !! !!!!! !!!!!!!!! ",
|
||||
" !! ! !!! !!!!! ! !! !!!!!!!!!!!!!! !!!!! !!! ",
|
||||
" !! !! !!! !!!!!!! !! !!!!!!!!!!! !!!!! !!!!! !! ",
|
||||
" !! !!!!! !!!!!! !!!! !! !!!!!! !!!!!!!!! !! ",
|
||||
" !!!! !! !! !!! !!!! !! !!!!! !!!! !!!!!!!! !! ",
|
||||
" !! !! !! !! !!!!! !! !! !!!!! !!!!!!!!!! !!!! !!!!!! ",
|
||||
" !! !!!! !!! !!! ! !! !!!!!!!!! !!! !!!! !!!! !! !!! ",
|
||||
" !! !!!!! !! !!! !!!! !!! !!!!! !!! !!!! !!!!!! !! ",
|
||||
" !! !!!! !! !! !!!!! !! !!! !!!!! !! !!! !!!!!!! !! ",
|
||||
" !!!! !! !!! !!!! !!!!! !!! !!!! !!!!!!!! !!! !!!!!!! !! ",
|
||||
" !! !!!!! !! !!! !!!!! !! !!!!!!! !!!!!!!!! !!! !!! !!!!!! ",
|
||||
" !! !!!! !! !! !!!!! !! !! !!! !! !! !!! !!!!!! !!! ",
|
||||
" !! !!!!! !! !! !! !!!!! !!! !!!!! !! !!!!!! !! ",
|
||||
" !! !!!!!!! !!! !!!!! !! !!!! !!!!!! !! !!!!!!! !! ",
|
||||
" !!!! !! !! !! !!!!! !!!!!!!! !!! !! !! !!!!!!! !! ",
|
||||
" !! !!!!!!! !! !!!!!! !!!!! !!!!!! !!! !!!!!!!!!!",
|
||||
" !! !!!! !! !!! ! !!! !!!! !! !! !!!!!!! !!",
|
||||
" !! !! !!!! !! !!!!!! !!!! !! !! !!!!!!! !",
|
||||
" !! !!!!!!! !! !!!! !!!!!!!!!!!!!!! !!!!!!!! !! ",
|
||||
" !!!! !!!! !! !! !! !!!!!! !! !! !! !!!!!!!!",
|
||||
" !! !! !!!! !! !!!! !! !! !!!!!!! !!",
|
||||
" !! !!!! !! !! !! !! !!! !!! !! !! !! !",
|
||||
" !! !! !!!! !! !! !!!! !!!!!!!! !! !!!!! ",
|
||||
" !! !! !!!! !! !!!!!!!!!!! !! !! !! !!!",
|
||||
" !! ! !! !! !! !! !! !!! !! !!!! !!!",
|
||||
" !! !! !!!! !! !!!!!!!! !! !! !! !!",
|
||||
" !! !! !!!! !! !!! !!! !! !!!! !!",
|
||||
" ! !! !!!!! !! !!!! !!! !! !!!!",
|
||||
" !! !! !!!! !! !!!!!! !!!! !",
|
||||
" !! !! !!!! !! !! !!!",
|
||||
" !! !! !!!!! !! !! !! ",
|
||||
" !! !! !!!! !! !!!! ",
|
||||
" ! !! !!!!! !! !! ",
|
||||
" !! !! !!!!! !! ",
|
||||
" !! !! !!!!!!! ",
|
||||
" !! !! !!!!! !! ",
|
||||
" !! !! !!!!! !! ",
|
||||
" ! !! !!!!!!!! ",
|
||||
" !! !! !!!!! !! ",
|
||||
" !! !! !!!!! !! ",
|
||||
" !! !! !!!!!!!! ",
|
||||
" !!!!!!!! !! !! !!!!! !! ",
|
||||
" !!!! !!!!! ! !! !!!!!! !! ",
|
||||
" !!! !!!! !!!! !! !! !!!!!! ! ",
|
||||
" !! !!!!!!!! !!!! !! !! ! !!! !! ",
|
||||
" !! !!! !!!! !!!! !! !! !!!!!! !! ",
|
||||
" !! !!! !!!!! !!!! !!!! !! !! !!!!!! ! ",
|
||||
" !! !!! !!! !!!! !!!! !!!! !! !! !! !!!!!! ",
|
||||
" !! !!! !! !!!!!!!! !!!! !!!! !! !! !!!!!! !! ",
|
||||
" !! !!! !!!!!!!!!!!!!! !!!! !!! !!!! !! !!!! !! ",
|
||||
"!! !!! !!!!! !!!!! !!!! !!! !! !! !! ! !!!! ",
|
||||
"! !!! !!!! !!!!!!! !!!!!! !!! !! !! !! !!!!!! !! ",
|
||||
" !!! !!! !!!!!!!!!! !!!!!! !! !!! !! !! !!!! !! ",
|
||||
"!!! !!! !!!! !!! !! !!! !!!!! !! !!!! !!!! ",
|
||||
"!! !!! !!! !!!!! !! !! !! !! !!!! !! !!!! !! ",
|
||||
"! !!!! !! !!!!!!!! !! !! ! !! ! !! !! !!!! ! ",
|
||||
" !!!! !! !!! !!! !! !!!!!! ! !!!! !! ! !! ",
|
||||
"!!!! !! !!! !!! !! !!!!!! !! !! !!!! !! ",
|
||||
"!!! !!! !! !!! !!!!!! !! !!!! !! !!!! ",
|
||||
" !! !! !! !! !!!!!! !!!! !! !!!! !! ",
|
||||
"!! !! !! !! !!!! !!!!! !!!! !! !! ",
|
||||
"!!!! !!! !! !!!! !! !! !! !!!! ",
|
||||
" !! !! !! !! !!!!! !!!!! !! !! ",
|
||||
" ! !! !!!!!!! !!!!!! !!!!! ! ",
|
||||
" !! !! !!!!! !!!!! !! ",
|
||||
" ! !! !!!!! !!!!! !! ",
|
||||
" !! !!!!!!!!!!! !!! ",
|
||||
" !! !!!!!!!!! !!! ",
|
||||
" !! !!! !!! !!! ",
|
||||
" !! !!!!! !!! ",
|
||||
" !! !!! ",
|
||||
" !!!!!!! ",
|
||||
" !!!! ",
|
||||
" ",
|
||||
" ",
|
||||
" ",
|
||||
" ",
|
||||
" ",
|
||||
" ",
|
||||
" ",
|
||||
" ",
|
||||
" ",
|
||||
" ",
|
||||
" ",
|
||||
" ",
|
||||
" ",
|
||||
" ",
|
||||
" ",
|
||||
" ",
|
||||
" ",
|
||||
" ",
|
||||
" ",
|
||||
" ",
|
||||
" ",
|
||||
" ",
|
||||
" "
|
||||
]
|
||||
}
|
Before Width: | Height: | Size: 6.9 KiB After Width: | Height: | Size: 6.9 KiB |
Before Width: | Height: | Size: 19 KiB After Width: | Height: | Size: 19 KiB |
Before Width: | Height: | Size: 19 KiB After Width: | Height: | Size: 19 KiB |
Before Width: | Height: | Size: 46 KiB After Width: | Height: | Size: 46 KiB |
Before Width: | Height: | Size: 47 KiB After Width: | Height: | Size: 47 KiB |
Before Width: | Height: | Size: 49 KiB After Width: | Height: | Size: 49 KiB |
Before Width: | Height: | Size: 51 KiB After Width: | Height: | Size: 52 KiB |
After Width: | Height: | Size: 24 KiB |
After Width: | Height: | Size: 24 KiB |
After Width: | Height: | Size: 24 KiB |
After Width: | Height: | Size: 24 KiB |
Before Width: | Height: | Size: 1.9 KiB After Width: | Height: | Size: 2 KiB |
Before Width: | Height: | Size: 1.1 KiB After Width: | Height: | Size: 1.1 KiB |
Before Width: | Height: | Size: 5 KiB After Width: | Height: | Size: 5 KiB |
Before Width: | Height: | Size: 1.1 KiB After Width: | Height: | Size: 1.1 KiB |
Before Width: | Height: | Size: 1.9 KiB After Width: | Height: | Size: 2 KiB |
Before Width: | Height: | Size: 1.1 KiB After Width: | Height: | Size: 1.1 KiB |
Before Width: | Height: | Size: 5.1 KiB After Width: | Height: | Size: 5.1 KiB |
Before Width: | Height: | Size: 11 KiB After Width: | Height: | Size: 11 KiB |
Before Width: | Height: | Size: 26 KiB After Width: | Height: | Size: 26 KiB |
Before Width: | Height: | Size: 42 KiB After Width: | Height: | Size: 42 KiB |
Before Width: | Height: | Size: 56 KiB After Width: | Height: | Size: 56 KiB |
Before Width: | Height: | Size: 2.1 KiB After Width: | Height: | Size: 2.1 KiB |
Before Width: | Height: | Size: 2.8 KiB After Width: | Height: | Size: 2.8 KiB |
Before Width: | Height: | Size: 2.6 KiB After Width: | Height: | Size: 2.6 KiB |
Before Width: | Height: | Size: 6.8 KiB After Width: | Height: | Size: 6.8 KiB |
Before Width: | Height: | Size: 6.2 KiB After Width: | Height: | Size: 6.2 KiB |
Before Width: | Height: | Size: 5 KiB After Width: | Height: | Size: 5.1 KiB |
Before Width: | Height: | Size: 3.6 KiB After Width: | Height: | Size: 5.1 KiB |
Before Width: | Height: | Size: 5.3 KiB After Width: | Height: | Size: 6.6 KiB |
Before Width: | Height: | Size: 11 KiB After Width: | Height: | Size: 12 KiB |
Before Width: | Height: | Size: 8.9 KiB After Width: | Height: | Size: 9.9 KiB |
Before Width: | Height: | Size: 13 KiB After Width: | Height: | Size: 13 KiB |
Before Width: | Height: | Size: 8.4 KiB After Width: | Height: | Size: 8.3 KiB |
Before Width: | Height: | Size: 15 KiB After Width: | Height: | Size: 15 KiB |
Before Width: | Height: | Size: 22 KiB After Width: | Height: | Size: 22 KiB |
Before Width: | Height: | Size: 21 KiB After Width: | Height: | Size: 21 KiB |
Before Width: | Height: | Size: 31 KiB After Width: | Height: | Size: 31 KiB |
Before Width: | Height: | Size: 13 KiB After Width: | Height: | Size: 13 KiB |