edu.bonn.xulu.plugin.model.sleuth
Class UrbanGrowthModel

java.lang.Object
  extended by AbstractNamedObject
      extended by edu.bonn.xulu.model.AbstractXuluModel
          extended by edu.bonn.xulu.model.AbstractStepModel
              extended by edu.bonn.xulu.plugin.model.sleuth.UrbanGrowthModel
All Implemented Interfaces:
StepModel, XuluModel
Direct Known Subclasses:
UrbanGrowthModel_MC, UrbanGrowthModelCalibration, UrbanGrowthModelSelfModification

public class UrbanGrowthModel
extends AbstractStepModel

Urban Growth Model
This Model simulates urban growth. It is based on the algorithm of the SLEUTH-Model, which has originally been written in C code and could be run under UNIX. The SLEUTH-Model has been developed by Keith Clarke at the UC Santa Barbara, CA, within the Gigalopolis Project, funded by the USGS. Therefore it is under public domain. The name SLEUTH has been derived from the image input requirements of the model: Slope, Land cover, Exclusion, Urbanization, Transportation, and Hillshade.
In the original SLEUTH-Model the core Urban Growth Model (UGM) calls and drives an additional land cover deltatron model (LCD). Both models are tightly coupled, but the UGM can be run separately. Here, only the UGM part of the SLEUTH-Model has been translated into JAVA. Minor changes in the code have been necessary. Those changes are explained within the code. In general, the UGM is a Cellular Automaton (CA). All CA elements in the code have been untouched and are the same as in the original UGM.
This is the basic UGM code, a plain Cellular Automaton. Additional functions are implemented in other models, like:


The original SLEUTH-Model can be downloaded via the Gigalopolis Website. To run it, a UNIX environment with the GNU C compiler (gcc) are required.
For details refer to:
Clarke, K.C., Hoppen, S. & L.J. Gaydos (1997): A self-modifying cellular automaton model of historical urbanization in the San Francisco Bay area. In: Environment and Planning B: Planning and Design, vol. 24, pp. 247-261.
Clarke, K.C. & L.J. Gaydos (1998): Loose-coupling a cellular automaton model and GIS: long-term urban growth prediction for San Francisco and Washington/Baltimore. In: International Journal of Geographical Information Science, vol. 12, no. 7, pp. 699-714.
Jantz, C.A., Goetz, S.J. & M.K. Shelley (2003): Using the SLEUTH urban growth model to simulate the impacts of future policy scenarios on urban land use in the Baltimore-Washington metropolitan area. In: Environment and Planning B: Planning and Design, vol: 30, pp. 251-271.

The following input parameters/images are required:

Furthermore the following outputs are created:

Version:
1.0
Author:
Roland Goetzke
See Also:
UrbanGrowthModelContentManager

Field Summary
protected  int areaHeight
           
protected  int areaMaxX
           
protected  int areaMaxY
           
protected  int areaMinX
           
protected  int areaMinY
           
protected  WritableGrid areaRestr
           
protected  int areaWidth
           
protected  double breed
           
protected  double criticalSlope
           
protected  double disp
           
protected  double disp_value
           
protected  WritableGrid inputGrid
           
protected  double max_RG_value
           
protected  double max_search_index
           
protected static int[][] NEIGHBOR
          Moore Neighborhood as a two dimensional array.
protected  WritableGrid outputGrid
           
protected  MultiGrid outStep
           
protected  PropertyReadAccess RA_areaRestr
           
protected  PropertyReadAccess RA_breed
           
protected  PropertyReadAccess RA_criticalSlope
           
protected  PropertyReadAccess RA_disp
           
protected  PropertyReadAccess RA_inputGrid
           
protected  PropertyReadAccess RA_roadGravity
           
protected  PropertyReadAccess RA_roadGrid
           
protected  PropertyReadAccess RA_slope
           
protected  PropertyReadAccess RA_slopeGrid
           
protected  PropertyReadAccess RA_spread
           
protected  PropertyReadAccess RA_steps
          Saves the ContentManager for the model.
protected  double rg_value
           
protected  double roadGravity
           
protected  WritableGrid roadGrid
           
protected  double slope
           
protected  WritableGrid slopeGrid
           
protected  HashMap<Number,Number> slopeLUT
          A Lookup-Table which relates actual slope values to slope coefficient influenced probabilities.
protected  double spread
           
protected  PropertyReadAccess steps
           
protected  PropertyWriteAccess WA_outputGrid
           
protected  PropertyWriteAccess WA_outStep
           
 
Fields inherited from class edu.bonn.xulu.model.AbstractStepModel
stepCount
 
Fields inherited from class edu.bonn.xulu.model.AbstractXuluModel
contManager, disposed, events, initialised, listeners, modelResourceProvider, running, statusOut, stopped
 
Constructor Summary
UrbanGrowthModel()
           
UrbanGrowthModel(UrbanGrowthModelContentManager contManager)
          Creates a new model instance.
 
