How to project a single x/y coordinate in z-direction onto a specific mesh with scripting
The script below will move a list of Suzanne's to the surface point directly above them on the terrain object using ray casting. You don't need to worry about obstruction by other objects since the ray is cast directly within the target object's (terrain) local space.

import bpy
from mathutils import Vector

def obj_ray_cast(obj, matrix, ray_origin, ray_target):
    """Wrapper for ray casting that moves the ray into object space"""

    # get the ray relative to the object
    matrix_inv        = matrix.inverted()
    ray_origin_obj    = matrix_inv * ray_origin
    ray_target_obj    = matrix_inv * ray_target
    ray_direction_obj = ray_target_obj - ray_origin_obj

    # cast the ray
    success, location, normal, face_index = obj.ray_cast(ray_origin_obj, ray_direction_obj)

    if success:
        return location, normal, face_index
    else:
        return None, None, None

objects = [ o for o in bpy.context.scene.objects if "Suzanne" in o.name ]

targetObj = bpy.data.objects['Landscape']
mw        = targetObj.matrix_world 

for o in objects:
    ray_origin = o.location
    ray_target = o.location + Vector((0,0,100))

    location, normal, face_index = obj_ray_cast(targetObj, mw, ray_origin, ray_target)
    if location: o.location = location