2009-04-16 17:22:38 +00:00
#!/usr/bin/env python
2011-05-21 00:20:49 +00:00
# -*- coding: utf-8 -*-
2009-04-16 17:22:38 +00:00
from nose . tools import *
2011-11-30 02:15:25 +00:00
import tempfile
2011-11-23 11:33:58 +00:00
import os , mapnik
2011-08-30 22:51:42 +00:00
from nose . tools import *
from utilities import execution_path
2009-04-16 17:22:38 +00:00
2011-08-30 22:51:42 +00:00
def setup ( ) :
# All of the paths used are relative, if we run the tests
# from another directory we need to chdir()
os . chdir ( execution_path ( ' . ' ) )
2009-04-16 17:22:38 +00:00
def test_simplest_render ( ) :
2011-11-23 11:33:58 +00:00
m = mapnik . Map ( 256 , 256 )
2013-02-22 21:40:05 +00:00
im = mapnik . Image ( m . width , m . height )
eq_ ( im . painted ( ) , False )
eq_ ( im . is_solid ( ) , True )
mapnik . render ( m , im )
eq_ ( im . painted ( ) , False )
eq_ ( im . is_solid ( ) , True )
s = im . tostring ( )
2010-09-26 23:41:16 +00:00
eq_ ( s , 256 * 256 * ' \x00 \x00 \x00 \x00 ' )
2009-04-16 17:22:38 +00:00
def test_render_image_to_string ( ) :
2013-02-22 21:40:05 +00:00
im = mapnik . Image ( 256 , 256 )
im . background = mapnik . Color ( ' black ' )
eq_ ( im . painted ( ) , False )
eq_ ( im . is_solid ( ) , True )
s = im . tostring ( )
2010-09-26 23:41:16 +00:00
eq_ ( s , 256 * 256 * ' \x00 \x00 \x00 \xff ' )
2013-02-22 21:40:05 +00:00
s = im . tostring ( ' png ' )
2009-04-16 17:22:38 +00:00
2013-02-22 21:40:05 +00:00
def test_non_solid_image ( ) :
im = mapnik . Image ( 256 , 256 )
im . background = mapnik . Color ( ' black ' )
eq_ ( im . painted ( ) , False )
eq_ ( im . is_solid ( ) , True )
# set one pixel to a different color
im . set_pixel ( 0 , 0 , mapnik . Color ( ' white ' ) )
eq_ ( im . painted ( ) , False )
eq_ ( im . is_solid ( ) , False )
def test_non_solid_image_view ( ) :
im = mapnik . Image ( 256 , 256 )
im . background = mapnik . Color ( ' black ' )
view = im . view ( 0 , 0 , 256 , 256 )
eq_ ( view . is_solid ( ) , True )
# set one pixel to a different color
im . set_pixel ( 0 , 0 , mapnik . Color ( ' white ' ) )
eq_ ( im . is_solid ( ) , False )
# view, since it is the exact dimensions of the image
# should also be non-solid
eq_ ( view . is_solid ( ) , False )
# but not a view that excludes the single diff pixel
view2 = im . view ( 1 , 1 , 256 , 256 )
eq_ ( view2 . is_solid ( ) , True )
2009-04-16 17:22:38 +00:00
2010-09-24 16:12:23 +00:00
def test_setting_alpha ( ) :
w , h = 256 , 256
2011-11-23 11:33:58 +00:00
im1 = mapnik . Image ( w , h )
2010-09-24 16:12:23 +00:00
# white, half transparent
2011-11-23 11:33:58 +00:00
im1 . background = mapnik . Color ( ' rgba(255,255,255,.5) ' )
2013-02-22 21:40:05 +00:00
eq_ ( im1 . painted ( ) , False )
eq_ ( im1 . is_solid ( ) , True )
2010-09-24 16:12:23 +00:00
# pure white
2011-11-23 11:33:58 +00:00
im2 = mapnik . Image ( w , h )
im2 . background = mapnik . Color ( ' rgba(255,255,255,1) ' )
2010-09-24 16:12:23 +00:00
im2 . set_alpha ( .5 )
2013-02-22 21:40:05 +00:00
eq_ ( im2 . painted ( ) , False )
eq_ ( im2 . is_solid ( ) , True )
2010-09-24 16:12:23 +00:00
eq_ ( len ( im1 . tostring ( ) ) , len ( im2 . tostring ( ) ) )
2009-04-16 17:22:38 +00:00
def test_render_image_to_file ( ) :
2013-02-22 21:40:05 +00:00
im = mapnik . Image ( 256 , 256 )
im . background = mapnik . Color ( ' black ' )
2011-11-23 11:33:58 +00:00
if mapnik . has_jpeg ( ) :
2013-02-22 21:40:05 +00:00
im . save ( ' test.jpg ' )
im . save ( ' test.png ' , ' png ' )
2009-04-16 17:22:38 +00:00
if os . path . exists ( ' test.jpg ' ) :
os . remove ( ' test.jpg ' )
else :
return False
if os . path . exists ( ' test.png ' ) :
os . remove ( ' test.png ' )
else :
return False
2009-07-24 06:10:42 +00:00
def get_paired_images ( w , h , mapfile ) :
tmp_map = ' tmp_map.xml '
2011-11-23 11:33:58 +00:00
m = mapnik . Map ( w , h )
mapnik . load_map ( m , mapfile )
2013-02-22 21:40:05 +00:00
im = mapnik . Image ( w , h )
2009-07-24 06:10:42 +00:00
m . zoom_all ( )
2013-02-22 21:40:05 +00:00
mapnik . render ( m , im )
2011-11-23 11:33:58 +00:00
mapnik . save_map ( m , tmp_map )
m2 = mapnik . Map ( w , h )
mapnik . load_map ( m2 , tmp_map )
2013-02-22 21:40:05 +00:00
im2 = mapnik . Image ( w , h )
2009-07-24 06:10:42 +00:00
m2 . zoom_all ( )
2013-02-22 21:40:05 +00:00
mapnik . render ( m2 , im2 )
2009-07-24 06:10:42 +00:00
os . remove ( tmp_map )
2013-02-22 21:40:05 +00:00
return im , im2
2009-07-24 06:10:42 +00:00
def test_render_from_serialization ( ) :
2011-10-29 00:06:23 +00:00
try :
2013-02-22 21:40:05 +00:00
im , im2 = get_paired_images ( 100 , 100 , ' ../data/good_maps/building_symbolizer.xml ' )
eq_ ( im . tostring ( ) , im2 . tostring ( ) )
2012-02-24 21:13:56 +00:00
2013-02-22 21:40:05 +00:00
im , im2 = get_paired_images ( 100 , 100 , ' ../data/good_maps/polygon_symbolizer.xml ' )
eq_ ( im . tostring ( ) , im2 . tostring ( ) )
2011-10-29 00:06:23 +00:00
except RuntimeError , e :
# only test datasources that we have installed
if not ' Could not create datasource ' in str ( e ) :
raise RuntimeError ( e )
2011-04-29 19:25:00 +00:00
2009-10-21 21:24:44 +00:00
def test_render_points ( ) :
2011-11-23 11:33:58 +00:00
if not mapnik . has_cairo ( ) : return
2011-04-14 21:02:31 +00:00
# create and populate point datasource (WGS84 lat-lon coordinates)
2012-01-24 08:27:44 +00:00
ds = mapnik . MemoryDatasource ( )
context = mapnik . Context ( )
context . push ( ' Name ' )
f = mapnik . Feature ( context , 1 )
f [ ' Name ' ] = ' Westernmost Point '
f . add_geometries_from_wkt ( ' POINT (142.48 -38.38) ' )
ds . add_feature ( f )
f = mapnik . Feature ( context , 2 )
f [ ' Name ' ] = ' Southernmost Point '
2012-02-02 01:03:31 +00:00
f . add_geometries_from_wkt ( ' POINT (143.10 -38.60) ' )
2012-01-24 08:27:44 +00:00
ds . add_feature ( f )
2011-04-14 21:02:31 +00:00
# create layer/rule/style
2011-11-23 11:33:58 +00:00
s = mapnik . Style ( )
r = mapnik . Rule ( )
symb = mapnik . PointSymbolizer ( )
2011-04-14 21:02:31 +00:00
symb . allow_overlap = True
r . symbols . append ( symb )
s . rules . append ( r )
2013-01-25 09:36:06 +00:00
lyr = mapnik . Layer ( ' Places ' , ' +proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs ' )
2012-01-24 08:27:44 +00:00
lyr . datasource = ds
2011-04-14 21:02:31 +00:00
lyr . styles . append ( ' places_labels ' )
# latlon bounding box corners
2011-11-23 11:33:58 +00:00
ul_lonlat = mapnik . Coord ( 142.30 , - 38.20 )
lr_lonlat = mapnik . Coord ( 143.40 , - 38.80 )
2011-04-14 21:02:31 +00:00
# render for different projections
projs = {
2013-01-29 06:04:07 +00:00
' google ' : ' +proj=merc +a=6378137 +b=6378137 +lat_ts=0.0 +lon_0=0.0 +x_0=0.0 +y_0=0.0 +k=1.0 +units=m +nadgrids=@null +wktext +no_defs +over ' ,
2013-01-25 09:36:06 +00:00
' latlon ' : ' +proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs ' ,
2011-04-14 21:02:31 +00:00
' merc ' : ' +proj=merc +datum=WGS84 +k=1.0 +units=m +over +no_defs ' ,
' utm ' : ' +proj=utm +zone=54 +datum=WGS84 '
}
for projdescr in projs . iterkeys ( ) :
2011-11-23 11:33:58 +00:00
m = mapnik . Map ( 1000 , 500 , projs [ projdescr ] )
2011-04-14 21:02:31 +00:00
m . append_style ( ' places_labels ' , s )
m . layers . append ( lyr )
2013-01-29 06:04:07 +00:00
dest_proj = mapnik . Projection ( projs [ projdescr ] )
src_proj = mapnik . Projection ( ' +init=epsg:4326 ' )
tr = mapnik . ProjTransform ( src_proj , dest_proj )
m . zoom_to_box ( tr . forward ( mapnik . Box2d ( ul_lonlat , lr_lonlat ) ) )
2011-04-14 21:02:31 +00:00
# Render to SVG so that it can be checked how many points are there with string comparison
2012-10-16 16:27:56 +00:00
svg_file = os . path . join ( tempfile . gettempdir ( ) , ' mapnik-render-points- %s .svg ' % projdescr )
2011-11-23 11:33:58 +00:00
mapnik . render_to_file ( m , svg_file )
2012-01-24 08:27:44 +00:00
num_points_present = len ( ds . all_features ( ) )
2011-04-14 21:02:31 +00:00
svg = open ( svg_file , ' r ' ) . read ( )
num_points_rendered = svg . count ( ' <image ' )
eq_ ( num_points_present , num_points_rendered , " Not all points were rendered ( %d instead of %d ) at projection %s " % ( num_points_rendered , num_points_present , projdescr ) )
2009-10-21 21:24:44 +00:00
2013-02-21 02:55:03 +00:00
@raises ( RuntimeError )
def test_render_with_scale_factor_zero_throws ( ) :
m = mapnik . Map ( 256 , 256 )
im = mapnik . Image ( 256 , 256 )
mapnik . render ( m , im , 0.0 )
def test_render_with_scale_factor ( ) :
m = mapnik . Map ( 256 , 256 )
mapnik . load_map ( m , ' ../data/good_maps/marker-text-line.xml ' )
m . zoom_all ( )
sizes = [ .00001 , .005 , .1 , .899 , 1 , 1.5 , 2 , 5 , 10 , 100 ]
for size in sizes :
im = mapnik . Image ( 256 , 256 )
mapnik . render ( m , im , size )
2013-02-22 21:40:05 +00:00
expected_file = ' ./images/support/marker-text-line-scale-factor- %s .png ' % size
actual_file = ' /tmp/ ' + os . path . basename ( expected_file )
im . save ( actual_file , ' png8 ' )
#im.save(expected_file,'png8')
# we save and re-open here so both png8 images are ready as full color png
actual = mapnik . Image . open ( expected_file )
expected = mapnik . Image . open ( expected_file )
eq_ ( actual . tostring ( ) , expected . tostring ( ) , ' failed comparing actual ( %s ) and expected ( %s ) ' % ( actual_file , expected_file ) )
2013-02-21 02:55:03 +00:00
im . save ( ' ./images/support/marker-text-line-scale-factor- %s .png ' % size , ' png8 ' )
2011-06-03 00:15:17 +00:00
if __name__ == " __main__ " :
2011-08-30 22:51:42 +00:00
setup ( )
[ eval ( run ) ( ) for run in dir ( ) if ' test_ ' in run ]