Esempio n. 1
0
    def test_iterops(self):

        coords = ((0.0, 0.0), (0.0, 1.0), (1.0, 1.0), (1.0, 0.0), (0.0, 0.0))
        polygon = Polygon(coords)
        points = [Point(0.5, 0.5), Point(2.0, 2.0)]

        # List of the points contained by the polygon
        self.assertTrue(
            all([isinstance(x, Point)
                 for x in iterops.contains(polygon, points, True)]))

        # 'True' is the default value
        self.assertTrue(
            all([isinstance(x, Point)
                 for x in iterops.contains(polygon, points)]))

        # Test a false value
        self.assertTrue(
            all([isinstance(x, Point)
                 for x in iterops.contains(polygon, points, False)]))

        # If the provided iterator yields tuples, the second value will be
        # yielded
        self.assertEqual(
            list(iterops.contains(polygon, [(p, p.coords[:])
                 for p in points], False)),
            [[(2.0, 2.0)]])

        # Just to demonstrate that the important thing is that the second
        # parameter is an iterator:
        self.assertEqual(
            list(iterops.contains(polygon, iter((p, p.coords[:])
                 for p in points))),
            [[(0.5, 0.5)]])
def rastervals_in_unit(unit, lon_min, lat_min, cellsize, data, view='y-x+'):

    # For some reason it is MUCH faster to do it this way.
    if isinstance(unit, geometry.multipolygon.MultiPolygon):
        return np.hstack([rastervals_in_unit(g,lon_min,lat_min,cellsize,data,view) for g in unit.geoms])

    llc = unit.bounds[:2]
    urc = unit.bounds[2:]
    
    lon_min_in = int((llc[0]-lon_min)/cellsize)
    lon_max_in = int((urc[0]-lon_min)/cellsize)+1
    lat_min_in = int((llc[1]-lat_min)/cellsize)
    lat_max_in = int((urc[1]-lat_min)/cellsize)+1  
    
    data_boxed_ = grid_convert(data,view,'x+y+')[lon_min_in:lon_max_in+1,lat_min_in:lat_max_in+1]
    flat_shape = (-1,)+data_boxed_.shape[2:]
    data_boxed = data_boxed_.reshape(flat_shape)
    lon_boxed = np.arange(lon_min_in, lon_max_in+1)*cellsize + lon_min
    lat_boxed = np.arange(lat_min_in, lat_max_in+1)*cellsize + lat_min
    
    mlon_boxed, mlat_boxed = np.meshgrid(lon_boxed, lat_boxed)
    mlon_boxed = grid_convert(mlon_boxed,'y+x+','x+y+')
    mlat_boxed = grid_convert(mlat_boxed,'y+x+','x+y+')
    
    p=[geom.Point(*pair) for pair in zip(mlon_boxed.ravel(), mlat_boxed.ravel())]
    if isinstance(unit, geometry.polygon.Polygon):
        p_in = set(iterops.contains(geometry.polygon.Polygon(unit.exterior.coords), p, True))
        for hole in unit.interiors:
            p_in -= set(iterops.contains(geometry.polygon.Polygon(hole.coords), p, True))
    else:
        p_in = iterops.contains(unit, p, True)
    i_in = [p.index(p_in_) for p_in_ in p_in]
    out = data_boxed[i_in]    
    
    return out
Esempio n. 3
0
    def test_iterops(self):

        coords = ((0.0, 0.0), (0.0, 1.0), (1.0, 1.0), (1.0, 0.0), (0.0, 0.0))
        polygon = Polygon(coords)
        points = [Point(0.5, 0.5), Point(2.0, 2.0)]

        # List of the points contained by the polygon
        self.assertTrue(
            all([isinstance(x, Point)
                 for x in iterops.contains(polygon, points, True)]))

        # 'True' is the default value
        self.assertTrue(
            all([isinstance(x, Point)
                 for x in iterops.contains(polygon, points)]))

        # Test a false value
        self.assertTrue(
            all([isinstance(x, Point)
                 for x in iterops.contains(polygon, points, False)]))

        # If the provided iterator yields tuples, the second value will be
        # yielded
        self.assertEqual(
            list(iterops.contains(polygon, [(p, p.coords[:])
                 for p in points], False)),
            [[(2.0, 2.0)]])

        # Just to demonstrate that the important thing is that the second
        # parameter is an iterator:
        self.assertEqual(
            list(iterops.contains(polygon, iter((p, p.coords[:])
                 for p in points))),
            [[(0.5, 0.5)]])
