Пример #1
0
def coordinates_intersect_rect_q(coords, rect):
    if isinstance(coords[0], numbers.Number):
        #single point
        return geo.points_intersect_rect_q((coords,), rect)
    elif isinstance(coords[0][0], numbers.Number):
        #list of points
        return geo.points_intersect_rect_q(coords, rect)
    else:
        # nested point lists
        for l in coords:
            if coordinates_intersect_rect_q(l, rect): return True
        return False
Пример #2
0
def make_pnwk(features, props=None, namesFunc=None, filter_func=None, name=None,quiet=False, clip_rect=None):
    if not quiet: log.info('%d centerline features.', len(features))
    #print 'DEBUG random city feature:',features[10]

    city_street_network = pnwk.PNwk(name=name)
    num_segs = 0
    num_jcts=[0]  # this is a hack to get around scoping issues
    jct_ids = {}  # indexed by jct coords
    skipped_features = []
    max_input_dim = 0

    # return jct_id for point (assigning new one if needed)
    def jct_id(point):
        if jct_ids.has_key(point):
            return jct_ids[point]
        else:
            num_jcts[0] += 1 
            jct_ids[point] = num_jcts[0]
            return num_jcts[0]

    for feature in features:
        if filter_func and not filter_func(feature): continue

        geometry = feature['geometry']
        if geometry['type'] == 'MultiLineString':
            parts = geometry['coordinates']
        else:
            if geometry['type'] == 'LineString':
                parts = [geometry['coordinates']]
            else:
                parts = []
                skippedFeatures.append(feature)

        for part in parts:
            num_segs += 1
            seg_id = num_segs
            points = []
            for l in part:
                #code assumes 2d coords, retaining only first 2 coords of input.
                points.append(tuple(l[:2]))
                max_input_dim = max(max_input_dim,len(l))
            start_point = points[0];
            end_point = points[-1]

            if not props:
                tags = feature['properties']
            else:
                tags = {}
                for prop in props:
                    if prop in feature['properties']: 
                        tags[prop] = feature['properties'][prop]

            if clip_rect and not geo.points_intersect_rect_q(points, clip_rect): continue 

            city_street_network.add_seg(seg_id, jct_id(start_point), jct_id(end_point), points,
                    names=namesFunc(feature),
                    tags=tags
                    )
   
    if len(skipped_features) > 0  and not quiet:
        log.warning('%d features skipped.\n'
                '  first skipped feature: %s',
                len(skipped_features), 
                str(feature))

    if max_input_dim > 2 and not quiet:
        info.warning('Input coordinates up to %d dimensional.\n' 
                '  Retaining only first 2 dimensions.',
                max_input_dim)

    return city_street_network