def create_coveragestore(self, name, workspace=None, path=None, type='GeoTIFF', create_layer=True, layer_name=None, source_name=None):
        """
        Create a coveragestore for locally hosted rasters.
        If create_layer is set to true, will create a coverage/layer.
        layer_name and source_name are only used if create_layer ia enabled. If not specified, the raster name will be used for both.
        """
        if path is None:
            raise Exception('You must provide a full path to the raster')

        allowed_types = [
            'ImageMosaic',
            'GeoTIFF',
            'Gtopo30',
            'WorldImage',
            'AIG',
            'ArcGrid',
            'DTED',
            'EHdr',
            'ERDASImg',
            'ENVIHdr',
            'GeoPackage (mosaic)',
            'NITF',
            'RPFTOC',
            'RST',
            'VRT'
        ]

        if type is None:
            raise Exception('Type must be declared')
        elif type not in allowed_types:
            raise Exception('Type must be one of {}'.format(", ".join(allowed_types)))

        if workspace is None:
            workspace = self.get_default_workspace()
        workspace = _name(workspace)

        cs = UnsavedCoverageStore(self, name, workspace)
        cs.type = type
        cs.url = path if path.startswith("file:") else "file:{}".format(path)
        self.save(cs)

        if create_layer:
            if layer_name is None:
                layer_name = os.path.splitext(os.path.basename(path))[0]
            if source_name is None:
                source_name = os.path.splitext(os.path.basename(path))[0]

            data = "<coverage><name>{}</name><nativeName>{}</nativeName></coverage>".format(layer_name, source_name)
            url = "{}/workspaces/{}/coveragestores/{}/coverages.xml".format(self.service_url, workspace, name)
            headers = {"Content-type": "application/xml"}

            resp = self.http_request(url, method='post', data=data, headers=headers)
            if resp.status_code != 201:
                FailedRequestError('Failed to create coverage/layer {} for : {}, {}'.format(layer_name, name, resp.status_code, resp.text))
            self._cache.clear()
            return self.get_resources(names=layer_name, workspaces=workspace)[0]
        return self.get_stores(names=name, workspaces=workspace)[0]
Beispiel #2
0
 def create_coveragestore2(self, name, workspace=None):
     """
     Hm we already named the method that creates a coverage *resource*
     create_coveragestore... time for an API break?
     """
     if isinstance(workspace, basestring):
         workspace = self.get_workspace(workspace)
     elif workspace is None:
         workspace = self.get_default_workspace()
     return UnsavedCoverageStore(self, name, workspace)
    def create_coveragestore(self,
                             name,
                             workspace=None,
                             path=None,
                             type='GeoTIFF',
                             create_layer=True,
                             layer_name=None,
                             source_name=None,
                             upload_data=False,
                             contet_type="image/tiff",
                             overwrite=False):
        """
        Create a coveragestore for locally hosted rasters.
        If create_layer is set to true, will create a coverage/layer.
        layer_name and source_name are only used if create_layer ia enabled. If not specified, the raster name will be used for both.
        """
        if path is None:
            raise Exception('You must provide a full path to the raster')

        if layer_name is not None and ":" in layer_name:
            ws_name, layer_name = layer_name.split(':')

        allowed_types = [
            'ImageMosaic', 'GeoTIFF', 'Gtopo30', 'WorldImage', 'AIG',
            'ArcGrid', 'DTED', 'EHdr', 'ERDASImg', 'ENVIHdr',
            'GeoPackage (mosaic)', 'NITF', 'RPFTOC', 'RST', 'VRT'
        ]

        if type is None:
            raise Exception('Type must be declared')
        elif type not in allowed_types:
            raise Exception('Type must be one of {}'.format(
                ", ".join(allowed_types)))

        if workspace is None:
            workspace = self.get_default_workspace()
        workspace = _name(workspace)

        if not overwrite:
            stores = self.get_stores(names=name, workspaces=[workspace])
            if len(stores) > 0:
                msg = "There is already a store named {} in workspace {}".format(
                    name, workspace)
                raise ConflictingDataError(msg)

        if upload_data is False:
            cs = UnsavedCoverageStore(self, name, workspace)
            cs.type = type
            cs.url = path if path.startswith("file:") else "file:{}".format(
                path)
            self.save(cs)

            if create_layer:
                if layer_name is None:
                    layer_name = os.path.splitext(os.path.basename(path))[0]
                if source_name is None:
                    source_name = os.path.splitext(os.path.basename(path))[0]

                data = "<coverage><name>{}</name><nativeName>{}</nativeName></coverage>".format(
                    layer_name, source_name)
                url = "{}/workspaces/{}/coveragestores/{}/coverages.xml".format(
                    self.service_url, workspace, name)
                headers = {"Content-type": "application/xml"}

                resp = self.http_request(url,
                                         method='post',
                                         data=data,
                                         headers=headers)
                if resp.status_code != 201:
                    raise FailedRequestError(
                        'Failed to create coverage/layer {} for : {}, {}'.
                        format(layer_name, name, resp.status_code, resp.text))
                self._cache.clear()
                return self.get_resources(names=layer_name,
                                          workspaces=[workspace])[0]
        else:
            data = open(path, 'rb')
            params = {"configure": "first", "coverageName": name}
            url = build_url(self.service_url, [
                "workspaces", workspace, "coveragestores", name,
                "file.{}".format(type.lower())
            ], params)

            headers = {"Content-type": contet_type}
            resp = self.http_request(url,
                                     method='put',
                                     data=data,
                                     headers=headers)

            if hasattr(data, "close"):
                data.close()

            if resp.status_code != 201:
                raise FailedRequestError(
                    'Failed to create coverage/layer {} for : {}, {}'.format(
                        layer_name, name, resp.status_code, resp.text))

        return self.get_stores(names=name, workspaces=[workspace])[0]
