
Jan - 11 - 2007

**************************************************************************************************************************************************************************************************************************************************

*An Introduction to STEM II Data Generation Utilities for Diva*



     Data generation for STEM II was done using a set of custom software utilities and data generators written in Java for the purpose. They can be found 
under org.eclipse.stem.utility\src\generators. These generators were used to create STEM's properties files and maps for all countries in the Diva 
data set (http://www.cipotato.org/DIVA/data/DataServer.htm). There are multiple steps involved in the process of data generation. Before running a data 
generator there are a few intermediate steps to be done by custom utilities found in org.eclipse.stem.utility\src\generators. Furthermore, the intermediate 
steps vary according to the particular document (i.e. area properity file, nodes property file, or map)  we want to generate. So, we can think of data 
generation for STEM II  as consisting of a set of data generation processes where each process consists of a set of steps. Overall, we can identify the
following five data generation processes :


      --Generation of Area Properties Files 

      --Generation of Population Properties Files 

      --Generation of Nodes Properties Files 

      --Generation of Names Properties Files 

      --Map Generation


     Each process will be explained in detail, but before, we have to mention our data sources and the nature of the data we are dealing with.


**Data Sources for STEM II**

      Our main source of data was DIVA-GIS (http://www.cipotato.org/DIVA/data/DataServer.htm), which is a repository for maps and GIS data. All DIVA-GIS
data is free and in the public domain. The data files are in shapefile format (http://en.wikipedia.org/wiki/Shapefile).  According to Wikipedia, "The ESRI 
Shapefile is a popular geospatial vector data format for geographic information systems software. It is developed and regulated by ESRI as a (mostly) open 
specification for data interoperability among ESRI and other software products. A "shapefile" commonly refers to a collection of files with ".shp", ".shx", 
".dbf" " All shapefiles downloaded from DIVA-GIS are zip compressed. Before getting to data generation, there are two steps to be done : 


***Uncompressing***

     The first step is to unzip all the downloaded DIVA-GIS shapefiles by using a compressing software like Winzip or 7-zip.

***Extraction****

     The second step is to extract data for every possible shapefile into a plain text document. To do this, we run org.eclipse.stem.utility\src\generators\WorldReader.java. 
WorldReader takes as an argument a list will all the files we want to extract data from. Such a list looks as follows :


//Taken from org.eclipse.stem.utility\dataMigration\input\world\World.txt
...
#THIS FILE IS THE INPUT TO WorldReader.java
#IT CONSISTS OF PAIRS OF THE FORM : [LOCATION;FILENAME]
C:\diva\Africa\Algeria;C:\diva\Africa\Algeria\Algeria.txt
C:\diva\Africa\Angola;C:\diva\Africa\Angola\Angola.txt
C:\diva\Africa\Benin;C:\diva\Africa\Benin\Benin.txt
C:\diva\Africa\BurkinaFaso;C:\diva\Africa\BurkinaFaso\BurkinaFaso.txt	
C:\diva\Africa\Burundi;C:\diva\Africa\Burundi\Burundi.txt	
...

     The result is a set of plain-text files containing GIS data. We call it a Diva file. Next, we explain how a Diva file looks like.

***Overview of Diva Files***

A diva file is a simple-text file that contains GIS data and that looks as follows :

// Extracted from Argentina.txt

// Sample level 0 data
ARG,ARGENTINA,-0.5559767,-1.0146881,-0.5559825,-1.0147113, ...

// Sample level 1 data
ARG,ARGENTINA,BUENOS AIRES,-0.70200574,-1.0840372, ...

// Sample level 2 data
ARG,ARGENTINA,JUJUY,Santa Catalina,-0.38024858,-1.1561186, ...

    In other words, it is just a set of rows with location data (i.e. ARG,ARGENTINA,JUJUY,Santa Catalina) and followed by polygon data corresponding
to a geographical location (i.e. -0.38024858,-1.1561186,-0.38023695,-1.1561148,-0.38024002,-1.1560922,-0.38024685,-1.1560414, ...). One restriction about
the Diva files is that data has to appear in the file based on administration level. In other words, we want to make sure that all level 0 data comes before
the level 1 data and that all level 2 data comes after level 0 and level 1 data respectively. The data generation utilities are sensitive to the ordering of
data based on the administration level. A data generator goes through internal transitions based on the administration level of the data it is currently processing.
Internal transitions of the data generator must follow the pattern : Level_0 -> Level_1 -> Level_2. Otherwise, if data does not conform to the Level_0 -> Level_1 -> Level_2 rule, 
unexpected behavior might arise from the data generation utilities.


**Grouping**

      After we uncompress and extract shapefiles into plain text documents, we notice that for some files the data for a single administration is scattered all over
the data file. As an example, for Wisconsin, we dont find all the rows of data for it consecutively, but scattered all over, as follows :

  USA,United States, Wisconsin, 0.7917936,-1.5175203 ... 
  USA,United States,Wisconsin,0.81974524,-1.5800693 ...
  USA,United States, New Hampshire,0.79072654,-1.2406557  ...
  USA,United States, Michigan,0.7881631,-1.5015621 ...
  ...
  USA,United States, Wisconsin, ...
    ... 		
  USA,United States, Wisconsin, ...
    ...
       and so on...

    We want to group all data that belongs to Wisconsin consecutively. By doing this, we will produce a polygon with unique ID for Wisconsin instead of multiple 
polygons with same ID. By definition, polygon IDs should be unique. We achievethe grouping by running org.eclipse.stem.utility\src\generators\GroupGenerator.java. 
The resulting "grouped" data file will look as follows :

USA,United States,Kentucky,0.6370049,-1.5618098 ...
USA,United States,Wisconsin,0.8216533,-1.5777862 ...
USA,United States,Wisconsin,0.81974524,-1.5800693 ...
USA,United States,Wisconsin,0.8127316,-1.5780942 ...
USA,United States,Wisconsin,0.8175863,-1.580813 ...
USA,United States,Wisconsin,0.7917936,-1.5175203 ...
USA,United States,Wisconsin,0.7864648,-1.5271649 ...
USA,United States,Minnesota,0.8585817,-1.6607387 ...

     Running GroupGenerator will produce as output files with the "_GROUPED" suffix attached. So for example, if the original data file for the USA is "USA.txt", 
then the corresponding grouped file will have name "USA_GROUPED.txt"

NOTE : From this introduction we assume that all the generators and utilities are located under  org.eclipse.stem.utility\src\generators\ except where explicitly 
mentioned otherwise.

**Lexicographic Sorting**

    After we have run GroupGenerator, we want to run a pair of utilities that will do a lexicographic sorting of the  data files at administration levels 1 and 2. 
    These utilities are : Admin1LexSorter and Admin2LexSorter. Next, we explain both utilities in detail. The files produced by these utilities will be located under 
    org.eclipse.stem.utility\dataMigration\input\sort\<Three letter identifier for country>

***Admin1LexSorter: Lexicographic Sorting of Level 1 Administrations***
 
     The goal of this program is to go through the source data file (i.e. USA.txt or USA_GROUPED.txt), do a lexicographic sorting, and produce as a result a file where 
each row corresponds to a level 1 administration by lexicographic ordering. As an example, for the case of Argentina, the result would looks like this :

1:AR-B:AR:BUENOS AIRES
2:AR-C:AR:BUENOS AIRES D.F.
3:AR-K:AR:CATAMARCA
4:AR-H:AR:CHACO
5:AR-U:AR:CHUBUT
6:AR-X:AR:CORDOBA
7:AR-W:AR:CORRIENTES
8:AR-E:AR:ENTRE RIOS
9:AR-P:AR:FORMOSA
10:AR-Y:AR:JUJUY
11:AR-L:AR:LA PAMPA
12:AR-F:AR:LA RIOJA
13:AR-M:AR:MENDOZA
14:AR-N:AR:MISIONES
15:AR-Q:AR:NEUQUEN
16:AR-R:AR:RIO NEGRO
17:AR-A:AR:SALTA
18:AR-J:AR:SAN JUAN
19:AR-D:AR:SAN LUIS
20:AR-Z:AR:SANTA CRUZ
21:AR-S:AR:SANTA FE
22:AR-G:AR:SANTIAGO DEL ESTERO
23:AR-V:AR:TIERRA DEL FUEGO
24:AR-T:AR:TUCUMAN

   The name of the resulting lexicographically-sorted file for Argentina is ARG_ADMIN1_LEX.txt and found under org.eclipse.stem.utility\dataMigration\input\sort\ARG 

***Admin2LexSorter: Lexicographic Sorting of Level 2 Administrations***

      Similar to Admin2LexSorter, except that now we sort lexicographically based on a the concatenation of the level 1 and level 2 administrations. This concatenation has 
the effect of sorting all level 2 administrations within its level 1 container. As an example, the result of sorting all level 2 administrations that belong to the province 
(level 1 administration) of La Rioja in Argentina, we get :

// Extracted from org.eclipse.stem.utility\dataMigration\input\sort\ARG_ADMIN2_LEX.txt
...
1:AR:ARG:ARGENTINA:LA RIOJA:Arauco
2:AR:ARG:ARGENTINA:LA RIOJA:Capital
3:AR:ARG:ARGENTINA:LA RIOJA:Castro Barros
4:AR:ARG:ARGENTINA:LA RIOJA:Chilecito
5:AR:ARG:ARGENTINA:LA RIOJA:Famatina
6:AR:ARG:ARGENTINA:LA RIOJA:General Angel V. Pesaloza
7:AR:ARG:ARGENTINA:LA RIOJA:General Belgrano
8:AR:ARG:ARGENTINA:LA RIOJA:General Juan F. Quiroga
9:AR:ARG:ARGENTINA:LA RIOJA:General Lamadrid
10:AR:ARG:ARGENTINA:LA RIOJA:General Lavalle
11:AR:ARG:ARGENTINA:LA RIOJA:General Ocampo
12:AR:ARG:ARGENTINA:LA RIOJA:General San Martin
13:AR:ARG:ARGENTINA:LA RIOJA:General Sarmiento
14:AR:ARG:ARGENTINA:LA RIOJA:Gobernador Gordillo
15:AR:ARG:ARGENTINA:LA RIOJA:Independencia
16:AR:ARG:ARGENTINA:LA RIOJA:Rosario Vera Penaloza
17:AR:ARG:ARGENTINA:LA RIOJA:San Blas de los Sauces
18:AR:ARG:ARGENTINA:LA RIOJA:Sanagasta
...
      
Similarly, the province of Cordoba in Argentina, the sorting produces ;

// Extracted from org.eclipse.stem.utility\dataMigration\input\sort\ARG_ADMIN2_LEX.txt
...
1:AR:ARG:ARGENTINA:MENDOZA:Capital
2:AR:ARG:ARGENTINA:MENDOZA:General Alvear
3:AR:ARG:ARGENTINA:MENDOZA:Godoy Cruz
4:AR:ARG:ARGENTINA:MENDOZA:Guaymallen
5:AR:ARG:ARGENTINA:MENDOZA:Junin
6:AR:ARG:ARGENTINA:MENDOZA:La Paz
7:AR:ARG:ARGENTINA:MENDOZA:Las Heras
8:AR:ARG:ARGENTINA:MENDOZA:Lavalle
9:AR:ARG:ARGENTINA:MENDOZA:Lujan
10:AR:ARG:ARGENTINA:MENDOZA:Maipu
11:AR:ARG:ARGENTINA:MENDOZA:Malarge
12:AR:ARG:ARGENTINA:MENDOZA:Rivadavia
13:AR:ARG:ARGENTINA:MENDOZA:San Carlos
14:AR:ARG:ARGENTINA:MENDOZA:San Martin
15:AR:ARG:ARGENTINA:MENDOZA:San Rafael
16:AR:ARG:ARGENTINA:MENDOZA:Sata Rosa
17:AR:ARG:ARGENTINA:MENDOZA:Tunuyan
18:AR:ARG:ARGENTINA:MENDOZA:Tupungato
...      

*Other Sources of Data Used for Data Generation*
      
**Area and Population Data : GeoHive and CityPopulation**

   Most of the area and population data we use was downloaded from GeoHive (http://www.geohive.com/default1.aspx). GeoHive 
is a site with geopolitical data and statistics on the human population. However, we also found data at City Population (http://www.citypopulation.de/).
City Population's site provides global population statistics.


**ISO 3166 Data**

   The main source of ISO 3166 data is an official ISO 3166 database purchased from ISO (International Organization
for Standardization). The database contains data for both ISO 3166-1 and ISO 3166-2.

**Lexicographically Sorted Data**

   This is a set of data files generated by running Admin1LexSorter and Admin2LexSorter. This data will be useful when creating 
identifiers for each location during the data generation process.

**URLs**

   This is the set of data files containing URLs for every data we found online. We kept track of all the sources of our data and all of them
are accounted for. For each country, there is a corresponding URL file found under org.eclipse.stem/dataMigration/input/urls. A URL file consists 
of rows of the form : KEYWORD:URL For example, for the country of Irak, its corresponding URL file looks like :

// Extracted from org.eclipse.stem/dataMigration/input/urls
GEOHIVE*http://www.xist.org/cntry/iraq.aspx
WIKI*http://en.wikipedia.org/wiki/Irak
CITYPOP*http://en.wikipedia.org/wiki/Irak
DIVA*http://www.cipotato.org/DIVA/data/DataServer.asp?AREA=IRQ&THEME=_adm
CIA*https://www.cia.gov/cia/publications/factbook/geos/iz.html
      
      
*Data Generators*

**Introduction**

   A data generator is a simple Java program that takes as input a file or a set of files from the Diva set and produces as output a property file for STEM.
As it processes data, a generator goes through transitions according to the administrative level of the data that it is currently processing. It is expected
that the level of data will follow the pattern of transitions : Level_0 -> Level_1 -> Level_2. We now explain the function of each data generator.
 
**Generation of Names Properties Files**
   
      To generate a name property file, we run org.eclipse.stem.utility\src\generators\NameGenerator.java. After running NameGenerator, the result is a 
new name property file for a given country. The corresponding name file for Argentina looks as follows :

// Extracted from C:\stemII\org.eclipse.stem.internal.data\resources\data\country\AGO\AGO_names.properties.
...
# Level 1 (admin 1 = e.g., state)
AO-BGO = BENGO
AO-BGU = BENGUELA
AO-BIE = BIE
AO-CAB = CABINDA
AO-CCU = CUANDO CUBANGO
...

      The purpose of a names property file is to define the identifiers for every administrative division in a country at each level.
A single names property file will be generated for every country. For more information on STEM's properties files, please read "An Introduction To STEM Properties Files" 
found at org.eclipse.stem.utility\docs.
      
**Generation of Nodes Properties Files**

     To generate a node property file, we run org.eclipse.stem.utility\src\generators\NodeGenerator.java. After running NodeGenerator, the result is a 
new node property file for a given country. For a single country, a node property file will be generated for each administrative level. For Argentina, the corresponding node
property files produced will be :

ARG_0_node.properties
ARG_1_node.properties
ARG_2_node.properties

      A sample node property file for Argentina looks as follows :
           
// Extracted from org.eclipse.stem.internal.data\resources\data\country\ARG_1_node.properties
...
AR-B = BUENOS AIRES, 01, B
AR-C = BUENOS AIRES D.F., 02, C
AR-K = CATAMARCA, 03, K
AR-H = CHACO, 04, H
AR-U = CHUBUT, 05, U
AR-X = CORDOBA, 06, X
AR-W = CORRIENTES, 07, W
AR-E = ENTRE RIOS, 08, E
AR-P = FORMOSA, 09, P
AR-Y = JUJUY, 10, Y
AR-L = LA PAMPA, 11, L
AR-F = LA RIOJA, 12, F
AR-M = MENDOZA, 13, M
AR-Q = NEUQUEN, 15, Q
AR-R = RIO NEGRO, 16, R
AR-A = SALTA, 17, A
AR-J = SAN JUAN, 18, J
AR-D = SAN LUIS, 19, D
AR-Z = SANTA CRUZ, 20, Z
AR-S = SANTA FE, 21, S
AR-G = SANTIAGO DEL ESTERO, 22, G
AR-V = TIERRA DEL FUEGO, 23, V
AR-T = TUCUMAN, 24, T
AR-N = MISIONES, 14, N
...            

	 The purpose of a node property file is to provide additional information about identifiers of administrative divisions. For more
information on STEM's properties files, please read "An Introduction To STEM Properties Files" found at org.eclipse.stem.utility\docs.

    
**Generation of Population Properties Files**

		There are two intermediate steps to be done before generating a population property file. First, we have to run both, Admin1LexSorter and Admin2LexSorter to generate a set of files were
administrations for a given country are sorted lexicographically as was previously explained in this document. Next, we run org.eclipse.stem.utility.generators\PopulationProfiler.java.
PopulationProfiler.java is a program that creates a profile of all the level 1 administrations of a country based on population and on the number of
level 2 administrations that belong or are contained in it. This is a necessary step since we are missing some exact population data and by knowing the relationship of level 2 administration to its 
container we can easily compute an approximate population value. Finally, we run org.eclipse.stem.utility\PopulationGenerator.java to genererate a population property file. For a single country, 
a population property file will be generated for each administrative level. For Argentina, the corresponding population property files produced will be :

ARG_0_human_2006.properties
ARG_1_human_2006.properties
ARG_2_human_2006.properties
		
		 A sample node property file for Argentina looks as follows :

// Extracted from org.eclipse.stem.internal.data\resources\data\country\ARG_1_human_2006.properties
...
# The population identifier
POPULATION = human

# State/Province
AR-B = 13827203
AR-C = 2776138
AR-K = 334568
AR-H = 984446
AR-U = 413237
AR-X = 3066801
AR-W = 930991
AR-E = 1158147
AR-P = 486559
AR-Y = 611888
AR-L = 299294
AR-F = 289983
AR-M = 1579651
AR-Q = 474155
...

    The purpose of a population property file is to provide population data of administrative divisions. For more 
information on STEM's properties files, please read "An Introduction To STEM Properties Files" found at org.eclipse.stem.utility\docs.
    

**Generation of Area Properties Files**

	In a similar way to the population generation process, there is an intermediate step to be done before generating an area property file. We have to run
org.eclipse.stem.utility\PolygonAreaGenerator.java to generate a set of files with areas in polygon units for every administration in a country. This is 
a necessary step since we are missing some exact area data. Having polygon area values (in polygon units) helps to compute an approximate area value. Finally, 
we run org.eclipse.stem.utility\AreaGenerator.java to genererate an area property file. For a single country, an area property file will be generated for each 
administrative level.  For Argentina, the corresponding area property files produced will be :

ARG_0_area.properties
ARG_1_area.properties
ARG_2_area.properties
		
		 A sample area property file for Argentina looks as follows :

// Extracted from org.eclipse.stem.internal.data\resources\data\country\ARG_1_area.properties
...
# This is the source of the data
SOURCE = http://www.xist.org/cntry/argentina.aspx
# SOURCE = http://en.wikipedia.org/wiki/Argentina

# State/Province
AR-B = 307571
AR-C = 200
AR-K = 102602
AR-H = 99633
AR-U = 224686
AR-X = 165321
AR-W = 88199
AR-E = 78781
AR-P = 72066
AR-Y = 53219
AR-L = 143440
AR-F = 89680
AR-M = 148827
AR-Q = 94078
AR-R = 203013
...

    The purpose of an area property file is to provide area data of administrative divisions. For more 
information on STEM's properties files, please read "An Introduction To STEM Properties Files" found at org.eclipse.stem.utility\docs.
    

**Map Generation**
  
     To generate maps we run an instance of org.eclipse.stem.utility\src\generators\GMLGenerator. GMLGenerator will create and XML file for each country in our dataset.
The maps are created using GML (Geography Markup Language) which is an XML grammar. According to Wikipedia, " The Geography Markup Language (GML) is the XML grammar defined by the Open Geospatial Consortium (OGC) to express 
geographical features. GML serves as a modeling language for geographic systems as well as an open interchange format for geographic transactions on the Internet."  All maps are found under
org.eclipse.stem.geography\resources\data\geo\country\. There can be more than one map for each country. In fact, there is a map for every administrative level for which we have polygon data available.
For Argentina, there are three corresponding maps :

	ARG_0_MAP.xml
	ARG_1_MAP.xml
	ARG_2_MAP.xml
	
As an example, for Armenia the contents of the level 1 map looks as follows :

# Taken from ARM_1_MAP.xml
<Map>

<title>ARM Level 1 Map</title>

<subTitle>Administrative Boundaries</subTitle>

<updated>Tue Nov 07 16:57:55 PST 2006 </updated>

	<entry>

	<georss:where>

	  <gml:Polygon gml:id="AM-ER">

	    <gml:outerBoundaryIs>

	       <gml:LinearRing>

	         <gml:posList>

		         41.301422 45.004055 ... 41.301624 45.000002 41.301422 45.004055 
		
   	        </gml:posList>

          </gml:LinearRing>

       </gml:outerBoundaryIs>

     </gml:Polygon>

    </georss:where>

   </entry>

</Map>


**Putting It All Together : running Properties Generator**

   To be able to run properties files and maps we have developed a program whose purpose is to run all the generators on a given list of
countries. To do this, we run org.eclipse.stem.utility/src/generators/PropertiesGenerator.java. The generator will go through each single
country in the list and do all necessary work. The main logic for PropertiesGenerator is shown next :


		...
		final int CONFIG_FILE = 0;
		final int PARAMS = 1;

		if (args.length < PARAMS) {
			System.out.println("--Wrong arguments--"); //$NON-NLS-1$
			System.out
					.println("\tTo run, please provide the following argument(s) : "); //$NON-NLS-1$
			System.out.println("\t\t Configuration file"); //$NON-NLS-1$
			System.exit(1);
		}

		// Generate the names.properties files for each country.
		NameGenerator nameGen = new NameGenerator(args[CONFIG_FILE]);
		nameGen.run();

		// Run garbage collection
		System.gc();

		// Generate the population.properties files for each country.
		PopulationGenerator popGen = new PopulationGenerator(args[CONFIG_FILE]);
		popGen.run();

		// Run garbage collection
		System.gc();

		// Generate the area.properties files for each country.
		AreaGenerator areaGen = new AreaGenerator(args[CONFIG_FILE]);
		areaGen.run();

		// Run garbage collection
		System.gc();

		// Generate the node.properties files for each country.
		NodeDataGenerator nodeDataGen = new NodeDataGenerator(args[CONFIG_FILE]);
		nodeDataGen.run();

		// Run garbage collection
		System.gc();

		// Generate the GML files for each country.
		GMLGenerator gmlGen = new GMLGenerator(args[CONFIG_FILE]);
		gmlGen.run();
		...
