Example #1
0
 def test_get_intersection(self):
     pol1 = self.generate_rect_geojson([0,0,2,1])
     pol2 = self.generate_rect_geojson([1,0,3,1])
     shp1 = gis_util.geojson_to_shape(pol1)
     shp2 = gis_util.geojson_to_shape(pol2)
     intersection = gis_util.get_intersection(shp1, shp2)
     gis_util.shape_to_wkt(intersection)
Example #2
0
 def test_polygon_to_multipolygon(self):
     poly_geojson = self.generate_rect_geojson([1,-1,2,-2])
     poly_shape = gis_util.geojson_to_shape(poly_geojson)
     multipoly_shape = gis_util.polygon_to_multipolygon(poly_shape)
     self.assertEquals(multipoly_shape.geom_type, 'MultiPolygon')
     multipoly_wkt = gis_util.shape_to_wkt(multipoly_shape)
     self.assertEquals(multipoly_wkt, 'MULTIPOLYGON (((1 -1, 1 -2, 2 -2, 2 -1, 1 -1)))')
 def get_records(self):
     for geojson in self.reader.records():
         record = {}
         record.update(geojson.get('properties', {}))
         shape = gis_util.geojson_to_shape(geojson['geometry'])
         if self.reproject_to:
             shape = gis_util.reproject_shape(shape, self.reader.get_crs(),
                                              self.reproject_to)
         if shape.geom_type == 'Polygon' and self.force_multipolygon:
             shape = gis_util.polygon_to_multipolygon(shape)
         record['__shape'] = shape
         yield record
 def get_records(self):
     for geojson in self.reader.records():
         record = {}
         record.update(geojson.get('properties', {}))
         shape = gis_util.geojson_to_shape(geojson['geometry'])
         if self.reproject_to:
             shape = gis_util.reproject_shape(
                 shape, self.reader.get_crs(), self.reproject_to)
         if shape.geom_type == 'Polygon' and self.force_multipolygon:
             shape = gis_util.polygon_to_multipolygon(shape)
         record['__shape'] = shape
         yield record
Example #5
0
    def test_reproject_shape(self):
        geojson = self.generate_rect_geojson([1, -1, 2, -2])
        shape = gis_util.geojson_to_shape(geojson)
        reprojected_shape = gis_util.reproject_shape(shape, 
                                                   'EPSG:4326', 
                                                     gis_util.get_mollweide_crs(),
                                                    )

        rereprojected_shape = gis_util.reproject_shape(reprojected_shape, 
                                                     gis_util.get_mollweide_crs(),
                                                     'EPSG:4326', 
                                                    )
        rereprojected_wkt = gis_util.shape_to_wkt(rereprojected_shape)
Example #6
0
            def write(self, record):
                # Process geometry.
                geom = gis_util.geojson_to_shape(record['geometry'])
                feature_builder.set('geometry', geom._jgeom)

                # Process properties.
                for prop, value in record.get('properties', {}).items():
                    feature_builder.set(prop, value)

                # Create feature.
                id_ = record.get('id')
                if id_ is not None:
                    id_ = str(id_)
                feature = feature_builder.buildFeature(id_)

                # Add to feature list.
                self.features.append(feature)
Example #7
0
            def write(self, record):
                # Process geometry.
                geom = gis_util.geojson_to_shape(record['geometry'])
                feature_builder.set('geometry', geom._jgeom)

                # Process properties.
                for prop, value in record.get('properties', {}).items():
                    feature_builder.set(prop, value)

                # Create feature.
                id_ = record.get('id')
                if id_ is not None:
                    id_ = str(id_)
                feature = feature_builder.buildFeature(id_)

                # Add to feature list.
                self.features.append(feature)
