Show:
/**
The `Map` object encapsulates a "GIS" grid. Grids can be read from ESRI ASCII raster files, and are
automatically mapped to a 10x10m grid (the resolution and extent of the height grid).
Internally, a "spatial index" is created allowing for fast access to trees that lie on specific pixels.
See also the wiki page [landscape setup](https://iland-model.org/landscape+setup).
The loaded map can be used, e.g., to specifically apply management on specific areas.


A newly created `Map` object (without a call to `load()`) points to the global stand grid
defined in the [project file](https://iland-model.org/project+file).

Use {{#crossLink "Map/load:method"}}{{/crossLink}} to read a raster file from disk.


Example
--------
    function loadMap()
    {
      var path = Globals.defaultDirectory("script"); // get project script folder; see also the "currentDir" property of "Globals". defaultDirectory() adds already a slash
      var stand_map = new Map();
      stand_map.load(path + "test.txt");
      // now load all trees on pixels with value '2020' in the "test.txt" grid
      management.loadFromMap(stand_map, 2020);
      // ... now do something ....

      var map = new Map();
      // select all trees on stand with id 127 of the 'system' stand grid
      management.loadFromMap(map, 127);
    }

 @module iLand
 @class Map
 */

Map = {

    /**
    The filename for successfully loaded grid or 'invalid'.

    @property name
    @type string
    @readOnly
    */

    /**
    Load a grid (provided in ESRI textformat) from disk. See [landscape setup](https://iland-model.org/landscape+setup) for information about projections.

    @method load
    @param {string} file_name
    */
    /**
    Retrieves the area of the polygon `stand_id` in square meters (m2). Returns -1, if the map is not valid, and 0 if no pixels with the stand `stand_id` are on the map.

    @method area
    @param {integer} stand_id ID of the polygon for which to return the area.
    @return {double}
    The area (m2) of the polygon.
    */
    /**
    Visualization of the map in the iLand Viewers' main window (if present).
    Map values are colorized between `min_value` (blue) and `max_value` (red).


    @method paint
    @param {double} min_value The minimum value for the color ramp in the visualization
    @param {double} max_value The minimum value for the color ramp in the visualization
    */
    /**
    Clears the map (set all values to 0)

    @method clear
    */

    /**
    Registers the map with the user interface of iLand (https://iland-model.org/iLand+viewer). The map is added to the "Scripts" section of grids,
    and iLand renders it when clicking on it. Default value range is set to min/max values within the grid.

    @method registerUI
    @param {string} name Name to use for the map in the UI. When blank, the file path is used (relative to the project folder)


    @Example
    // load a extra stand grid
    var extra_stand_grid = new Map();
    extra_stand_grid.load(Globals.path('gis/stand_grid2.asc'));
    extra_stand_grid.registerUI();
      */

    /**
    Clear only the project area (set all cell values to 0), but do not affect pixels
    that are "outside of project area" (i.e., have values of -1 and -2).
    (see [Landscape setup](https://iland-model.org/Landscape+setup))

    @method clearProjectArea
    */

    /**
    return the metric bounding box, i.e. the smallest rectangle that entirely circumferences the pixels with value `stand_id`.
    The return value is a RectF, a simple Qt data type describing a rectangle with the properties x, y, width, height, left, right, top, bottom.
    If the stand does not exist, an empty Rect is returned (all properties = 0).

    @Example
    var sgrid = new Map(); // standard standgrid of iLand
    var bbox = stand_map.boundingBox(8594); // get bounding box

    // getting the center point of the rect is easy:
    function centerPoint(bbox) {
       return { x: bbox.x + bbox.width/2,
                y: bbox.y + bbox.height/2 }
    }

    var cp = centerPoint(bbox);
    console.log('centerpoint: x : ' + cp.x + ', y: ' + cp.y );

    @method boundingBox
    @param {integer} stand_id stand Id to extract the bounding box
    @return {RectF} a rectangle (technically a QRectF type).
    */

    /**
    "Paint" a shape on the Map with an ID `stand_id`.
    The `paint_function` is a valid iLand [Expression](https://iland-model.org/Expression)
    (with the paramters: `x`and `y` as *metric* coordinates). All pixels for which `paint_function`
    evaluates to `true` are set to `stand_id`, all other pixels are not modified.


    @method createStand
    @param {integer} stand_id ID of the polygon to be created
    @param {string} paint_function the function defining the shape
    @param {boolean} wrap_around if `true`, the shape is wrapped around the edges of the simulated area (torus)
    @Example
        var map = undefined;
        // the function create 10 random circles
        // with a radius between 10 and 60m on a random location on the landscape,
        // and removes some of those trees
        function random_circles()
        {
            if (map == undefined) {
               map = new Map(); // create a new map
               map.clear();
            }
            for (var i=1;i<10;++i) {
                var x = Math.random() * 600;
                var y = Math.random() * 400;
                var r = 10 + Math.random() * 50;
                map.clear();
                map.createStand(i,'(x-'+x+')^2+(y-'+y+')^2<'+r+'^2',true);
                // load all trees that are present on the stand
                management.loadFromMap(map, i);
                print(management.count + " trees in the area...");
                // apply a special filter polygon
                management.filter('polygon(dbh, 10,0, 30,1)');
                print(management.count + " after filter: trees in the area...");
                management.killAll(); // kill the trees
            }
        }
    */




}