Method Summary
 int[][] BreedGrowth(int X, int Y)
          This is phase 2 of the growth cycle.
 int calculateNeighbors(int X, int Y, float NbValue)
          This method returns the number of neighbors of a cell X/Y.
 int countSetIndividuals()
          This function counts the starting individual cells for the urban growth model run and sets the outputGrid to the base inputGrid.
 int countTempUrbanCells(boolean[][] tmpGrid)
          Returns the number of urban cells in the temporary cell array.
 boolean[][] DispersionGrowth(double disp_value, double breed)
          This is phase 1 of the growth cycle, where spontaneous growth occurs (DISPERSION).
 boolean[][] EdgeGrowth(double spread)
          This is phase 3 of the growth cycle, where edge growth appears based on the urban pixels that exist at this time (including the new spontaneous and spreading center pixels).
 double getSlopeExp(double slope, int MaxSlopeResistance)
          Calculates the exp value that is needed to generate the slope lookup-table
 HashMap<Number,Number> getSlopeLookup(int slopeMax, double exp, double criticalSlope)
           
 int getSlopeMax()
          Calculates the maximum slope from the Slope Raster.
 double getSlopeValue(int X, int Y, HashMap<Number,Number> slopeLUT)
          Takes a slope value from the slope lookup-table depending on the given cell in the slope raster.
 void performModelDispose()
          like in every model: frees the resources
 void performModelInit()
          Initializes the model.
 void performModelStep(int stepNo)
          This is the main run of the Urban Growth Model.
 boolean[][] RoadGrowth(boolean[][] tmpGrid, double rg_value, double breed, double disp)
          This is phase 4 of the growth cycle, where growth along roads appears.
 int[] roadWalk(int X, int Y, double disp)
          This method performs a walk along a road starting from an initial cell with the coordinates X, Y.
 void writeToGrid(boolean[][] tmpGrid)
          Writes a temporary grid array with boolean values to the outputGrid.
 
Methods inherited from class edu.bonn.xulu.model.AbstractStepModel
fireModelStepFinished, fireModelStepStarted, getStepCount, performModelStart
 
Methods inherited from class edu.bonn.xulu.model.AbstractXuluModel
addModelListener, checkBreakingCommands, determineCaption, disposeModel, fireModelDisposed, fireModelEvent, fireModelInitialised, fireModelStarted, fireModelStopped, getContentManager, getEvents, getModelSpecificGUI, getResourceProvider, getStatusOut, initModel, isDisposed, isInitialised, isRunning, isStopped, performError, releaseAccess, removeModelListener, resetCaptions, setStatusOut, startModelling, stopModelling
 
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
 
Methods inherited from interface edu.bonn.xulu.model.XuluModel
addModelListener, disposeModel, getContentManager, getEvents, getModelSpecificGUI, getResourceProvider, getStatusOut, initModel, isDisposed, isInitialised, isRunning, isStopped, performError, removeModelListener, setStatusOut, startModelling, stopModelling
 

Field Detail

RA_steps

protected PropertyReadAccess RA_steps
Saves the ContentManager for the model.

See Also:
UrbanGrowthModelContentManager

RA_inputGrid

protected PropertyReadAccess RA_inputGrid

WA_outputGrid

protected PropertyWriteAccess WA_outputGrid

RA_areaRestr

protected PropertyReadAccess RA_areaRestr

RA_roadGrid

protected PropertyReadAccess RA_roadGrid

RA_slopeGrid

protected PropertyReadAccess RA_slopeGrid

RA_spread

protected PropertyReadAccess RA_spread

RA_disp

protected PropertyReadAccess RA_disp

RA_breed

protected PropertyReadAccess RA_breed

RA_roadGravity

protected PropertyReadAccess RA_roadGravity

RA_slope

protected PropertyReadAccess RA_slope

RA_criticalSlope

protected PropertyReadAccess RA_criticalSlope

WA_outStep

protected PropertyWriteAccess WA_outStep

steps

protected PropertyReadAccess steps

inputGrid

protected WritableGrid inputGrid

outputGrid

protected WritableGrid outputGrid

areaRestr

protected WritableGrid areaRestr

roadGrid

protected WritableGrid roadGrid

slopeGrid

protected WritableGrid slopeGrid

spread

protected double spread

disp

protected double disp

breed

protected double breed

roadGravity

protected double roadGravity

slope

protected double slope

criticalSlope

protected double criticalSlope

outStep

protected MultiGrid outStep

NEIGHBOR

protected static final int[][] NEIGHBOR
Moore Neighborhood as a two dimensional array. It's the central element of a Cellular Automaton.


slopeLUT

protected HashMap<Number,Number> slopeLUT
A Lookup-Table which relates actual slope values to slope coefficient influenced probabilities.


areaMinX

protected int areaMinX

areaMinY

protected int areaMinY

areaMaxX

protected int areaMaxX

areaMaxY

protected int areaMaxY

areaWidth

protected int areaWidth

areaHeight

protected int areaHeight

disp_value

protected double disp_value

max_RG_value

protected double max_RG_value

rg_value

protected double rg_value

max_search_index

protected double max_search_index
Constructor Detail