Example #8
0
    def create_substrates_layer(self):
        logger = self.get_logger_for_section(
            section_id='substrates_layer', 
            base_msg="Creating substrates layer...")
        # Read substrates.
        substrates = []
        substrates_path = os.path.join(
            self.source_dir, 'substrates.csv')
        with open(substrates_path, 'rb') as f:
            for row in csv.DictReader(f):
                css_color = row.get('color', '#000000')
                hex_color = css_color.lstrip('#')
                row['rgb'] = [int(hex_color[i:i+2],16) for i in range(0, 6, 2)]
                substrates.append(row)

        # Make substrate shapefile from habitats, 
        # with EPSG:3857 as the CRS.
        layer_dir = os.path.join(self.layers_dir, 'substrates')
        os.makedirs(layer_dir)
        habs_shapefile = os.path.join(
            self.source_dir, 'habitats', 'habitats.shp')
        logger.info("Reading shapes from habitats file...")
        reader = shapefile_util.get_shapefile_reader(habs_shapefile)
        source_mbr = reader.get_mbr()
        source_crs = reader.get_crs()
        source_schema = reader.get_schema()
        
        write_msg = "Writing shapes..."
        logger.info(write_msg)
        reader = shapefile_util.get_shapefile_reader(habs_shapefile)
        substrate_shapefile = os.path.join(layer_dir, 'substrates.shp')
        writer = shapefile_util.get_shapefile_writer(
            shapefile=substrate_shapefile, 
            crs='EPSG:3857',
            schema=source_schema,
        )
        skipped = 0
        counter = 0
        log_interval = 1e3
        for record in reader.records():
            counter += 1
            if (counter % log_interval) == 0:
                prog_msg = "%s %d of %d (%.1f)" % (
                    write_msg, counter, reader.size, 
                    100.0 * counter/reader.size)
                logger.info(prog_msg)
            shp = gis_util.geojson_to_shape(record['geometry'])
            proj_shp = gis_util.reproject_shape(shp, source_crs, 'EPSG:3857')
            record['geometry'] = json.loads(gis_util.shape_to_geojson(proj_shp))
            bad_rec = False
            ps = record['properties']
            if type(ps['ENERGY']) is not unicode:
                bad_rec = True
            if type(ps['Z']) is not float:
                bad_rec = True
            if type(ps['SUBSTRATE']) is not unicode:
                bad_rec = True
            if record['geometry']['type'] != source_schema['geometry']:
                bad_rec = True

            if not bad_rec:
                writer.write(record)
            else:
                skipped += 1

        writer.close()
        reader.close()
        if skipped:
            self.logger.info("%s Skipped %s records due to formatting" %
                             (write_msg, skipped))

        # Transform bounds to EPSG:3857.
        mbr_diag = gis_util.wkt_to_shape(
            "LINESTRING (%s %s, %s %s)" % source_mbr)
        projected_diag = gis_util.reproject_shape(
            mbr_diag, source_crs, 'EPSG:3857')
        projected_mbr = gis_util.get_shape_mbr(projected_diag)

        # Write layer client config.
        client_path = os.path.join(layer_dir, 'client.json')
        info_template = self.template_env.get_template(
            'georefine/substrates_info.html')
        info_html = info_template.render(substrates=substrates)
        client_config = {
            'id': 'substrates',
            'label': 'Substrates',
            'source': 'georefine_wms',
            'layer_type': "WMS",
            'params': {
                'srs':'EPSG:3857',
                'transparent': True,
                'layers': 'substrates',
            },
            'info': info_html,
            'properties': {
                'maxExtent': projected_mbr,
                'projection': 'EPSG:3857',
                'serverResolutions': [4891.96981024998, 2445.98490512499, 1222.99245256249, 611.49622628138, 305.748113140558],
                'tileSize': {'w': 512, 'h': 512},
                'visibility': False
            },
            'zIndex': 30,
        }
        with open(client_path, 'wb') as f:
            json.dump(client_config, f)

        # Write mapfile.
        mapfile_path = os.path.join(layer_dir, 'substrates.map')
        with open(mapfile_path, 'wb') as f:
            mapfile_template = self.template_env.get_template(
                'georefine/substrates.map')
            f.write(mapfile_template.render(
                substrates=substrates,
                mbr=projected_mbr
            ))

        # Write wms config.
        wms_config_path = os.path.join(layer_dir, 'wms.json')
        wms_config = {
            'mapfile': 'substrates.map'
        }
        with open(wms_config_path, 'wb') as f:
            json.dump(wms_config, f)
Example #9
0
 def test_wkb_to_wkt(self):
     poly_geojson = self.generate_rect_geojson([1,-1,2,-2])
     poly_shape = gis_util.geojson_to_shape(poly_geojson)
     poly_wkb = gis_util.shape_to_wkb(poly_shape)
     poly_wkt = gis_util.wkb_to_wkt(poly_wkb)
Example #10
0
 def test_get_shape_area(self):
     geojson = self.generate_rect_geojson()
     shape = gis_util.geojson_to_shape(geojson)
     area = gis_util.get_shape_area(shape)
Example #11
0
 def test_geojson_to_shape(self):
     poly_geojson = self.generate_rect_geojson()
     shape = gis_util.geojson_to_shape(poly_geojson)
     self.assertEquals(shape.geom_type , 'Polygon')