Friday, 6 March 2015

How to find flat triangles in a TIN

Flat triangles and edges are common artifacts in triangular irregular network (TIN) surfaces created from contour line. They occur where the three nodes of a triangle, or the two nodes of a triangle edge, are derived from the same elevation contour. They are artifacts of the model which do not represent the true elevation at these places.

Flat triangles and edges can be located in a number of ways in ArcGIS.

  1. Display the original contour lines or the TIN soft-edges over the TIN model and look for triangles and edges in with nodes derived from contour lines with the same elevation.
  2. Use the Information tool to explore how values change within a triangle or along an edge. If all values are the same it is flat.
  3. Display the TIN in ArcScene and look for "flat looking" triangles. Confirm with the information tool.
  4. Render the TIN to show slope. In the TIN Symbology tab Add... a Face slope with graduated color ramp renderer.  Now change to symbology levels to differentiate triangles with very low slope from those with a slope.

The red triangles are flat or very nearly flat.

ArcGIS Background Processing error

If a tool returns a Background Processing error then you should try running the tool with background processing turned off.

To turn off background processing select Geoprocessing Options... from the Geoprocessing menu and, in the dialog, uncheck the Enable Background Processing checkbox.

Disabling background processing means that you cannot work in ArcGIS until tools have finished working. A minor issue compared to the tool not working at all. If this does not fix the problem then report it to the KU IT Helpdesk and the module leader.

ArcGIS: Tool Not Licensed error

You will get a "Tool Not Licensed" error when trying to use an ArcGIS Tool, such as Create TIN or Flow Direction, and the ArcGIS Extension that the tool is part of is not enabled.

To use the tool you must active the extension. The error dialog should inform you which extension the tool is part of. In this case the Flow Direction tool is part of the Spatial Analyst extension, whereas the Create TIN tool is part of the 3D Analyst extension.

To enable extensions, select Extensions.. from the Customize menu and check the extensions that you need. The tool should now work.

Tuesday, 2 December 2014

HTML checkboxes, Javascript and PHP

So you want to select one or more HTML checkboxes and then use Javascript call a PHP program that returns data from a database usingan SQL query that OR's the checked items?

In this example, data on London Tube Stations in one or more zones is extracted from a MySQL database when any of the check boxes for zones is toggled.


First we need to write the HTML to display a check box for each zone. When the user checks, or unchecks, the getstations() Javascript function fires. This program posts an HTTP get request to stations.php, which returns information on stations. The results are written to an HTML div. For brevity only three zones are coded.

      <title>Checkbox Example</title>  
      <script type="text/javascript" src="stations.js"></script>  
      <script type="text/javascript" src="utils.js"></script>  
           <h1>Display Stations in Zones</h1>  
                <input type="checkbox" name="zone" value="1" onclick="getstations();"> Zone 1<br>  
                <input type="checkbox" name="zone" value="2" onclick="getstations();"> Zone 2<br>  
                <input type="checkbox" name="zone" value="3" onclick="getstations();"> Zone 3<br>  
           <h2> Stations</h2>  
           <div id="stations">  


We shall now write a PHP program that returns an XML file containing data on the stations. Data is encoded as attributes within station tags.

   // Make a MySQL Connection  
   $connection = mysql_connect("localhost", "root", "");  
   if (!$connection) {  
    die('Not connected : ' . mysql_error());  
   // Use the kyr_db DB  
   $db_selected = mysql_select_db("kyr_db");  
   if (!$db_selected) {  
    die ('Can\'t use db : ' . mysql_error());  
   // get the zone HTTP parameter  
   $zone_list = $_GET["zones"];  
   // Explode comma separated list of zones  
   $zones = explode(",",$zone_list);  
   // Build SQL Query  
   // The query needs an OR operator inserted for the second and subsequent clauses.  
   $query = "SELECT * FROM kyr_london_tube_stations WHERE";  
   $or = 0;  
   foreach ($zones as $zone) {  
           if ($or == 0) {  
                $query = $query . " zone = " . $zone;  
                $or = 1;  
           } else {  
           $query = $query . " OR zone = " . $zone;  
   // Retrieve data from the stations table  
   $result = mysql_query($query);  
   if (!$result) {  
    die('Invalid query: ' . mysql_error());  
   // Set the content type, then write the XML file  
  header ("Content-Type:text/xml");  
   // Open shapes tag  
   echo '<stations>';  
   // Loop through results extracting values   
   while ($row = mysql_fetch_array($result)) {  
           $name = htmlentities($row['NAME']);  
           $zone = htmlentities($row['ZONE']);;  
           echo '<station name="' . $name . '" zone="' . $zone . '"/>';   
   // Close shapes tag  
  echo '</stations>';  
   // Close database connection  


Finally, need to write the getstations() Javascript function that will make an AJAX request to the MySQL database. This function calls the downloadUrl() function in utils.js to undertake the XmlHttpRequest.

 function getstations() {  
       var zones = document.getElementsByName("zone");  
      var zone_ids = [];  
      var text = "";  
      // Clear text in div  
      document.getElementById("stations").innerHTML = text  
      for (var i = 0; i < zones.length; i++) {  
           if (zones[i].checked) {  
      if (zone_ids.length > 0) {  
           var ids_list = zone_ids.toString();  
           url = "stations.php?zones=" + ids_list;  
           downloadUrl(url, function(data) {  
                var rows = data.documentElement.getElementsByTagName("station");  
                if (rows.length > 0) {  
                     for (var i = 0; i < rows.length; i++) {  
                          text = text + rows[i].getAttribute("name") + " " + rows[i].getAttribute("zone") + "</br>";  
                // Write text to div  
                document.getElementById("stations").innerHTML = text;  

Thursday, 9 January 2014

3D visualisation of Sanborn Maps for Charlottesville, VA

The Sanborn Fire Insurance Maps are a great source of information on the history of urban development in the US. As part of the Spatial Data Management and Manipulation module of their BSc in Geographical Information Systems at Kingston University students created a geodatase of landuse and building height for part of Charlottesville, Vaginia. To visualise database contents students created 3D visualisations in ArcScene. This one was created by Alvin Ancindor, Katso Matchediso, Amy Pritchard and Brian Setswamorago from the 1920 Sanborn maps. While coverage is incomplete, it remains impressive.

Friday, 6 December 2013

Animated Tornado Density Map

Density of Tornado Tracks within a 41km search radius and population of large cities (blue bars). Data from National Weather Service (2012) Student work by Amy Harris, submitted for MSc modules in GIS and Hazards, Kingston University London.

Thursday, 5 December 2013

GIS in Action Video

A short promotional film of geovisualations by GIS staff and students in the School of Geography, Geology and the Environment, Kingston University London.