def unit_to_grid(unit, lon_min, lat_min, cellsize):
    """
    unit_to_grid(unit, lon_min, lat_min, cellsize)
    
    unit : a shapely polygon or multipolygon
    lon_min : The llc longitude of the master raster
    lat_min : The llc latitude of the master raster
    cellsize: of the master raster
    
    Retruns two arrays, lon and lat, of points on the raster in the unit.
    """
    llc = unit.bounds[:2]
    urc = unit.bounds[2:]
    
    lon_min_in = int((llc[0]-lon_min)/cellsize)
    lon_max_in = int((urc[0]-lon_min)/cellsize)+1
    lat_min_in = int((llc[1]-lat_min)/cellsize)
    lat_max_in = int((urc[1]-lat_min)/cellsize)+1  
    
    x_extent = np.arange(lon_min_in, lon_max_in+1)*cellsize + lon_min
    y_extent = np.arange(lat_min_in, lat_max_in+1)*cellsize + lat_min
    
    nx = len(x_extent)
    ny = len(y_extent)
    
    xm,ym = np.meshgrid(x_extent, y_extent)
    x=xm.ravel()
    y=ym.ravel()
    
    p=[geom.Point([x[i],y[i]]) for i in xrange(len(x))]
    
    return iterops.contains(unit, p, True)
Esempio n. 5
0
    def test_iterops_deprecated(self):

        coords = ((0.0, 0.0), (0.0, 1.0), (1.0, 1.0), (1.0, 0.0), (0.0, 0.0))
        polygon = Polygon(coords)
        points = [Point(0.5, 0.5), Point(2.0, 2.0)]

        with pytest.warns(ShapelyDeprecationWarning,
                          match="'contains' function"):
            list(iterops.contains(polygon, points, True))
Esempio n. 6
0
def multipoly_sample(n, mp):
    """
    Returns uniformly-distributed points on the earth's surface 
    conditioned to be inside a multipolygon.
    
    Not particularly fast.
    """

    # b = basemap.Basemap(-180,-90,180,90)
    
    if isinstance(mp, geometry.MultiPolygon):
        print 'Breaking down multipolygon'
        areas = [shapely_poly_area(p) for p in mp.geoms]
        areas = np.array(areas)/np.sum(areas)
        # ns = pm.rmultinomial(n, areas)
        stair = np.array(np.concatenate(([0],np.cumsum(areas*n))),dtype='int')
        ns = np.diff(stair)
        locs = [multipoly_sample(ns[i], mp.geoms[i]) for i in np.where(ns>0)[0]]
        return np.concatenate([loc[0] for loc in locs]), np.concatenate([loc[1] for loc in locs])
        
    
    lons = np.empty(n)
    lats = np.empty(n)
    
    done = 0
    
    xmin = mp.bounds[0]*np.pi/180
    ymin = mp.bounds[1]*np.pi/180
    xmax = mp.bounds[2]*np.pi/180
    ymax = mp.bounds[3]*np.pi/180
    
    print 'Starting: n=%i'%n
    while done < n:
        x = np.atleast_1d(pm.runiform(xmin,xmax, size=n))
        y = np.atleast_1d(np.arcsin(pm.runiform(np.sin(ymin),np.sin(ymax),size=n)))
        points=[geom.Point([x[i]*180./np.pi,y[i]*180./np.pi]) for i in xrange(len(x))]
        good = list(iterops.contains(mp, points, True))
        n_good = min(n,len(good))
        lons[done:done+n_good] = [p.coords[0][0] for p in good][:n-done]
        lats[done:done+n_good] = [p.coords[0][1] for p in good][:n-done]
        done += n_good
        print '\tDid %i, %i remaining.'%(n_good,n-done)
        
        # plot_unit(b,mp)
        # b.plot(x*180./np.pi,y*180./np.pi,'r.')
        # 
        # from IPython.Debugger import Pdb
        # Pdb(color_scheme='Linux').set_trace()   
    print 'Filled'
    return lons, lats