Beispiel #4
0
    def create_coveragestore(self,
                             name,
                             workspace=None,
                             path=None,
                             type='GeoTIFF',
                             create_layer=True,
                             layer_name=None,
                             source_name=None):
        """
        Create a coveragestore for locally hosted rasters.
        If create_layer is set to true, will create a coverage/layer.
        layer_name and source_name are only used if create_layer ia enabled. If not specified, the raster name will be used for both.
        """
        if path is None:
            raise Exception('You must provide a full path to the raster')

        if ":" in layer_name:
            ws_name, layer_name = layer_name.split(':')

        allowed_types = [
            'ImageMosaic', 'GeoTIFF', 'Gtopo30', 'WorldImage', 'AIG',
            'ArcGrid', 'DTED', 'EHdr', 'ERDASImg', 'ENVIHdr',
            'GeoPackage (mosaic)', 'NITF', 'RPFTOC', 'RST', 'VRT'
        ]

        if type is None:
            raise Exception('Type must be declared')
        elif type not in allowed_types:
            raise Exception('Type must be one of {}'.format(
                ", ".join(allowed_types)))

        if workspace is None:
            workspace = self.get_default_workspace()
        workspace = _name(workspace)

        cs = UnsavedCoverageStore(self, name, workspace)
        cs.type = type
        cs.url = path if path.startswith("file:") else "file:{}".format(path)
        self.save(cs)

        if create_layer:
            if layer_name is None:
                layer_name = os.path.splitext(os.path.basename(path))[0]
            if source_name is None:
                source_name = os.path.splitext(os.path.basename(path))[0]

            data = "<coverage><name>{}</name><nativeName>{}</nativeName></coverage>".format(
                layer_name, source_name)
            url = "{}/workspaces/{}/coveragestores/{}/coverages.xml".format(
                self.service_url, workspace, name)
            headers = {"Content-type": "application/xml"}

            resp = self.http_request(url,
                                     method='post',
                                     data=data,
                                     headers=headers)
            if resp.status_code != 201:
                FailedRequestError(
                    'Failed to create coverage/layer {} for : {}, {}'.format(
                        layer_name, name, resp.status_code, resp.text))
            self._cache.clear()
            return self.get_resources(names=layer_name,
                                      workspaces=workspace)[0]
        return self.get_stores(names=name, workspaces=workspace)[0]