def __init__(self, definition):

        self._ctx = _lib.pj_ctx_alloc()
        self._proj = _lib.pj_init_plus_ctx(self._ctx, definition.encode('ascii'))
        
        errno = _lib.pj_ctx_get_errno(self._ctx)
        if errno != 0:
            raise RuntimeError(_lib.pj_strerrno(errno))
def transform(proj1, proj2, x, y, z=None, radians=False):

    # Fixme: implement Numpy array

    if _lib.pj_is_latlong(proj1._proj) and not radians:
        x = math.radians(x)
        y = math.radians(y)
    x_ptr = _ffi.new('double []', [x])
    y_ptr = _ffi.new('double []', [y])
    z_ptr = _ffi.new('double []', [0])
    count = 1
    offset = 0
    
    errno = _lib.pj_transform(proj1._proj, proj2._proj, count, offset, x_ptr, y_ptr, z_ptr)
    if errno != 0:
        raise RuntimeError(_lib.pj_strerrno(errno))
    
    return x_ptr[0], y_ptr[0], z_ptr[0]