def exclude_ues(xy, unit, ue_shapefile):
    """
    exclude_ues(xy,unit,ue_shapefile)
    
    xy : sequence of points.
    unit : The shapely polygon or multipolygon containing xy.
    ue_shapefile : A NonSuckyShapeFile object.
    
    Returns x and y filtered to be outside the polygons in the shapefile.
    """
    if not unit.is_valid:
        raise ValueError, 'invalid unit'
    intersect_fracs = []
    for ue in ue_shapefile:
        if unit.intersects(ue):
            xy = iterops.contains(unit, xy, True)
            intersect_fracs.append(unit.intersection(ue).area / ue.area)
        else:
            intersect_fracs.append(0)
    return xy, intersect_fracs
def multipoly_sample(n, mp, test=None, verbose=0):
    """
    Returns uniformly-distributed points on the earth's surface 
    conditioned to be inside a multipolygon.
    
    Not particularly fast.
    """

    # b = basemap.Basemap(-180,-90,180,90)
    
    if isinstance(mp, geometry.MultiPolygon):
        if verbose>0:
            print 'Breaking down multipolygon'
        areas = [shapely_poly_area(p) for p in mp.geoms]
        areas = np.array(areas)
        areas /= np.sum(areas)

        # ns = pm.rmultinomial(n, areas)
        stair = np.round(np.concatenate(([0],np.cumsum(areas*n)))).astype('int')
        ns = np.diff(stair)
        locs = [multipoly_sample(ns[i], mp.geoms[i], test) for i in np.where(ns>0)[0]]
        lons = np.concatenate([loc[0] for loc in locs])
        lats = np.concatenate([loc[1] for loc in locs])

        if len(lons) != n or len(lats) != n:
            raise ValueError
        return lons, lats
    
    lons = np.empty(n)
    lats = np.empty(n)
    
    done = 0
    xmin = mp.bounds[0]*np.pi/180
    ymin = mp.bounds[1]*np.pi/180
    xmax = mp.bounds[2]*np.pi/180
    ymax = mp.bounds[3]*np.pi/180
    
    
    if verbose>0:
        print 'Starting: n=%i'%n
    while done < n:
        x = np.atleast_1d(pm.runiform(xmin,xmax, size=n))
        y = np.atleast_1d(np.arcsin(pm.runiform(np.sin(ymin),np.sin(ymax),size=n)))
        points=[geom.Point([x[i]*180./np.pi,y[i]*180./np.pi]) for i in xrange(len(x))]
        good = list(iterops.contains(mp, points, True))
        if test:
            good = filter(lambda p: test(p.coords[0][0], p.coords[0][1]),good)
        n_good = min(n,len(good))
        lons[done:done+n_good] = [p.coords[0][0] for p in good][:n-done]
        lats[done:done+n_good] = [p.coords[0][1] for p in good][:n-done]
        done += n_good
        if verbose>0:
            print '\tDid %i, %i remaining.'%(n_good,n-done)
    
    if verbose>0:
        print 'Filled'
    if test:
        if not np.all([test(lon,lat) for lon,lat in zip(lons,lats)]):
            raise ValueError, 'Test failed at some outputs'

    if len(lons)!=n or len(lats)!=n:
        raise ValueError

    return lons, lats
Esempio n. 9
0
    elif count % 25 == 0:
      sys.stdout.write('.')
      sys.stdout.flush()

      
print str(count) + " coordinates found"

print "Matching points to regions"


f = open('os.dat', 'r')
count = 0
for line in f:
  (region, wkt) = line.split("\t") 
  polygon = loads(wkt)
  for point in iterops.contains(polygon, points, True):
    fout.write("<%s> <http://data.ordnancesurvey.co.uk/ontology/spatialrelations/within> <%s> .\n" % (point.uri, region))
    fout.write("<%s> <http://data.ordnancesurvey.co.uk/ontology/spatialrelations/contains> <%s> .\n" % (region, point.uri))
    
  count += 1
  if count > 0:
    if count % 1000 == 0:
      print str(count) + " regions checked"
      sys.stdout.flush()
    elif count % 25 == 0:
      sys.stdout.write('.')
      sys.stdout.flush()

print str(count) + " regions checked"
f.close()
fout.close()