Beispiel #1
0
def raster_to_vector(raster, vector, type):
    """Converts a raster to a vector map

    Parameters
    ----------

    raster :
        Name of the input raster map

    vector :
        Name for the output vector map

    type :
        Type for the output vector map

    Returns
    -------

    Examples
    --------
    ..
    """
    r.to_vect(input=flow_in_category,
              output=flow_in_category,
              type="area",
              quiet=True)

    # Value is the ecosystem type
    v.db_renamecolumn(map=flow_in_category, column=("value", "ecosystem"))

    # New column for flow values
    addcolumn_string = flow_column_name + " double"
    v.db_addcolumn(map=flow_in_category, columns=addcolumn_string)

    # The raster category 'label' is the 'flow'
    v.db_update(map=flow_in_category, column="flow", query_column="label")
    v.db_dropcolumn(map=flow_in_category, columns="label")

    # Update the aggregation raster categories
    v.db_addcolumn(map=flow_in_category, columns="aggregation_id int")
    v.db_update(map=flow_in_category, column="aggregation_id", value=category)

    v.colors(map=flow_in_category, raster=flow_in_category, quiet=True)
Beispiel #2
0
def raster_to_vector(raster_category_flow, vector_category_flow,
                     flow_column_name, category, type):
    """Converts a raster to a vector map

    Parameters
    ----------

    raster_category_flow :
        Name of the input raster map 'flow in category'

    vector_category_flow :
        Name for the output vector map 'flow in category'

    type :
        Type for the output vector map

    Returns
    -------

    Examples
    --------
    ..
    """
    msg = " * Vectorising raster map '{r}'"
    grass.verbose(
        _(
            msg.format(
                c=category,
                r=raster_category_flow,
                v=vector_category_flow,
            )))
    r.to_vect(
        input=raster_category_flow,
        output=vector_category_flow,
        type="area",
        quiet=True,
    )

    msg = " * Updating the attribute table"
    grass.verbose(_(msg))

    # Value is the ecosystem type
    v.db_renamecolumn(
        map=vector_category_flow,
        column=("value", "ecosystem"),
        quiet=True,
    )

    # New column for flow values
    addcolumn_string = flow_column_name + " double"
    v.db_addcolumn(
        map=vector_category_flow,
        columns=addcolumn_string,
        quiet=True,
    )

    # The raster category 'label' is the 'flow'
    v.db_update(
        map=vector_category_flow,
        column="flow",
        query_column="label",
        quiet=True,
    )
    v.db_dropcolumn(
        map=vector_category_flow,
        columns="label",
        quiet=True,
    )

    # Update the aggregation raster categories
    v.db_addcolumn(
        map=vector_category_flow,
        columns="aggregation_id int",
        quiet=True,
    )
    v.db_update(
        map=vector_category_flow,
        column="aggregation_id",
        value=category,
        quiet=True,
    )
    v.colors(
        map=vector_category_flow,
        raster=raster_category_flow,
        quiet=True,
    )
Beispiel #3
0
 def del_color_table(self):
     out = v.colors(map=self.full_name, flags='r', stdout_=PIPE, stderr_=PIPE)
     if out.outputs.stderr:
         return out.outputs.stderr.split('\n')[0]
     else:
         print 'Color table of map %r was deleted' % self.name
Beispiel #4
0
    def add_color_table(self, cbrew=False, color=None, column=None, attr=None, layer='1',
                        nk=5, s=None, cramp=('Diverging','RdYlBu'), method='Equal_Interval',
                        invert_ramp=False, *args, **kwargs):
        """
        Add/replace color table

        Keyword     Description
        ---------- ----------------------------------------------------------------------
        nk          number of classes
        column      layer column to color classify, If s is not provided, column is needed.
                    Default=None
        s           pandas series or numpy array. If column is not provided, s is needed.
                    Default=None
        ccramp      Boolean. If true, color scheme and color ramp use Color Brewer
                    (http://colorbrewer2.org/)
        method      pysal.mapclassify methods. Options: Map_Classifier, Box_Plot,
                    Equal_Interval, Fisher_Jenks, Jenks_Caspall, Jenks_Caspall_Forced,
                    Jenks_Caspall_Sampled, Max_P_Classifier, Maximum_Breaks,
                    Natural_Breaks, Quantiles, Percentiles, Std_Mean, User_Defined.
                    Default User_Defined. See PySal documentation for valid parameters
                    in each case (http://pysal.org/1.2/library/esda/mapclassify.html).
        invert_ramp Boolean. Default False.
        layer       Grass layer where rgb column will be added
        *args       Additional arguments for v.colors
        **kwargs    Additional arguments for rgb_classify. For example, if method='User_Defined'
                    then the arguments bins is required.
        ---------- ----------------------------------------------------------------------
        """
        #todo: allow editing if current mapset and mapset are PERMANENT
        #assert self.mapset is not 'PERMANENT',\
        #       '%r is in PERMANENT and is not writable by user' % self.name

        assert int(layer) <= self.dblinks.num_dblinks(), 'layer %r does not exist' % layer

        if cbrew:
            table_name = self.dblinks.by_layer(int(layer)).name
            sqlfilter = gtable.Table(name=table_name, connection=self._con)
            assert sqlfilter.exist(), 'table %r not found in mapset %r. Verify dblinks.'\
                                       % (sqlfilter.name, self.mapset)

            if hasattr(s, '__len__'):
                dtype = s.dtype.type
                assert (np.issubdtype(dtype, np.integer) or np.issubdtype(dtype, np.float)),\
                       'Numpy array dtype must be integer or float'

                sqlfilter.filters.select(sqlfilter.key)
                cur = sqlfilter.execute()
                cat = cur.fetchall()
                cat = np.array(cat)
                cat = cat.flatten()
                assert s.shape == cat.shape, 'Series does not match map key shape'

            if column:
                assert column in sqlfilter.columns.names(),\
                       '%r has not column %r' % (table_name, column)

                sqlfilter.filters.select(sqlfilter.key, column)
                cur = sqlfilter.execute()
                col = cur.fetchall()
                col = np.array(col).T
                s   = col[1]
                cat = col[0]
                dtype = s.dtype.type
                if not (np.issubdtype(dtype, np.integer) or np.issubdtype(dtype, np.float)):
                    nulls = np.where(s == '')[0]
                    if nulls.any:
                        s[s == ''] = np.nan
                    s = s.astype(float)

            s = pd.Series(s)
            s_rgb = rgb_classify(s, nk, cramp=cramp, method=method, invert_ramp=invert_ramp,
                                 **kwargs)

            #TODO convert this into a save_colr_file function
            # Write color table
            mapset = Mapset()
            mapset.current()
            if self.mapset is mapset.name:
                filename = os.path.join('$GISDBASE','$LOCATION_NAME', self.mapset,
                                        'vector', self.name, 'colr')
            else:
                filename = os.path.join('$GISDBASE','$LOCATION_NAME', mapset.name,
                                        'vcolr2', self.mapset, self.name)
            filename = gtable.get_path(filename)
            directory = os.path.dirname(filename)
            if not os.path.exists(directory):
                os.makedirs(directory)
            with open(filename,'w') as f:
                f.write('% ' +  '%r %r' % (int(min(cat)), self.table.n_rows()) + '\n')
                for i,item in enumerate(s_rgb):
                    f.write(str(cat[i]) + ':' + item + '\n')

        else:
           assert color, 'color attribute is required'
           if column:
               v.colors(map=self.full_name, layer=layer, column=column, color=color, *args)
           else:
               v.colors(map=self.full_name, color=color, *args)