UrbanGrowthModel

public UrbanGrowthModel(UrbanGrowthModelContentManager contManager)
Creates a new model instance.


UrbanGrowthModel

public UrbanGrowthModel()
Method Detail

performModelInit

public void performModelInit()
Initializes the model. Like in the init method of every XuluModel the resources are initalized.

Specified by:
performModelInit in class AbstractXuluModel

performModelDispose

public void performModelDispose()
like in every model: frees the resources

Specified by:
performModelDispose in class AbstractXuluModel

performModelStep

public void performModelStep(int stepNo)
This is the main run of the Urban Growth Model. Depending on the input parameters the cellular automaton looks in the neighborhood of individual cells for specific conditions and turns them from non-urban into urban, following certain growth rules. Those growth rules are:
  1. spontaneous growth: controlled by dispersion (@code disp): Randomly selects potential new growth cells.
  2. new spreading centers: controlled by breed (@code breed): Growing urban centers from spontaneous growth.
  3. edge: controlled by spread (@code spread): Old or new urban centers spawn additional growth.
  4. road influenced: controlled by road-gravity(@code roadGravity), dispersion (@code disp), breed (@code breed): Newly urbanized cell spawns growth along transportation network.

Specified by:
performModelStep in interface StepModel
Specified by:
performModelStep in class AbstractStepModel
Parameters:
stepNo -
Throws:
IllegalArgumentException

countSetIndividuals

public int countSetIndividuals()
This function counts the starting individual cells for the urban growth model run and sets the outputGrid to the base inputGrid.
It only works for a binary classification with urban cells having the value 1 and non-urban cells the value 0.

Returns:
startAnz

getSlopeMax

public int getSlopeMax()
Calculates the maximum slope from the Slope Raster.

Returns:
slopeMax

getSlopeValue

public double getSlopeValue(int X,
                            int Y,
                            HashMap<Number,Number> slopeLUT)
Takes a slope value from the slope lookup-table depending on the given cell in the slope raster.

Returns:
slopeDoubleNb

getSlopeExp

public double getSlopeExp(double slope,
                          int MaxSlopeResistance)
Calculates the exp value that is needed to generate the slope lookup-table

Parameters:
slope -
MaxSlopeResistance -
Returns:
exp

getSlopeLookup

public HashMap<Number,Number> getSlopeLookup(int slopeMax,
                                             double exp,
                                             double criticalSlope)

DispersionGrowth

public boolean[][] DispersionGrowth(double disp_value,
                                    double breed)
This is phase 1 of the growth cycle, where spontaneous growth occurs (DISPERSION). Those new cells can turn out to be new spreading centers by urbanizing neighboring pixels (BREED BreedGrowth).

Returns:
tmpGridDispBreed

BreedGrowth

public int[][] BreedGrowth(int X,
                           int Y)
This is phase 2 of the growth cycle. New spreading centers can induce new growth right in the neighborhood, which is calles "breed". This method is fired by new dispersion cells (@link DispersionGrowth), as well as by new road cells (RoadGrowth).

Parameters:
X -
Y -
Returns:
tmpBreedArray

EdgeGrowth

public boolean[][] EdgeGrowth(double spread)
This is phase 3 of the growth cycle, where edge growth appears based on the urban pixels that exist at this time (including the new spontaneous and spreading center pixels).

Returns:
tmpGridSpread

RoadGrowth

public boolean[][] RoadGrowth(boolean[][] tmpGrid,
                              double rg_value,
                              double breed,
                              double disp)
This is phase 4 of the growth cycle, where growth along roads appears. Every newly developed cell can induce road growth. Therefore for a defined number of new cells (by the breed-coeffient) the algorithm looks for a road in the neighborhood. If the new cell is located directly on a road, the algorithm starts a "road walk" (roadWalk), and moves a new cell along the road to a defined distance. If the new cell is not on a road, it looks for a road in a defined neighborhood (by rg_value). If a road is found, it starts a "road walk" from there.

Parameters:
tmpGrid -
Returns:
tmpGridRoad

roadWalk

public int[] roadWalk(int X,
                      int Y,
                      double disp)
This method performs a walk along a road starting from an initial cell with the coordinates X, Y. It returns the position of the final cell after the road walk, which than can start a new urbanization.

Parameters:
X -
Y -
Returns:
nbCellNew

calculateNeighbors

public int calculateNeighbors(int X,
                              int Y,
                              float NbValue)
This method returns the number of neighbors of a cell X/Y. The input for this method are the coordinates of the center cell and the value that the neighboring cells must have in order to be counted. In general this is 0 for non-urban cells and 1 for urban cells.

Parameters:
X -
Y -
NbValue -
Returns:
Nb

countTempUrbanCells

public int countTempUrbanCells(boolean[][] tmpGrid)
Returns the number of urban cells in the temporary cell array.

Returns:
anzGesamt

writeToGrid

public void writeToGrid(boolean[][] tmpGrid)
Writes a temporary grid array with boolean values to the outputGrid.

Parameters:
tmpGrid -