--- kartograph/cli.py.orig	2014-03-27 03:57:55 UTC
+++ kartograph/cli.py
@@ -6,7 +6,7 @@ command line interface for kartograph
 import argparse
 import os
 import os.path
-from options import read_map_config
+from .options import read_map_config
 import sys
 
 
@@ -37,7 +37,7 @@ parser.add_argument('--format', '-f', metavar='svg', h
 parser.add_argument('--preview', '-p', nargs='?', metavar='', const=True, help='opens the generated svg for preview')
 parser.add_argument('--pretty-print', '-P', dest='pretty_print', action='store_true', help='pretty print the svg file')
 
-from kartograph import Kartograph
+from .kartograph import Kartograph
 import time
 import os
 
@@ -74,7 +74,7 @@ def render_map(args):
             # print str(r)
             pass
 
-    except Exception, e:
+    except Exception as e:
         print_error(e)
         exit(-1)
 
@@ -98,17 +98,17 @@ def main():
 
     try:
         args = parser.parse_args()
-    except IOError, e:
+    except IOError as e:
         # parser.print_help()
         sys.stderr.write('\n' + str(e) + '\n')
-    except Exception, e:
+    except Exception as e:
         parser.print_help()
-        print '\nError:', e
+        print('\nError:', e)
     else:
         args.func(args)
         elapsed = (time.time() - start)
         if args.output != '-':
-            print 'execution time: %.3f secs' % elapsed
+            print('execution time: %.3f secs' % elapsed)
 
     sys.exit(0)
 
--- kartograph/kartograph.py.orig	2014-03-27 03:57:55 UTC
+++ kartograph/kartograph.py
@@ -1,11 +1,11 @@
 
-from options import parse_options
+from .options import parse_options
 from shapely.geometry import Polygon, LineString, MultiPolygon
-from errors import *
+from .errors import *
 from copy import deepcopy
-from renderer import SvgRenderer
-from mapstyle import MapStyle
-from map import Map
+from .renderer import SvgRenderer
+from .mapstyle import MapStyle
+from .map import Map
 import os
 
 
@@ -64,14 +64,14 @@ class Kartograph(object):
                         command = commands[sys.platform]
                     else:
                         sys.stderr.write('don\'t know how to preview SVGs on your system. Try setting the KARTOGRAPH_PREVIEW environment variable.')
-                        print renderer
+                        print(renderer)
                         return
                 renderer.preview(command)
             # Write the map to a file or return the renderer instance.
             if outfile is None:
                 return renderer
             elif outfile == '-':
-                print renderer
+                print(renderer)
             else:
                 renderer.write(outfile)
         else:
--- kartograph/layersource/postgislayer.py.orig	2014-03-27 03:57:55 UTC
+++ kartograph/layersource/postgislayer.py
@@ -1,5 +1,5 @@
 
-from layersource import LayerSource
+from .layersource import LayerSource
 from kartograph.errors import *
 from kartograph.geometry import create_feature
 import shapely.wkb
@@ -72,11 +72,11 @@ class PostGISLayer(LayerSource):
                 if fields[f] != self.geom_col:
                     # but ignore null values
                     if rec[f]:
-                        if isinstance(rec[f], (str, unicode)):
+                        if isinstance(rec[f], str):
                             try:
                                 meta[fields[f]] = rec[f].decode('utf-8')
                             except:
-                                print 'decoding error', fields[f], rec[f]
+                                print('decoding error', fields[f], rec[f])
                                 meta[fields[f]] = '--decoding error--'
                         else:
                             meta[fields[f]] = rec[f]
@@ -84,7 +84,7 @@ class PostGISLayer(LayerSource):
                     # Store geometry
                     geom_wkb = rec[f]
 
-            if filter is None or filter(meta):
+            if filter is None or list(filter(meta)):
                 # construct geometry
                 geom = shapely.wkb.loads(geom_wkb.decode('hex'))
                 # Finally we construct the map feature and append it to the
--- kartograph/layersource/shplayer.py.orig	2014-03-27 03:57:55 UTC
+++ kartograph/layersource/shplayer.py
@@ -1,11 +1,11 @@
 
-from layersource import LayerSource
+from .layersource import LayerSource
 from kartograph.errors import *
 from kartograph.geometry import BBox, create_feature
 from os.path import exists
 from osgeo.osr import SpatialReference
 import pyproj
-import shapefile
+from . import shapefile
 
 
 verbose = False
@@ -20,7 +20,7 @@ class ShapefileLayer(LayerSource):
         """
         initialize shapefile reader
         """
-        if isinstance(src, unicode):
+        if isinstance(src, str):
             src = src.encode('ascii', 'ignore')
         src = self.find_source(src)
         self.shpSrc = src
@@ -93,7 +93,7 @@ class ShapefileLayer(LayerSource):
             for j in range(len(self.attributes)):
                 drec[self.attributes[j]] = self.recs[i][j]
             # For each record that is not filtered..
-            if filter is None or filter(drec):
+            if filter is None or list(filter(drec)):
                 props = {}
                 # ..we try to decode the attributes (shapefile charsets are arbitrary)
                 for j in range(len(self.attributes)):
@@ -107,10 +107,10 @@ class ShapefileLayer(LayerSource):
                                 break
                             except:
                                 if verbose:
-                                    print 'warning: could not decode "%s" to %s' % (val, enc)
+                                    print('warning: could not decode "%s" to %s' % (val, enc))
                         if not decoded:
                             raise KartographError('having problems to decode the input data "%s"' % val)
-                    if isinstance(val, (str, unicode)):
+                    if isinstance(val, str):
                         val = val.strip()
                     props[self.attributes[j]] = val
 
@@ -129,7 +129,7 @@ class ShapefileLayer(LayerSource):
                 feature = create_feature(geom, props)
                 res.append(feature)
         if bbox is not None and ignored > 0 and verbose:
-            print "-ignoring %d shapes (not in bounds %s )" % (ignored, bbox)
+            print("-ignoring %d shapes (not in bounds %s )" % (ignored, bbox))
         return res
 
 # # shape2geometry
--- kartograph/map.py.orig	2014-03-27 03:57:55 UTC
+++ kartograph/map.py
@@ -1,11 +1,11 @@
 from shapely.geometry import Polygon
 from shapely.geometry.base import BaseGeometry
-from maplayer import MapLayer
-from geometry.utils import geom_to_bbox
-from geometry import BBox, View
-from proj import projections
-from filter import filter_record
-from errors import KartographError
+from .maplayer import MapLayer
+from .geometry.utils import geom_to_bbox
+from .geometry import BBox, View
+from .proj import projections
+from .filter import filter_record
+from .errors import KartographError
 import sys
 
 # Map
@@ -154,7 +154,7 @@ class Map(object):
         ### Initialize bounding polygons and bounding box
         ### Compute the projected bounding box
         """
-        from geometry.utils import bbox_to_polygon
+        from .geometry.utils import bbox_to_polygon
 
         opts = self.options
         proj = self.proj
@@ -306,7 +306,7 @@ class Map(object):
         """
         ### Simplify geometries
         """
-        from simplify import create_point_store, simplify_lines
+        from .simplify import create_point_store, simplify_lines
 
         # We will use a glocal point cache for all layers. If the
         # same point appears in more than one layer, it will be
@@ -421,7 +421,7 @@ class Map(object):
         a single feature. Kartograph uses the geometry.union() method of shapely
         to do that.
         """
-        from geometry.utils import join_features
+        from .geometry.utils import join_features
 
         for layer in self.layers:
             if layer.options['join'] is not False:
@@ -517,7 +517,7 @@ class Map(object):
                         for feat in groupFeatures[g_id]:
                             exp[g_id].append(feat.props[join['export-ids']])
                     import json
-                    print json.dumps(exp)
+                    print(json.dumps(exp))
 
                 layer.features = res
 
--- kartograph/proj/__init__.py.orig	2014-03-27 03:57:55 UTC
+++ kartograph/proj/__init__.py
@@ -18,8 +18,8 @@
 
 projections = dict()
 
-from base import Proj
-from cylindrical import *
+from .base import Proj
+from .cylindrical import *
 
 projections['lonlat'] = Equirectangular
 projections['cea'] = CEA
@@ -30,7 +30,7 @@ projections['balthasart'] = Balthasart
 projections['mercator'] = Mercator
 projections['ll'] = LonLat
 
-from pseudocylindrical import *
+from .pseudocylindrical import *
 
 projections['naturalearth'] = NaturalEarth
 projections['robinson'] = Robinson
@@ -47,7 +47,7 @@ projections['aitoff'] = Aitoff
 projections['winkel3'] = Winkel3
 projections['nicolosi'] = Nicolosi
 
-from azimuthal import *
+from .azimuthal import *
 
 projections['ortho'] = Orthographic
 projections['laea'] = LAEA
@@ -58,11 +58,11 @@ projections['satellite'] = Satellite
 projections['eda'] = EquidistantAzimuthal
 projections['aitoff'] = Aitoff
 
-from conic import *
+from .conic import *
 
 projections['lcc'] = LCC
 
-from proj4 import Proj4
+from .proj4 import Proj4
 
 projections['proj4'] = Proj4
 
@@ -78,7 +78,7 @@ if __name__ == '__main__':
     #assert (round(x,2),round(y,2)) == (3962799.45, -2999718.85), 'LAEA proj error'
     from kartograph.geometry import BBox
 
-    print Proj.fromXML(Robinson(lat0=3, lon0=4).toXML(), projections)
+    print(Proj.fromXML(Robinson(lat0=3, lon0=4).toXML(), projections))
 
     Robinson(lat0=3, lon0=4)
 
@@ -87,10 +87,10 @@ if __name__ == '__main__':
         bbox = BBox()
         try:
             proj = Proj(lon0=60)
-            print proj.project(0, 0)
-            print proj.world_bounds(bbox)
-            print proj.toXML()
+            print(proj.project(0, 0))
+            print(proj.world_bounds(bbox))
+            print(proj.toXML())
         except:
-            print 'Error', pj
-            print sys.exc_info()[0]
+            print('Error', pj)
+            print(sys.exc_info()[0])
             raise
--- kartograph/proj/azimuthal/azimuthal.py.orig	2014-03-27 03:57:55 UTC
+++ kartograph/proj/azimuthal/azimuthal.py
@@ -62,7 +62,7 @@ class Azimuthal(Proj):
     def sea_shape(self, llbbox=(-180, -90, 180, 90)):
         out = []
         if llbbox == (-180, -90, 180, 90) or llbbox == [-180, -90, 180, 90]:
-            print "-> full extend"
+            print("-> full extend")
             for phi in range(0, 360):
                 x = self.r + math.cos(math.radians(phi)) * self.r
                 y = self.r + math.sin(math.radians(phi)) * self.r
--- kartograph/renderer/svg.py.orig	2014-03-27 03:57:55 UTC
+++ kartograph/renderer/svg.py
@@ -239,7 +239,7 @@ class SvgRenderer(MapRenderer):
 
         key = labelOpts['key']
         if not key:
-            key = feature.props.keys()[0]
+            key = list(feature.props.keys())[0]
         if key not in feature.props:
             #sys.stderr.write('could not find feature property "%s" for labeling\n' % key)
             return
@@ -411,7 +411,7 @@ class SvgDocument(object):
     # Here we finally write the SVG file, and we're brave enough
     # to try to write it in Unicode.
     def write(self, outfile, pretty_print=False):
-        if isinstance(outfile, (str, unicode)):
+        if isinstance(outfile, str):
             outfile = open(outfile, 'w')
         if pretty_print:
             raw = self.doc.toprettyxml('utf-8')
@@ -420,7 +420,7 @@ class SvgDocument(object):
         try:
             raw = raw.encode('utf-8')
         except:
-            print 'warning: could not encode to unicode'
+            print('warning: could not encode to unicode')
 
         outfile.write(raw)
         outfile.close()
@@ -431,7 +431,7 @@ class SvgDocument(object):
         import tempfile
         tmpfile = tempfile.NamedTemporaryFile(suffix='.svg', delete=False)
         self.write(tmpfile, pretty_print)
-        print 'map stored to', tmpfile.name
+        print('map stored to', tmpfile.name)
         from subprocess import call
         call([command, tmpfile.name])
 
--- kartograph/yaml_ordered_dict.py.orig	2014-03-27 03:57:55 UTC
+++ kartograph/yaml_ordered_dict.py
@@ -19,8 +19,8 @@ class OrderedDictYAMLLoader(yaml.Loader):
     def __init__(self, *args, **kwargs):
         yaml.Loader.__init__(self, *args, **kwargs)
 
-        self.add_constructor(u'tag:yaml.org,2002:map', type(self).construct_yaml_map)
-        self.add_constructor(u'tag:yaml.org,2002:omap', type(self).construct_yaml_map)
+        self.add_constructor('tag:yaml.org,2002:map', type(self).construct_yaml_map)
+        self.add_constructor('tag:yaml.org,2002:omap', type(self).construct_yaml_map)
 
     def construct_yaml_map(self, node):
         data = OrderedDict()
@@ -40,7 +40,7 @@ class OrderedDictYAMLLoader(yaml.Loader):
             key = self.construct_object(key_node, deep=deep)
             try:
                 hash(key)
-            except TypeError, exc:
+            except TypeError as exc:
                 raise yaml.constructor.ConstructorError('while constructing a mapping',
                     node.start_mark, 'found unacceptable key (%s)' % exc, key_node.start_mark)
             value = self.construct_object(value_node, deep=deep)
@@ -63,4 +63,4 @@ two:
 
     data = yaml.load(textwrap.dedent(sample), OrderedDictYAMLLoader)
     assert type(data) is OrderedDict
-    print data
\ No newline at end of file
+    print(data)
