<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-2420860529344694449</id><updated>2012-02-02T12:28:21.678-08:00</updated><category term='nostalgia'/><category term='computation'/><category term='jts'/><category term='computational geometry'/><category term='geocoding'/><category term='javascript'/><category term='cloud computing'/><category term='java'/><category term='news'/><category term='web'/><category term='REST'/><category term='books'/><category term='data model'/><category term='jeql'/><category term='geoweb'/><category term='kml'/><category term='gis'/><category term='humour'/><category term='lisp'/><category term='computer art'/><category term='conference'/><category term='postgis'/><category term='open source'/><category term='algorithms'/><category term='google-earth'/><category term='foss4g'/><category term='gps'/><category term='geometry'/><category term='geospatial'/><category term='bing'/><category term='cartography'/><category term='GTFS'/><category term='ogc simple features'/><category term='software'/><category term='opengeo'/><category term='mathematics'/><category term='microsoft'/><category term='web mapping'/><category term='uml'/><category term='population explosion'/><category term='json'/><category term='hardware'/><category term='database'/><category term='google'/><category term='presentations'/><title type='text'>Lin.ear th.inking</title><subtitle type='html'>Because the shortest distance between two thoughts is a straight line</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://lin-ear-th-inking.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2420860529344694449/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://lin-ear-th-inking.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><link rel='next' type='application/atom+xml' href='http://www.blogger.com/feeds/2420860529344694449/posts/default?start-index=101&amp;max-results=100'/><author><name>Dr JTS</name><uri>http://www.blogger.com/profile/02383381220154739793</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>144</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-2420860529344694449.post-1844832275970189772</id><published>2012-01-27T20:06:00.000-08:00</published><updated>2012-01-27T20:06:54.804-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='conference'/><category scheme='http://www.blogger.com/atom/ns#' term='foss4g'/><category scheme='http://www.blogger.com/atom/ns#' term='geospatial'/><title type='text'>Let's do it again at FOSS4G-NA!</title><content type='html'>&lt;a href="http://2011.foss4g.org/"&gt;FOSS4G 2011&lt;/a&gt; in Denver last September was such a good time, we're going to do it all over again at &lt;a href="http://foss4g-na.org/"&gt;FOSS4G North America 2012&lt;/a&gt;!&amp;nbsp;&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-qE6ZC9aFtKQ/TyNzu2LqpkI/AAAAAAAAA8I/LTCK5nyU724/s1600/foss4g-na-2012.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="46" src="http://1.bp.blogspot.com/-qE6ZC9aFtKQ/TyNzu2LqpkI/AAAAAAAAA8I/LTCK5nyU724/s400/foss4g-na-2012.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;It will be interesting to see who and how many attend.&amp;nbsp; Some conference budgets might have been blown last year - but note that this event is cleverly timed to fall into a new fiscal!&amp;nbsp; And being in D.C. there should be lots of suits and spooks in attendance.&lt;br /&gt;&lt;br /&gt; I'm definitely looking forward to building on the momentum from the last conference, especially given &lt;a href="http://opengeo.org/about/team/martin.davis/"&gt;my new gig with OpenGeo&lt;/a&gt; (ok, I'm definitely not booth-babe material - but being a booth-geek is probably more fun).&amp;nbsp;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2420860529344694449-1844832275970189772?l=lin-ear-th-inking.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lin-ear-th-inking.blogspot.com/feeds/1844832275970189772/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2420860529344694449&amp;postID=1844832275970189772&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2420860529344694449/posts/default/1844832275970189772'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2420860529344694449/posts/default/1844832275970189772'/><link rel='alternate' type='text/html' href='http://lin-ear-th-inking.blogspot.com/2012/01/lets-do-it-again-at-foss4g-na.html' title='Let&apos;s do it again at FOSS4G-NA!'/><author><name>Dr JTS</name><uri>http://www.blogger.com/profile/02383381220154739793</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/-qE6ZC9aFtKQ/TyNzu2LqpkI/AAAAAAAAA8I/LTCK5nyU724/s72-c/foss4g-na-2012.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2420860529344694449.post-9150010247655536224</id><published>2011-11-17T22:32:00.001-08:00</published><updated>2011-11-17T22:37:14.593-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='humour'/><category scheme='http://www.blogger.com/atom/ns#' term='geospatial'/><title type='text'>Your Favourite Map Projection</title><content type='html'>...and &lt;a href="http://xkcd.com/977/"&gt;what it says about you&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-22B2mP8JNHM/TsX8mj02uRI/AAAAAAAAA8A/QMjrMZzuwyw/s1600/your_fav_map_proj.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://1.bp.blogspot.com/-22B2mP8JNHM/TsX8mj02uRI/AAAAAAAAA8A/QMjrMZzuwyw/s1600/your_fav_map_proj.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;br /&gt;&lt;a href="http://xkcd.com/"&gt;XKCD &lt;/a&gt;goes geospatial!&amp;nbsp; (Happens to everything eventually...)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2420860529344694449-9150010247655536224?l=lin-ear-th-inking.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lin-ear-th-inking.blogspot.com/feeds/9150010247655536224/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2420860529344694449&amp;postID=9150010247655536224&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2420860529344694449/posts/default/9150010247655536224'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2420860529344694449/posts/default/9150010247655536224'/><link rel='alternate' type='text/html' href='http://lin-ear-th-inking.blogspot.com/2011/11/your-favourite-map-projection.html' title='Your Favourite Map Projection'/><author><name>Dr JTS</name><uri>http://www.blogger.com/profile/02383381220154739793</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/-22B2mP8JNHM/TsX8mj02uRI/AAAAAAAAA8A/QMjrMZzuwyw/s72-c/your_fav_map_proj.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2420860529344694449.post-3494546159852533641</id><published>2011-11-10T09:42:00.001-08:00</published><updated>2011-11-10T09:51:59.881-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='opengeo'/><title type='text'>OpenGeo Interview</title><content type='html'>My &lt;a href="http://blog.opengeo.org/2011/11/08/opengeo-connections-meet-martin-davis/"&gt;name in lights&lt;/a&gt; once again. &amp;nbsp;If this keeps up I'm going to have to start asking for an &lt;a href="http://en.wikipedia.org/wiki/Rider_(theater)#Unreasonable_requests"&gt;outrageous rider&lt;/a&gt;...&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://opengeo.org/products/opengeosuite-sm.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://opengeo.org/products/opengeosuite-sm.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2420860529344694449-3494546159852533641?l=lin-ear-th-inking.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lin-ear-th-inking.blogspot.com/feeds/3494546159852533641/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2420860529344694449&amp;postID=3494546159852533641&amp;isPopup=true' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2420860529344694449/posts/default/3494546159852533641'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2420860529344694449/posts/default/3494546159852533641'/><link rel='alternate' type='text/html' href='http://lin-ear-th-inking.blogspot.com/2011/11/opengeo-interview.html' title='OpenGeo Interview'/><author><name>Dr JTS</name><uri>http://www.blogger.com/profile/02383381220154739793</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2420860529344694449.post-609813391533149185</id><published>2011-10-27T22:50:00.000-07:00</published><updated>2011-10-27T22:50:13.919-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='population explosion'/><title type='text'>Sobering thought</title><content type='html'>According to this &lt;a href="http://www.bbc.co.uk/news/world-15391515"&gt;interesting BBC page on population&lt;/a&gt;, the number of humans on Earth has more than doubled in my lifetime.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-AJYaNdBNEnQ/TqpB5_FWbqI/AAAAAAAAA70/kwI6AAK_-vg/s1600/where_do_you_fit_in.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="345" src="http://3.bp.blogspot.com/-AJYaNdBNEnQ/TqpB5_FWbqI/AAAAAAAAA70/kwI6AAK_-vg/s640/where_do_you_fit_in.png" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Anyone who has spent time trying to speed up an O(n^2) algorithm knows this can't be a good thing...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2420860529344694449-609813391533149185?l=lin-ear-th-inking.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lin-ear-th-inking.blogspot.com/feeds/609813391533149185/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2420860529344694449&amp;postID=609813391533149185&amp;isPopup=true' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2420860529344694449/posts/default/609813391533149185'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2420860529344694449/posts/default/609813391533149185'/><link rel='alternate' type='text/html' href='http://lin-ear-th-inking.blogspot.com/2011/10/sobering-thought.html' title='Sobering thought'/><author><name>Dr JTS</name><uri>http://www.blogger.com/profile/02383381220154739793</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/-AJYaNdBNEnQ/TqpB5_FWbqI/AAAAAAAAA70/kwI6AAK_-vg/s72-c/where_do_you_fit_in.png' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2420860529344694449.post-7509124768167092505</id><published>2011-10-25T12:17:00.000-07:00</published><updated>2011-10-25T12:17:16.011-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='REST'/><category scheme='http://www.blogger.com/atom/ns#' term='jeql'/><title type='text'>Using a web service for Elevation from JEQL</title><content type='html'>MapQuest has a whole range of useful and freely available &lt;a href="http://open.mapquestapi.com/"&gt;web services for geospatial queries&lt;/a&gt;.&amp;nbsp; One of these is the &lt;a href="http://open.mapquestapi.com/elevation/"&gt;Open Elevation Service&lt;/a&gt;.&amp;nbsp; I thought it would be interesting to try it out using &lt;a href="http://tsusiatsoftware.net/jeql/main.html"&gt;JEQL&lt;/a&gt;'s capabilities of querying URLs and plotting datasets as images.&lt;br /&gt;&lt;br /&gt;The Open Elevation Service is extremely simple to use.&amp;nbsp; You just submit a URL containing the location:&lt;br /&gt;&lt;br /&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;span style="font-size: x-small;"&gt;http://open.mapquestapi.com/elevation/v1/getElevationProfile?callback=foo&amp;amp;shapeFormat=raw&amp;amp;latLngCollection=39.740112,-104.984856&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;and you get back a JSON (or XML) response with the elevation:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: x-small;"&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;foo({&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: x-small;"&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;"shapePoints":[39.740112,-104.984856],&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: x-small;"&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;"elevationProfile":[{"distance":0,"height":1616}],&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: x-small;"&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;"info":{"copyright":{"text":"Â© 2011 MapQuest, Inc.","imageUrl":"http://tile21.mqcdn.com/res/mqlogo.gif","imageAltText":"Â© 2011 MapQuest, Inc."},&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: x-small;"&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;"statuscode":0,&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: x-small;"&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;"messages":[]}&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: x-small;"&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;});&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;JEQL doesn't (yet) do JSON parsing, but it's easy to pick out the height attribute with a simple RegEx:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: x-small;"&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;height = RegEx.extract(elevJson, \'"height":(-?\d+)\}'); &lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Querying over a grid of locations provides a dataset which is a gridded Digital Elevation Model (DEM).&amp;nbsp; JEQL provides a function to generate a table which is a grid of integers, so it's easy to produce a grid of lat/long locations:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: x-small;"&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;loc = select baseLat + i * cellSize lat, &lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;baseLon + j * cellSize lon&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; from Generate.grid(1, gridSize, 1, gridSize); &lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Once the elevations for all locations are retrieved,&amp;nbsp; the locations are used to compute square cells (polygons) which cover the area, and the cells are symbolized with a fill value from a suitable color map based on elevation.&lt;br /&gt;&lt;br /&gt;Here's the final result.&amp;nbsp; It's slightly squashed in aspect ratio, since the data grid is in the lat/long coordinate system.&amp;nbsp; The obvious data dropouts seem to be hard errors in the MapQuest service, which is slightly surprising.&amp;nbsp; But's it's recognizably Mt. St. Helens - you can even see the &lt;a href="http://en.wikipedia.org/wiki/1980_eruption_of_Mount_St._Helens#Later_eruptions"&gt;lava dome&lt;/a&gt; in the crater!&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-XYYFPoRXDyY/TqZAgvtm5QI/AAAAAAAAA7s/caCMfVfiA7k/s1600/dem.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="400" src="http://2.bp.blogspot.com/-XYYFPoRXDyY/TqZAgvtm5QI/AAAAAAAAA7s/caCMfVfiA7k/s400/dem.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Not surprisingly, this isn't quick to generate - the service runs at about 10 queries per second.&amp;nbsp; (Actually, that seems pretty reasonable for a free web service!).&amp;nbsp; The service does support querying multiple points per request - I might try to see if this decreases the latency (although this might be a bit complex to express in JEQL).&lt;br /&gt;&lt;br /&gt;Here's the whole script:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: x-small;"&gt;&lt;code&gt;//--------------------------------------&lt;br /&gt;//&lt;br /&gt;// Plots a DEM generated using the MapQuest Elevation service&lt;br /&gt;//&lt;br /&gt;//--------------------------------------&lt;br /&gt;baseLat = 46.16 ;&amp;nbsp; baseLon = -122.25;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Mt St Helens&lt;br /&gt;areaSize = 0.10;&lt;br /&gt;gridSize = 100;&lt;br /&gt;cellSize = areaSize / gridSize;&lt;br /&gt;&lt;br /&gt;//---- Generate location grid&lt;br /&gt;loc = select &amp;nbsp;&amp;nbsp;&amp;nbsp; baseLat + i * cellSize lat, &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; baseLon + j * cellSize lon&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; from Generate.grid(1, gridSize, 1, gridSize);&lt;br /&gt;&lt;br /&gt;//---- Query elevation service for each grid point&lt;br /&gt;telev = select lat, lon, elevJson, elev &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; with {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; url = $"http://open.mapquestapi.com/elevation/v1/getElevationProfile?callback=foo&amp;amp;shapeFormat=raw&amp;amp;latLngCollection=${lat},${lon}";&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; elevJson = Net.readURLnoEOL(url);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; height = RegEx.extract(elevJson, \'"height":(-?\d+)\}');&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; elev = Val.toInt(height);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; from loc;&lt;br /&gt;Mem telev;&lt;br /&gt;&lt;br /&gt;//---- Create raster cell boxes, symbolize with color map based on elevation, and plot&lt;br /&gt;minElev = 800.0; maxElev = 2500.0;&lt;br /&gt;tplot = select Geom.createBoxExtent(lon, lat, cellSize, cellSize) cell,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; Color.interpolate("00a000", "ffb000", "aaaaaa", "ffffff", index) style_fillColor&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; with {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; index = (elev - minElev) / (maxElev - minElev);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; from telev;&lt;br /&gt;&lt;br /&gt;textent = select geomExtent(cell) from tplot;&lt;br /&gt;&lt;br /&gt;Plot &amp;nbsp;&amp;nbsp;&amp;nbsp; extent: val(textent)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; data: tplot&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; file: "dem.png";&lt;code&gt;&lt;/code&gt;&lt;/code&gt;&lt;/span&gt;&lt;code&gt;&lt;code&gt;&lt;/code&gt;&lt;/code&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2420860529344694449-7509124768167092505?l=lin-ear-th-inking.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lin-ear-th-inking.blogspot.com/feeds/7509124768167092505/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2420860529344694449&amp;postID=7509124768167092505&amp;isPopup=true' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2420860529344694449/posts/default/7509124768167092505'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2420860529344694449/posts/default/7509124768167092505'/><link rel='alternate' type='text/html' href='http://lin-ear-th-inking.blogspot.com/2011/10/using-web-service-for-elevation-from.html' title='Using a web service for Elevation from JEQL'/><author><name>Dr JTS</name><uri>http://www.blogger.com/profile/02383381220154739793</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/-XYYFPoRXDyY/TqZAgvtm5QI/AAAAAAAAA7s/caCMfVfiA7k/s72-c/dem.png' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2420860529344694449.post-406878802218890186</id><published>2011-10-24T20:09:00.000-07:00</published><updated>2011-10-24T20:09:36.912-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='lisp'/><category scheme='http://www.blogger.com/atom/ns#' term='news'/><category scheme='http://www.blogger.com/atom/ns#' term='computation'/><title type='text'>(r-i-p (john mccarthy))</title><content type='html'>John McCarthy, inventor of LISP, &lt;a href="http://news.cnet.com/8301-1001_3-20125026-92/john-mccarthy-creator-of-lisp-programming-language-dies/"&gt;has died&lt;/a&gt; at age 84.&amp;nbsp;&lt;br /&gt;&lt;br /&gt;Having finally balanced his parentheses, his atoms can now be returned to the free list.&lt;br /&gt;&lt;br /&gt;Jobs, Ritchie, McCarthy - so many of the greats passing.... &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2420860529344694449-406878802218890186?l=lin-ear-th-inking.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lin-ear-th-inking.blogspot.com/feeds/406878802218890186/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2420860529344694449&amp;postID=406878802218890186&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2420860529344694449/posts/default/406878802218890186'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2420860529344694449/posts/default/406878802218890186'/><link rel='alternate' type='text/html' href='http://lin-ear-th-inking.blogspot.com/2011/10/r-i-p-john-mccarthy.html' title='(r-i-p (john mccarthy))'/><author><name>Dr JTS</name><uri>http://www.blogger.com/profile/02383381220154739793</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2420860529344694449.post-4796094932127077866</id><published>2011-10-07T11:49:00.000-07:00</published><updated>2011-10-07T11:49:04.583-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='jeql'/><category scheme='http://www.blogger.com/atom/ns#' term='GTFS'/><title type='text'>Extracting GTFS data using JEQL</title><content type='html'>Once you understand the &lt;a href="http://code.google.com/transit/spec/transit_feed_specification.html"&gt;General Transit Feed Specification&lt;/a&gt; (GTFS) &lt;a href="http://lin-ear-th-inking.blogspot.com/2011/09/data-model-diagrams-for-gtfs.html"&gt;data model&lt;/a&gt;, the next step is to transform the data into a format usable in GIS tools. &amp;nbsp;As usual, that means shapefiles (sigh...). &amp;nbsp;Here's a &lt;a href="http://tsusiatsoftware.net/jeql/main.html"&gt;JEQL&lt;/a&gt; script that extracts the geometry of all unique trips (aka "route patterns"), as well as the stop locations.&lt;br /&gt;&lt;br /&gt;Some interesting aspects of the script:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;the GTFS spatial data is in geographic coordinates (lat/long). The script projects this into &lt;a href="http://spatialreference.org/ref/epsg/3005/"&gt;BC-Albers&lt;/a&gt; (EPGS code 3005) using the &lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;CRS.project()&lt;/span&gt; function. &amp;nbsp;Many other coordinate systems could be used (or none -&amp;nbsp;e.g. for output to KML)&lt;/li&gt;&lt;li&gt;the &lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;geomConnect()&lt;/span&gt;aggregate function connects Points into LineStrings&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-size: x-small;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;pre&gt;&lt;span class="Apple-style-span" style="font-size: x-small;"&gt;/*=======================================================&lt;br /&gt;Extracts Trips (with shapes) and stops from from a GTFS dataset. &lt;br /&gt;Includes shape, trip and route information.&lt;br /&gt;Spatial data is converted from Geographic to BC-ALbers&lt;br /&gt;&lt;br /&gt;Usage Notes:&lt;br /&gt;- indir: directory containing the input GTFS files&lt;br /&gt;========================================================*/&lt;br /&gt;&lt;br /&gt;indir = "";  outdir = "";&lt;br /&gt;&lt;br /&gt;//========================================================&lt;br /&gt;//  Extract Trips with unique linework, with route information&lt;br /&gt;//========================================================&lt;br /&gt;CSVReader tshape hasColNames: file: indir+"shapes.txt";&lt;br /&gt;CSVReader ttrip hasColNames: file: indir+"trips.txt";&lt;br /&gt;CSVReader troutes hasColNames: file: indir+"routes.txt";  &lt;br /&gt;Mem troutes;&lt;br /&gt;&lt;br /&gt;crs_BCAlbers = "EPSG:3005";&lt;br /&gt;&lt;br /&gt;//--- extract unique shapes&lt;br /&gt;trips = select distinct route_id, trip_headsign, shape_id &lt;br /&gt;    from ttrip;&lt;br /&gt;&lt;br /&gt;//--- extract trip pts and order them in sequence&lt;br /&gt;tpt = select shape_id, Val.toInt(shape_pt_sequence) seq,&lt;br /&gt;		Geom.createPoint(Val.toDouble(shape_pt_lon), &lt;br /&gt;                                 Val.toDouble(shape_pt_lat) ) pt&lt;br /&gt;	from tshape&lt;br /&gt;	order by shape_id, seq;&lt;br /&gt;&lt;br /&gt;//--- connect pts into lines and project&lt;br /&gt;tline = select shape_id, &lt;br /&gt;     CRS.project(Geom.toMulti(geomConnect(pt)), crs_BCAlbers) geom&lt;br /&gt;	from tpt&lt;br /&gt;	group by shape_id;&lt;br /&gt;	&lt;br /&gt;//--- join route info to trip shape&lt;br /&gt;trouteLines = select r.route_id, r.agency_id, &lt;br /&gt;    r.route_short_name, r.route_long_name,&lt;br /&gt;    r.route_type, r.route_url,&lt;br /&gt;    trip_headsign, l.*&lt;br /&gt;        from tline l&lt;br /&gt;        join trips t on t.shape_id == l.shape_id&lt;br /&gt;        join troutes r on r.route_id == t.route_id;&lt;br /&gt;&lt;br /&gt;ShapefileWriter trouteLines file: outdir+"gtfs_trips.shp";&lt;br /&gt;&lt;br /&gt;//========================================================&lt;br /&gt;//  Extract Stop points&lt;br /&gt;//========================================================&lt;br /&gt;CSVReader tstopsRaw hasColNames: file: indir+"stops.txt";&lt;br /&gt;&lt;br /&gt;tstop = select stop_id,stop_code,stop_name,stop_desc,&lt;br /&gt;        CRS.project(Geom.createPoint(&lt;br /&gt;	    Val.toDouble(stop_lon), &lt;br /&gt;	    Val.toDouble(stop_lat) ), crs_BCAlbers) pt,&lt;br /&gt;        zone_id&lt;br /&gt;        from tstopsRaw;&lt;br /&gt;&lt;br /&gt;ShapefileWriter tstop file: outdir+"gtfs_stops.shp";&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;Using this script on the GTFS data for Metro Vancouver (available from TransLink &lt;a href="http://www.translink.ca/en/Schedules-and-Maps/Developer-Resources.aspx"&gt;here&lt;/a&gt;) produces a dataset that looks like this:&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-bOtgxy3jF4E/To9HCc1IrYI/AAAAAAAAA7o/WAwUC8D50ks/s1600/GTFS_view.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="325" src="http://3.bp.blogspot.com/-bOtgxy3jF4E/To9HCc1IrYI/AAAAAAAAA7o/WAwUC8D50ks/s400/GTFS_view.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2420860529344694449-4796094932127077866?l=lin-ear-th-inking.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lin-ear-th-inking.blogspot.com/feeds/4796094932127077866/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2420860529344694449&amp;postID=4796094932127077866&amp;isPopup=true' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2420860529344694449/posts/default/4796094932127077866'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2420860529344694449/posts/default/4796094932127077866'/><link rel='alternate' type='text/html' href='http://lin-ear-th-inking.blogspot.com/2011/10/extracting-gtfs-data-using-jeql.html' title='Extracting GTFS data using JEQL'/><author><name>Dr JTS</name><uri>http://www.blogger.com/profile/02383381220154739793</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/-bOtgxy3jF4E/To9HCc1IrYI/AAAAAAAAA7o/WAwUC8D50ks/s72-c/GTFS_view.png' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2420860529344694449.post-2183573333751432204</id><published>2011-10-07T10:21:00.000-07:00</published><updated>2011-10-07T10:21:49.734-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='jts'/><title type='text'>JTS &amp; GEOS Wordles</title><content type='html'>For my JTS talk at FOSS4G I created a couple of &lt;a href="http://www.wordle.net/"&gt;Wordles&lt;/a&gt; showing systems which use JTS and GEOS. &amp;nbsp;Here they are for posterity (and because I love seeing Wordles...)&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-T0bJy1v32XI/To80v5o5gtI/AAAAAAAAA7g/RGt7-3LjCwA/s1600/JTS_Wordle.PNG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="186" src="http://1.bp.blogspot.com/-T0bJy1v32XI/To80v5o5gtI/AAAAAAAAA7g/RGt7-3LjCwA/s400/JTS_Wordle.PNG" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-pdAY0vf3qnQ/To80wA6rqUI/AAAAAAAAA7k/35YVClTcpTE/s1600/GEOS_Wordle.PNG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="252" src="http://1.bp.blogspot.com/-pdAY0vf3qnQ/To80wA6rqUI/AAAAAAAAA7k/35YVClTcpTE/s400/GEOS_Wordle.PNG" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2420860529344694449-2183573333751432204?l=lin-ear-th-inking.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lin-ear-th-inking.blogspot.com/feeds/2183573333751432204/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2420860529344694449&amp;postID=2183573333751432204&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2420860529344694449/posts/default/2183573333751432204'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2420860529344694449/posts/default/2183573333751432204'/><link rel='alternate' type='text/html' href='http://lin-ear-th-inking.blogspot.com/2011/10/jts-geos-wordles.html' title='JTS &amp; GEOS Wordles'/><author><name>Dr JTS</name><uri>http://www.blogger.com/profile/02383381220154739793</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/-T0bJy1v32XI/To80v5o5gtI/AAAAAAAAA7g/RGt7-3LjCwA/s72-c/JTS_Wordle.PNG' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2420860529344694449.post-8251953504887338211</id><published>2011-09-29T13:48:00.000-07:00</published><updated>2011-09-29T13:48:43.868-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='web mapping'/><category scheme='http://www.blogger.com/atom/ns#' term='google'/><title type='text'>Lars Rasmussen on the startup of Google Maps</title><content type='html'>&lt;a href="http://www.startupsmart.com.au/growth/google-mapping-a-way-to-the-top.html"&gt;Here's some interesting background&lt;/a&gt; to where Google Maps came from. &amp;nbsp;Must feel pretty good to have created a revolution (slippy maps) - and maybe to have just missed creating another one (&lt;a href="http://wave.google.com/"&gt;Google Wave &lt;/a&gt;as an alternative to email).&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2420860529344694449-8251953504887338211?l=lin-ear-th-inking.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lin-ear-th-inking.blogspot.com/feeds/8251953504887338211/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2420860529344694449&amp;postID=8251953504887338211&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2420860529344694449/posts/default/8251953504887338211'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2420860529344694449/posts/default/8251953504887338211'/><link rel='alternate' type='text/html' href='http://lin-ear-th-inking.blogspot.com/2011/09/lars-rasmussen-on-startup-of-google.html' title='Lars Rasmussen on the startup of Google Maps'/><author><name>Dr JTS</name><uri>http://www.blogger.com/profile/02383381220154739793</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2420860529344694449.post-1760818812817588101</id><published>2011-09-27T10:06:00.000-07:00</published><updated>2011-09-27T10:06:43.413-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='data model'/><category scheme='http://www.blogger.com/atom/ns#' term='geospatial'/><category scheme='http://www.blogger.com/atom/ns#' term='GTFS'/><category scheme='http://www.blogger.com/atom/ns#' term='google'/><title type='text'>Data model diagrams for GTFS</title><content type='html'>Recently I've been doing some work with the &lt;b&gt;&lt;a href="http://en.wikipedia.org/wiki/General_Transit_Feed_Specification"&gt;General Transit Feed Specification&lt;/a&gt;&lt;/b&gt; (GTFS). &amp;nbsp;This is a simple data model initiated by Google, in order to allow transit organizations to publish their schedules for routing and visualization purposes.&lt;br /&gt;&lt;br /&gt;As usual, Google has nice, succinct &lt;a href="http://code.google.com/transit/spec/transit_feed_specification.html"&gt;documentation &lt;/a&gt;for the GTFS format (which is a set of CSV files embodying an implicit data model). &amp;nbsp;But I was surprised to find that they don't provide any kind of data model diagram showing the relationships between the various entities (files) in the model. &amp;nbsp;I have a feeling that they think this would be "too technical" for users - or maybe they just don't believe in using a long-established body of theory?&lt;br /&gt;&lt;br /&gt;So, to help my understanding of GTFS I put together a simple diagram of the data model. &amp;nbsp;I used Google Diagrams, which is why this looks a little primitive. &amp;nbsp; (Hmmm... maybe another reason they don't do diagrams is that they are religious about &lt;a href="http://en.wikipedia.org/wiki/Eating_your_own_dog_food"&gt;dog-fooding&lt;/a&gt;?)&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-ZujarlLNrdA/ToIAsFa-WxI/AAAAAAAAA7c/gBJc2SZjR1M/s1600/GTFS_data_model_diagram.PNG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="547" src="http://1.bp.blogspot.com/-ZujarlLNrdA/ToIAsFa-WxI/AAAAAAAAA7c/gBJc2SZjR1M/s640/GTFS_data_model_diagram.PNG" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;After doing this I found the paper&amp;nbsp;&lt;a href="http://www.dft.gov.uk/transmodel/schema/doc/GoogleTransit/TransmodelForGoogle-09.pdf"&gt;A Transmodel based XML schema&amp;nbsp;for the Google Transit Feed Specification&lt;/a&gt;, which&amp;nbsp;has a much more detailed UML model of GTFS:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-7dQA2B9ZDK0/ToH-l9_LBrI/AAAAAAAAA7Y/ghj1o5phzow/s1600/GTFS_UML.PNG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="640" src="http://2.bp.blogspot.com/-7dQA2B9ZDK0/ToH-l9_LBrI/AAAAAAAAA7Y/ghj1o5phzow/s640/GTFS_UML.PNG" width="513" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;The end goal of doing all this was to be able to transform a GTFS data feed into shapefile format. &amp;nbsp;For this I used a simple &lt;a href="http://www.tsusiatsoftware.net/jeql/main.html"&gt;JEQL &lt;/a&gt;script. &amp;nbsp;But that's another blog post.&lt;br /&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2420860529344694449-1760818812817588101?l=lin-ear-th-inking.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lin-ear-th-inking.blogspot.com/feeds/1760818812817588101/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2420860529344694449&amp;postID=1760818812817588101&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2420860529344694449/posts/default/1760818812817588101'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2420860529344694449/posts/default/1760818812817588101'/><link rel='alternate' type='text/html' href='http://lin-ear-th-inking.blogspot.com/2011/09/data-model-diagrams-for-gtfs.html' title='Data model diagrams for GTFS'/><author><name>Dr JTS</name><uri>http://www.blogger.com/profile/02383381220154739793</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/-ZujarlLNrdA/ToIAsFa-WxI/AAAAAAAAA7c/gBJc2SZjR1M/s72-c/GTFS_data_model_diagram.PNG' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2420860529344694449.post-7923531307447018941</id><published>2011-09-19T13:02:00.000-07:00</published><updated>2011-09-19T13:02:55.797-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='foss4g'/><title type='text'>Paul Ramsey's Keynote at FOSS4G 2011</title><content type='html'>As usual, Paul delivered a highly amusing and thought-provoking keynote at &lt;a href="http://2011.foss4g.org/"&gt;FOSS4G 2011&lt;/a&gt;. &amp;nbsp;For the benefit of the hard-core twitterless, the slides are &lt;a href="http://s3.cleverelephant.ca/foss4g2011_keynote.pdf"&gt;here&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-MrVueZ8vxew/TnGQxeH5Y6I/AAAAAAAAAZU/18jhzyrw-6A/s400/DSC02430.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="212" src="http://2.bp.blogspot.com/-MrVueZ8vxew/TnGQxeH5Y6I/AAAAAAAAAZU/18jhzyrw-6A/s320/DSC02430.jpg" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2420860529344694449-7923531307447018941?l=lin-ear-th-inking.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lin-ear-th-inking.blogspot.com/feeds/7923531307447018941/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2420860529344694449&amp;postID=7923531307447018941&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2420860529344694449/posts/default/7923531307447018941'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2420860529344694449/posts/default/7923531307447018941'/><link rel='alternate' type='text/html' href='http://lin-ear-th-inking.blogspot.com/2011/09/paul-ramseys-keynote-at-foss4g-2011.html' title='Paul Ramsey&apos;s Keynote at FOSS4G 2011'/><author><name>Dr JTS</name><uri>http://www.blogger.com/profile/02383381220154739793</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/-MrVueZ8vxew/TnGQxeH5Y6I/AAAAAAAAAZU/18jhzyrw-6A/s72-c/DSC02430.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2420860529344694449.post-5162421244653284840</id><published>2011-09-01T21:55:00.000-07:00</published><updated>2011-09-01T21:55:54.920-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='gps'/><category scheme='http://www.blogger.com/atom/ns#' term='geospatial'/><title type='text'>Everything you wanted to know about UK Coordinate Systems</title><content type='html'>Those helpful folks at the &lt;b&gt;UK Ordnance Survey&lt;/b&gt; have provided a fine reference &lt;b&gt;&lt;a href="http://www.ordnancesurvey.co.uk/oswebsite/gps/docs/A_Guide_to_Coordinate_Systems_in_Great_Britain.pdf"&gt;Guide to Coordinate Systems in Great Britain&lt;/a&gt;&lt;/b&gt;.&amp;nbsp; It's well worth reading if you're interested in the intricacies of &lt;b&gt;coordinate systems&lt;/b&gt;, &lt;b&gt;datums&lt;/b&gt;, &lt;b&gt;surveying &lt;/b&gt;and &lt;b&gt;GPS&lt;/b&gt;.&amp;nbsp; It's a bit technical, but if you can handle coding in Javascript you can probably get something out of it...&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-Pj7UlhDoOgk/TmBfGWP-lYI/AAAAAAAAA7U/zVpRIwbSs5Y/s1600/Ordnance+Survey+logo.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/-Pj7UlhDoOgk/TmBfGWP-lYI/AAAAAAAAA7U/zVpRIwbSs5Y/s1600/Ordnance+Survey+logo.png" /&gt;&lt;/a&gt;&lt;/div&gt;An interesting extract gives the general flavour:&lt;br /&gt;&lt;blockquote&gt;&lt;ul&gt;&lt;li&gt;&lt;i&gt;The WGS84 Cartesian axes and ellipsoid are geocentric; that is, their origin is the centre of mass of the whole Earth including oceans and atmosphere.&lt;/i&gt;&lt;/li&gt;&lt;li&gt;&lt;i&gt;The scale of the axes is that of the local Earth frame, in the sense of the relativistic theory of gravitation.&lt;/i&gt;&lt;/li&gt;&lt;li&gt;&lt;i&gt;Their orientation (that is, the directions of the axes, and hence the orientation of the ellipsoid equator and prime meridian of zero longitude) coincided with the equator and prime meridian of the Bureau Internationale de l’Heure at the moment in time 1984.0 (that is, midnight on New Year’s Eve 1983).&lt;/i&gt;&lt;/li&gt;&lt;li&gt;&lt;i&gt;Since 1984.0, the orientation of the axes and ellipsoid has changed such that the average motion of the crustal plates relative to the ellipsoid is zero. This ensures that the Z-axis of the WGS84 datum coincides with the International Reference Pole, and that the prime meridian of the ellipsoid (that is, the plane containing the Z and X Cartesian axes) coincides with the International Reference Meridian.&lt;/i&gt;&lt;/li&gt;&lt;li&gt;&lt;i&gt;The shape and size of the WGS84 biaxial ellipsoid is defined by the semi-major axis length a&amp;nbsp; 6378137.0 metres, and the reciprocal of flattening 1/f&amp;nbsp; 298.257223563. This ellipsoid is the same shape and size as the GRS80 ellipsoid.&lt;/i&gt;&lt;/li&gt;&lt;li&gt;&lt;i&gt;Conventional values are also adopted for the standard angular velocity of the Earth, and for the Earth gravitational constant. The first is needed for time measurement, and the second to define the scale of the system in a relativistic sense. &lt;/i&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/blockquote&gt;Now then, if you find yourself getting lost on the way from Foyle's to the nearest Lyon's tea shop, you can't say you haven't been warned!&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2420860529344694449-5162421244653284840?l=lin-ear-th-inking.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lin-ear-th-inking.blogspot.com/feeds/5162421244653284840/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2420860529344694449&amp;postID=5162421244653284840&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2420860529344694449/posts/default/5162421244653284840'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2420860529344694449/posts/default/5162421244653284840'/><link rel='alternate' type='text/html' href='http://lin-ear-th-inking.blogspot.com/2011/09/everything-you-wanted-to-know-about-uk.html' title='Everything you wanted to know about UK Coordinate Systems'/><author><name>Dr JTS</name><uri>http://www.blogger.com/profile/02383381220154739793</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/-Pj7UlhDoOgk/TmBfGWP-lYI/AAAAAAAAA7U/zVpRIwbSs5Y/s72-c/Ordnance+Survey+logo.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2420860529344694449.post-1168802181963336538</id><published>2011-08-24T11:56:00.000-07:00</published><updated>2011-08-24T12:02:33.724-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='jts'/><title type='text'>Interview with Directions Magazine</title><content type='html'>The Twittersphere is buzzing with my latest (well, only) interview with Directions Magazine on the &lt;b&gt;&lt;a href="http://www.directionsmag.com/articles/state-of-the-jts-topology-suite-a-conversation-with-martin-davis/196016"&gt;State of the JTS Topology Suite&lt;/a&gt;&lt;/b&gt;.&lt;br /&gt;&lt;br /&gt;&lt;img src="http://4.bp.blogspot.com/-CFR_JayIzxY/TlVKh6oRbTI/AAAAAAAAA7Q/X2xoNe-7_sM/s400/logo-directions-mag.png" style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 259px; height: 50px;" border="0" alt="" id="BLOGGER_PHOTO_ID_5644499654513093938" /&gt;&lt;br /&gt;&lt;div&gt;Props to Rob Rutherford and Amber Weber at &lt;a href="http://www.cloverpoint.com/"&gt;Clover Point&lt;/a&gt; for setting this up!&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2420860529344694449-1168802181963336538?l=lin-ear-th-inking.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lin-ear-th-inking.blogspot.com/feeds/1168802181963336538/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2420860529344694449&amp;postID=1168802181963336538&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2420860529344694449/posts/default/1168802181963336538'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2420860529344694449/posts/default/1168802181963336538'/><link rel='alternate' type='text/html' href='http://lin-ear-th-inking.blogspot.com/2011/08/interview-with-directions-magazine.html' title='Interview with Directions Magazine'/><author><name>Dr JTS</name><uri>http://www.blogger.com/profile/02383381220154739793</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/-CFR_JayIzxY/TlVKh6oRbTI/AAAAAAAAA7Q/X2xoNe-7_sM/s72-c/logo-directions-mag.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2420860529344694449.post-5816133097944709493</id><published>2011-07-14T16:07:00.000-07:00</published><updated>2011-07-19T10:43:10.287-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='gps'/><category scheme='http://www.blogger.com/atom/ns#' term='geospatial'/><title type='text'>Would you be lost without it?</title><content type='html'>Nowadays &lt;a href="http://en.wikipedia.org/wiki/Global_Positioning_System"&gt;GPS&lt;/a&gt; is ubiquitous in electronic gadgets (no electric toothbrush is complete without it!)  GPS is a classic example of &lt;span style="font-weight: bold;"&gt;iceberg technology&lt;/span&gt; &lt;a title="yes I made this up.  My entry for Internet memedom!"&gt;&lt;sup&gt;1&lt;/sup&gt;&lt;/a&gt;.  An output which in one sense verges on trivial - two numbers! - in fact relies on a huge unseen infrastructure of technology, physics, organizations, and yes, government funding.&lt;br /&gt;&lt;br /&gt;The UK Telegraph has an &lt;a href="http://www.telegraph.co.uk/science/8623280/Wed-be-lost-without-them-meet-the-team-behind-GPS.html"&gt;interesting article on GPS&lt;/a&gt; &lt;a title="don't worry, it's still safe to use your cellphone after visiting this site"&gt;&lt;sup&gt;2&lt;/sup&gt;&lt;/a&gt; covering some of the technical, scientific, historic and political background to the  system.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://upload.wikimedia.org/wikipedia/commons/thumb/8/8d/GPS_Satellite_NASA_art-iif.jpg/748px-GPS_Satellite_NASA_art-iif.jpg"&gt;&lt;img style="display: block; margin: 0px auto 10px; text-align: center; cursor: pointer; width: 528px; height: 422px;" src="http://upload.wikimedia.org/wikipedia/commons/thumb/8/8d/GPS_Satellite_NASA_art-iif.jpg/748px-GPS_Satellite_NASA_art-iif.jpg" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;On a side note, I'm happy to observe that statements like this aren't as common as they used to be:&lt;br /&gt;&lt;br /&gt;&lt;blockquote style="font-style: italic;"&gt;Slightly worryingly, when I was invited to watch a “contact” in    another control room earlier in the day, the software crashed and a familiar, blue Microsoft Windows screen appeared on the wall&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Notes:&lt;/span&gt;&lt;br /&gt;&lt;ol&gt;&lt;li&gt;yes I made this up.  My entry for Internet memedom!&lt;br /&gt;&lt;/li&gt;&lt;li&gt;don't worry, it's still safe to use your cellphone after visiting this site&lt;br /&gt;&lt;/li&gt;&lt;/ol&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2420860529344694449-5816133097944709493?l=lin-ear-th-inking.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lin-ear-th-inking.blogspot.com/feeds/5816133097944709493/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2420860529344694449&amp;postID=5816133097944709493&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2420860529344694449/posts/default/5816133097944709493'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2420860529344694449/posts/default/5816133097944709493'/><link rel='alternate' type='text/html' href='http://lin-ear-th-inking.blogspot.com/2011/07/would-you-be-lost-without-it.html' title='Would you be lost without it?'/><author><name>Dr JTS</name><uri>http://www.blogger.com/profile/02383381220154739793</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2420860529344694449.post-8708690216549280212</id><published>2011-06-26T21:41:00.000-07:00</published><updated>2011-06-26T21:54:04.328-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='jts'/><title type='text'>JTS 1.12 released</title><content type='html'>JTS 1.12 has been released, and is now available for &lt;a href="http://sourceforge.net/projects/jts-topo-suite/files/jts/1.12/jts-1.12.zip/download"&gt;download at SourceForge&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Some highlights of this release include:&lt;br /&gt;&lt;ul&gt;&lt;li&gt; &lt;a href="http://tsusiatsoftware.net/jts/javadoc/com/vividsolutions/jts/operation/buffer/BufferParameters.html#setSingleSided%28boolean%29"&gt;Single-Sided Buffers&lt;/a&gt;&lt;/li&gt;&lt;li&gt; &lt;a href="http://tsusiatsoftware.net/jts/javadoc/com/vividsolutions/jts/precision/MinimumClearance.html"&gt;MinimumClearance&lt;/a&gt; function&lt;/li&gt;&lt;li&gt; &lt;a href="http://tsusiatsoftware.net/jts/javadoc/com/vividsolutions/jts/index/strtree/STRtree.html#nearestNeighbour%28com.vividsolutions.jts.index.strtree.ItemDistance%29"&gt;nearestNeighbours&lt;/a&gt; methods for STRtree&lt;/li&gt;&lt;li&gt; &lt;a href="http://tsusiatsoftware.net/jts/javadoc/com/vividsolutions/jts/math/Vector2D.html"&gt;Vector2D&lt;/a&gt; class for vector operations&lt;/li&gt;&lt;li&gt;&lt;a href="http://tsusiatsoftware.net/jts/javadoc/com/vividsolutions/jts/math/DD.html"&gt;DD&lt;/a&gt; (DoubleDouble) enhanced precision arithmetic&lt;br /&gt;&lt;/li&gt;&lt;li&gt; improved robustness for Delaunay and Voronoi computation&lt;/li&gt;&lt;li&gt; enhanced geometry digitization in the TestBuilder, along with a dynamic grid&lt;/li&gt;&lt;/ul&gt;... along with many other features, enhancements and fixes.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/-h4u6wfAxIhI/TggLYyPg0TI/AAAAAAAAAw8/t71sU1eP91I/s1600/single-sided-buffer.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 327px; height: 400px;" src="http://2.bp.blogspot.com/-h4u6wfAxIhI/TggLYyPg0TI/AAAAAAAAAw8/t71sU1eP91I/s400/single-sided-buffer.png" alt="" id="BLOGGER_PHOTO_ID_5622756655203668274" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;div style="text-align: center; font-weight: bold; font-style: italic;"&gt;Single-Sided Buffer&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2420860529344694449-8708690216549280212?l=lin-ear-th-inking.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lin-ear-th-inking.blogspot.com/feeds/8708690216549280212/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2420860529344694449&amp;postID=8708690216549280212&amp;isPopup=true' title='7 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2420860529344694449/posts/default/8708690216549280212'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2420860529344694449/posts/default/8708690216549280212'/><link rel='alternate' type='text/html' href='http://lin-ear-th-inking.blogspot.com/2011/06/jts-112-released.html' title='JTS 1.12 released'/><author><name>Dr JTS</name><uri>http://www.blogger.com/profile/02383381220154739793</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/-h4u6wfAxIhI/TggLYyPg0TI/AAAAAAAAAw8/t71sU1eP91I/s72-c/single-sided-buffer.png' height='72' width='72'/><thr:total>7</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2420860529344694449.post-1053520914847434872</id><published>2011-06-08T16:04:00.000-07:00</published><updated>2011-06-08T16:14:33.718-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='web'/><title type='text'>Apple walls getting higher</title><content type='html'>ZDNet has an &lt;a href="http://www.zdnet.com/blog/btl/through-cloud-apple-circles-wagons-on-ecosystem-10-proof-points/50077"&gt;interesting long view&lt;/a&gt; on the Apple iCloud announcement.  Money quote:&lt;br /&gt;&lt;i&gt;&lt;blockquote&gt;The mobile world is moving away from the chock-full-o’-content web and  increasingly becoming a world of closed pipes of content, with Apple,  Google, HP and Microsoft regulating the flow. Tech fiefdoms scattered  across a vast open land have expanded into warring nation-states with  adjacent borders. The Mac vs. PC vs. Linux argument from the early days  of consumer computing has lost a great deal of its luster in recent  years with the development of cloud computing on the open web, but the  concept of platform wars is quickly making up for lost ground with the  development of cloud computing in the closed mobile space.&lt;/blockquote&gt;&lt;/i&gt;I've always found the Apple walled garden a bit scary in its restrictions.  Now the walls are getting higher and thicker - and other vendors will be following suit as fast as they dare.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I don't find Google's garden as threatening, for some reason.  Perhaps because they have a different business model, based on page views rather than selling devices or software.  For now that encourages them to not put any limits on where and how you access their services.  But will that change if the Chromebook takes off?   Is the fact that &lt;a href="http://www.theregister.co.uk/2011/03/24/google_will_not_open_source_android_honeycomb_on_release_of_first_devices/"&gt;Honeycomb is not open source&lt;/a&gt; a tiny black cloud on the horizon?&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2420860529344694449-1053520914847434872?l=lin-ear-th-inking.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lin-ear-th-inking.blogspot.com/feeds/1053520914847434872/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2420860529344694449&amp;postID=1053520914847434872&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2420860529344694449/posts/default/1053520914847434872'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2420860529344694449/posts/default/1053520914847434872'/><link rel='alternate' type='text/html' href='http://lin-ear-th-inking.blogspot.com/2011/06/apple-walls-getting-higher.html' title='Apple walls getting higher'/><author><name>Dr JTS</name><uri>http://www.blogger.com/profile/02383381220154739793</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2420860529344694449.post-3279725954210352570</id><published>2011-06-06T22:35:00.000-07:00</published><updated>2011-06-06T22:58:27.213-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='open source'/><category scheme='http://www.blogger.com/atom/ns#' term='java'/><title type='text'>Java gets Reheated at OSCON</title><content type='html'>It's good to see that O'Reilly is adding a &lt;a href="http://oscon.com/java"&gt;Java flavour to the OSCON&lt;/a&gt; conference. They have a good &lt;a href="http://radar.oreilly.com/2011/06/oscon-java.html"&gt;blog post&lt;/a&gt; highlighting why they think Java (and the JVM) is still one of the most important programming platforms around, especially for open source development.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://radar.oreilly.com/oscon-java-code-os11rad.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 148px; height: 160px;" src="http://radar.oreilly.com/oscon-java-code-os11rad.png" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Some of the interesting Java projects that will be covered at the conference are:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://incanter.org/"&gt;Incanter&lt;/a&gt;, a &lt;a href="http://clojure.org/"&gt;Clojure&lt;/a&gt;-based statistics library (this project is particularly interesting to me, since it overlaps with some of the target space of &lt;a href="http://tsusiatsoftware.net/jeql/main.html"&gt;JEQL&lt;/a&gt;)&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.gradle.org/"&gt;Gradle&lt;/a&gt;, a Groovy DSL for building, testing, and deploying software&lt;/li&gt;&lt;li&gt;&lt;a href="http://jenkins-ci.org/"&gt;Jenkins&lt;/a&gt;, a continuous integration platform&lt;/li&gt;&lt;li&gt;&lt;a href="http://neo4j.org/"&gt;Neo4J&lt;/a&gt;, a graph database&lt;/li&gt;&lt;/ul&gt;Some may think that Java is entering the &lt;a href="http://en.wikipedia.org/wiki/Red_giant"&gt;Red Giant&lt;/a&gt; phase of language evolution, but it still has the capacity to throw off some powerful solar flares.    The longer the coffee pot sits on the stove, the stronger it gets...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2420860529344694449-3279725954210352570?l=lin-ear-th-inking.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lin-ear-th-inking.blogspot.com/feeds/3279725954210352570/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2420860529344694449&amp;postID=3279725954210352570&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2420860529344694449/posts/default/3279725954210352570'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2420860529344694449/posts/default/3279725954210352570'/><link rel='alternate' type='text/html' href='http://lin-ear-th-inking.blogspot.com/2011/06/java-gets-reheated-at-oscon.html' title='Java gets Reheated at OSCON'/><author><name>Dr JTS</name><uri>http://www.blogger.com/profile/02383381220154739793</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2420860529344694449.post-1168174912145975706</id><published>2011-05-19T11:58:00.001-07:00</published><updated>2011-06-10T08:48:10.458-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='javascript'/><category scheme='http://www.blogger.com/atom/ns#' term='jts'/><category scheme='http://www.blogger.com/atom/ns#' term='web'/><title type='text'>JTS arrives in JavaScript</title><content type='html'>As I &lt;a href="http://lin-ear-th-inking.blogspot.com/2008/03/time-for-jsts.html"&gt;predicted back in 2008&lt;/a&gt;, &lt;a href="http://tsusiatsoftware.net/jts/main.html"&gt;JTS&lt;/a&gt; has now colonized the &lt;span style="FONT-WEIGHT: bold"&gt;JavaScript &lt;/span&gt;ecosystem, thanks to the work of Bjorn Hartell on &lt;a href="https://github.com/bjornharrtell/jsts"&gt;JSTS&lt;/a&gt;. At least, the project has been launched - it's a bit unclear as to how much functionality is actually there.&lt;br /&gt;&lt;br /&gt;I hope to see some slick browser-based UI clients pop up, using &lt;span style="FONT-WEIGHT: bold"&gt;Canvas&lt;/span&gt; or perhaps &lt;span style="FONT-WEIGHT: bold"&gt;SVG&lt;/span&gt;?&lt;br /&gt;&lt;br /&gt;The language scorecard for JTS now looks like:&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;&lt;br /&gt;&lt;li&gt;&lt;span style="FONT-WEIGHT: bold"&gt;&lt;a href="http://tsusiatsoftware.net/jts/main.html"&gt;JTS&lt;/a&gt;&lt;/span&gt; - Java (and Groovy, Scala, Jython, etc)&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;span style="FONT-WEIGHT: bold"&gt;&lt;a href="http://trac.osgeo.org/geos/"&gt;GEOS&lt;/a&gt;&lt;/span&gt; - C/C++&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;span style="FONT-WEIGHT: bold"&gt;&lt;a href="http://code.google.com/p/nettopologysuite/"&gt;NET Topology Suite&lt;/a&gt;&lt;/span&gt; - MS .NET&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;span style="FONT-WEIGHT: bold"&gt;&lt;a href="http://trac.gispython.org/lab/wiki/Shapely"&gt;Shapely&lt;/a&gt; &lt;/span&gt;- Python (via GEOS)&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;span style="FONT-WEIGHT: bold"&gt;Ruby &lt;/span&gt;- via GEOS&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;strong&gt;PHP&lt;/strong&gt; - via GEOS&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;span style="FONT-WEIGHT: bold"&gt;&lt;a href="https://github.com/bjornharrtell/jsts"&gt;JSTS&lt;/a&gt; &lt;/span&gt;- JavaScript&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2420860529344694449-1168174912145975706?l=lin-ear-th-inking.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lin-ear-th-inking.blogspot.com/feeds/1168174912145975706/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2420860529344694449&amp;postID=1168174912145975706&amp;isPopup=true' title='8 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2420860529344694449/posts/default/1168174912145975706'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2420860529344694449/posts/default/1168174912145975706'/><link rel='alternate' type='text/html' href='http://lin-ear-th-inking.blogspot.com/2011/05/jts-arrives-in-javascript.html' title='JTS arrives in JavaScript'/><author><name>Dr JTS</name><uri>http://www.blogger.com/profile/02383381220154739793</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>8</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2420860529344694449.post-426476410397202933</id><published>2011-05-04T20:51:00.000-07:00</published><updated>2011-05-04T20:51:00.128-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='open source'/><category scheme='http://www.blogger.com/atom/ns#' term='foss4g'/><category scheme='http://www.blogger.com/atom/ns#' term='geospatial'/><title type='text'>FOSS4G is the place to be!</title><content type='html'>&lt;div&gt;&lt;a href="http://2011.foss4g.org/"&gt;FOSS4G 2011&lt;/a&gt; is happening in Denver this September.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;a href="http://2011.foss4g.org/storage/foss4g_banner8.png" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 800px; height: 156px;" src="http://2011.foss4g.org/storage/foss4g_banner8.png" border="0" alt="" /&gt;&lt;/a&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;I've submitted two abstracts for presentations:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold; font-style: italic;"&gt;Spatial Processing using JEQL&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;JEQL is a simple yet powerful language designed for expressing spatial (and non-spatial) processes.  It follows the Table-Oriented Programming paradigm and provides a SQL-like query language.  This talk gives an overview of JEQL and show some examples of its use.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold; font-style: italic;"&gt;What's New in JTS&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;The JTS Topology Suite has had numerous improvements in the past few versions.  These include performance improvements, bug fixes and new functionality such as Delaunay Triangulation, Single-Sided Buffers, and Hausdorff Distance.  This talk will discuss the new features, and demonstrate them using the JTS TestBuilder utility.  Potential further features will be presented for discussion.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Vote early, vote often - and vote for me! &lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;See you in Denver....&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2420860529344694449-426476410397202933?l=lin-ear-th-inking.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lin-ear-th-inking.blogspot.com/feeds/426476410397202933/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2420860529344694449&amp;postID=426476410397202933&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2420860529344694449/posts/default/426476410397202933'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2420860529344694449/posts/default/426476410397202933'/><link rel='alternate' type='text/html' href='http://lin-ear-th-inking.blogspot.com/2011/05/foss4g-is-place-to-be.html' title='FOSS4G is the place to be!'/><author><name>Dr JTS</name><uri>http://www.blogger.com/profile/02383381220154739793</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2420860529344694449.post-5501123763333053098</id><published>2011-04-08T10:24:00.000-07:00</published><updated>2011-04-08T10:49:01.022-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='computational geometry'/><category scheme='http://www.blogger.com/atom/ns#' term='jts'/><title type='text'>Polygon Triangulation via Ear-Clipping with Delaunay Refinement</title><content type='html'>After &lt;a href="http://sourceforge.net/mailarchive/forum.php?thread_name=w2hff30b0341004201235j5fb19fc8y8d4c4a67e25f5b49%40mail.gmail.com&amp;amp;forum_name=jts-topo-suite-user"&gt;this thread&lt;/a&gt; on the JTS list Michael Bedward was inspired to create a &lt;span style="font-weight: bold;"&gt;polygon triangulation&lt;/span&gt; algorithm using the &lt;span style="font-weight: bold;"&gt;Ear-Clipping&lt;/span&gt; approach.  Standard Ear-Clipping algorithms don't handle polygons with holes, but Michael made a nice extension to do this.  (David Eberly has a good write-up on this subject &lt;a href="http://www.geometrictools.com/Documentation/TriangulationByEarClipping.pdf"&gt;here&lt;/a&gt;, and of course there's always &lt;a href="http://en.wikipedia.org/wiki/Polygon_triangulation#Ear_clipping_method"&gt;Wikipedia&lt;/a&gt;).&lt;br /&gt;&lt;br /&gt;One problem with ear-clipping is that it produces sub-optimal triangulations (in the the sense that it creates lots of very skinny triangles, which are visually and computationally unappealing).  I suggested that he add a refinement step based on "flipping triangles" to improve the quality of the output triangle mesh.  This is similar to the approach used in Delaunay triangulation algorithms, and in fact it turns out that a good flipping criteria is to test for the Delaunay condition.  (Two adjacent triangles which form a convex quadrilateral are Delaunay if neither lies in the circumcircle of the other.  Wikipedia has a &lt;a href="http://en.wikipedia.org/wiki/Delaunay_triangulation#Visual_Delaunay_definition:_Flipping"&gt;nice visual explanation&lt;/a&gt;).&lt;br /&gt;&lt;br /&gt;This code will get added to JTS in the next release.  In the meantime, here's some cool pictures showing how it works.&lt;br /&gt;&lt;br /&gt;A gnarly test polygon:&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;span style="font-weight: bold; font-style: italic;"&gt;Before refinement&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/-2Z_Zix3X13E/TZ9FHP-brZI/AAAAAAAAAkA/-P1ckiE8V90/s1600/bigpoly_noimprove.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 354px;" src="http://1.bp.blogspot.com/-2Z_Zix3X13E/TZ9FHP-brZI/AAAAAAAAAkA/-P1ckiE8V90/s400/bigpoly_noimprove.png" alt="" id="BLOGGER_PHOTO_ID_5593265253067238802" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;span style="font-weight: bold; font-style: italic;"&gt;After refinement&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/-8KcwabEVyp8/TZ9FHJFWnMI/AAAAAAAAAj4/LOIIMXtrNTM/s1600/bigpoly_improve.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 354px;" src="http://4.bp.blogspot.com/-8KcwabEVyp8/TZ9FHJFWnMI/AAAAAAAAAj4/LOIIMXtrNTM/s400/bigpoly_improve.png" alt="" id="BLOGGER_PHOTO_ID_5593265251217218754" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;A country that has been in the news recently:&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;span style="font-weight: bold; font-style: italic;"&gt;Before refinement&lt;/span&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/-XSJiLFG09I0/TZ9FHq5yAfI/AAAAAAAAAkQ/5K1tiKeJQ-I/s1600/eqypt_noimprove.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 354px;" src="http://2.bp.blogspot.com/-XSJiLFG09I0/TZ9FHq5yAfI/AAAAAAAAAkQ/5K1tiKeJQ-I/s400/eqypt_noimprove.png" alt="" id="BLOGGER_PHOTO_ID_5593265260295487986" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;span style="font-weight: bold; font-style: italic;"&gt;After refinement&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/-wVTKhVrFDlY/TZ9FHbDC5GI/AAAAAAAAAkI/LReoJTVWERk/s1600/eqypt_improve.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 354px;" src="http://1.bp.blogspot.com/-wVTKhVrFDlY/TZ9FHbDC5GI/AAAAAAAAAkI/LReoJTVWERk/s400/eqypt_improve.png" alt="" id="BLOGGER_PHOTO_ID_5593265256039375970" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2420860529344694449-5501123763333053098?l=lin-ear-th-inking.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lin-ear-th-inking.blogspot.com/feeds/5501123763333053098/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2420860529344694449&amp;postID=5501123763333053098&amp;isPopup=true' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2420860529344694449/posts/default/5501123763333053098'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2420860529344694449/posts/default/5501123763333053098'/><link rel='alternate' type='text/html' href='http://lin-ear-th-inking.blogspot.com/2011/04/polygon-triangulation-via-ear-clipping.html' title='Polygon Triangulation via Ear-Clipping with Delaunay Refinement'/><author><name>Dr JTS</name><uri>http://www.blogger.com/profile/02383381220154739793</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/-2Z_Zix3X13E/TZ9FHP-brZI/AAAAAAAAAkA/-P1ckiE8V90/s72-c/bigpoly_noimprove.png' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2420860529344694449.post-8755390906798213425</id><published>2011-04-08T09:16:00.000-07:00</published><updated>2011-04-08T09:22:02.783-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='google'/><category scheme='http://www.blogger.com/atom/ns#' term='web'/><title type='text'>Dynamic Views in Google Blogs</title><content type='html'>Check out the cool new &lt;a href="http://www.google.com/support/blogger/bin/answer.py?hl=en&amp;amp;answer=1229061"&gt;Dynamic Views&lt;/a&gt; feature for Google Blogs. I'm not sure how useful this is actually going to be for readers (especially since you have to do URL editing to invoke them - WTB!?  (Where's The Button 8^) &lt;br /&gt;&lt;br /&gt;But they sure look purty.  Here's a shot of the Flipcard view:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/-qClTwU7_w_g/TZ81UFud8qI/AAAAAAAAAjw/8FMW2xuh-LU/s1600/blog_views_flipcard.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 353px;" src="http://3.bp.blogspot.com/-qClTwU7_w_g/TZ81UFud8qI/AAAAAAAAAjw/8FMW2xuh-LU/s400/blog_views_flipcard.png" alt="" id="BLOGGER_PHOTO_ID_5593247881468179106" border="0" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2420860529344694449-8755390906798213425?l=lin-ear-th-inking.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lin-ear-th-inking.blogspot.com/feeds/8755390906798213425/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2420860529344694449&amp;postID=8755390906798213425&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2420860529344694449/posts/default/8755390906798213425'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2420860529344694449/posts/default/8755390906798213425'/><link rel='alternate' type='text/html' href='http://lin-ear-th-inking.blogspot.com/2011/04/dynamic-views-in-google-blogs.html' title='Dynamic Views in Google Blogs'/><author><name>Dr JTS</name><uri>http://www.blogger.com/profile/02383381220154739793</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/-qClTwU7_w_g/TZ81UFud8qI/AAAAAAAAAjw/8FMW2xuh-LU/s72-c/blog_views_flipcard.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2420860529344694449.post-8918783664440868435</id><published>2011-04-07T15:00:00.000-07:00</published><updated>2011-04-07T15:00:01.008-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='computational geometry'/><category scheme='http://www.blogger.com/atom/ns#' term='computation'/><category scheme='http://www.blogger.com/atom/ns#' term='jts'/><category scheme='http://www.blogger.com/atom/ns#' term='geospatial'/><category scheme='http://www.blogger.com/atom/ns#' term='google-earth'/><title type='text'>Slope/Aspect/Elevation using JTS</title><content type='html'>David Skea is a longtime colleague, JTS contributor, and all-around geospatial guru.   He's developing a &lt;span style="font-weight: bold;"&gt;Slope/Aspect/Elevation&lt;/span&gt; service to be used in forestry-related applications here in British Columbia.   His work is a nice example of using JTS to perform real-world spatial processing.&lt;br /&gt;&lt;br /&gt;The key to computing slope, aspect and elevation is to have a &lt;a href="http://en.wikipedia.org/wiki/Digital_elevation_model"&gt;Digital Elevation Model&lt;/a&gt; (DEM) available for the terrain in the area of interest.  In this case, the terrain data is provided by the &lt;a href="http://archive.ilmb.gov.bc.ca/crgb/products/mapdata/trim_positional_maps.htm"&gt;TRIM &lt;/a&gt;irregular DEM, which is a dataset of over 500 million mass points covering all of  British Columbia. To compute the required values for a given polygon, the first step is to extract only the mass points in the immediate region of the polygon (i.e. using the polygon envelope with a suitable buffer distance.  The JTS &lt;a href="http://www.tsusiatsoftware.net/jts/javadoc/com/vividsolutions/jts/triangulate/package-summary.html"&gt;Delaunay Triangulation API&lt;/a&gt; is used to compute a &lt;a href="http://en.wikipedia.org/wiki/Triangulated_irregular_network"&gt;TIN triangulation&lt;/a&gt; from the TRIM mass points.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/-P6t7DZk9RLA/TZ4sYWvPY5I/AAAAAAAAAjg/t7hM0EKoBXo/s1600/TIN_VegPoly.PNG"&gt;&lt;img style="display: block; margin: 0px auto 10px; text-align: center; cursor: pointer; width: 400px; height: 385px;" src="http://1.bp.blogspot.com/-P6t7DZk9RLA/TZ4sYWvPY5I/AAAAAAAAAjg/t7hM0EKoBXo/s400/TIN_VegPoly.PNG" alt="" id="BLOGGER_PHOTO_ID_5592956584172938130" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Using a JTS &lt;a href="http://www.tsusiatsoftware.net/jts/javadoc/com/vividsolutions/jts/algorithm/locate/package-summary.html"&gt;&lt;span style="font-family: courier new;"&gt;PointOnGeometryLocator&lt;/span&gt;&lt;/a&gt;, the triangles whose centroids lie in the polygon are selected.  Since each mass point has an elevation value, each TIN triangle is located in 3D space. The normal vector can be computed for each triangle, which provides the slope and aspect values.  The elevation is the height of the triangle centroid. &lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/-qJzmWbFbkIk/TZ4s-24tGiI/AAAAAAAAAjo/A7cgo2b1xjY/s1600/Normal_Vector.PNG"&gt;&lt;img style="display: block; margin: 0px auto 10px; text-align: center; cursor: pointer; width: 236px; height: 200px;" src="http://1.bp.blogspot.com/-qJzmWbFbkIk/TZ4s-24tGiI/AAAAAAAAAjo/A7cgo2b1xjY/s400/Normal_Vector.PNG" alt="" id="BLOGGER_PHOTO_ID_5592957245637597730" border="0" /&gt;&lt;/a&gt; The SEA values for the triangles are averaged to compute the overall slope, aspect and elevation  value for the polygon.&lt;br /&gt;&lt;br /&gt;Here's a screenshot showing the results, using Google Earth as a convenient 3D visualization tool (click for full-size image).&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/-8KyfCQ8fLV4/TYl6KB42uEI/AAAAAAAAAjY/Sd5U-Xhy-GU/s1600/SAE_polygon_GE.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 563px; height: 365px;" src="http://2.bp.blogspot.com/-8KyfCQ8fLV4/TYl6KB42uEI/AAAAAAAAAjY/Sd5U-Xhy-GU/s400/SAE_polygon_GE.jpg" alt="" id="BLOGGER_PHOTO_ID_5587131125453994050" border="0" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2420860529344694449-8918783664440868435?l=lin-ear-th-inking.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lin-ear-th-inking.blogspot.com/feeds/8918783664440868435/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2420860529344694449&amp;postID=8918783664440868435&amp;isPopup=true' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2420860529344694449/posts/default/8918783664440868435'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2420860529344694449/posts/default/8918783664440868435'/><link rel='alternate' type='text/html' href='http://lin-ear-th-inking.blogspot.com/2011/04/slopeaspectelevation-using-jts.html' title='Slope/Aspect/Elevation using JTS'/><author><name>Dr JTS</name><uri>http://www.blogger.com/profile/02383381220154739793</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/-P6t7DZk9RLA/TZ4sYWvPY5I/AAAAAAAAAjg/t7hM0EKoBXo/s72-c/TIN_VegPoly.PNG' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2420860529344694449.post-8900088833955811166</id><published>2011-03-03T21:42:00.001-08:00</published><updated>2011-03-03T21:51:28.844-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='jts'/><category scheme='http://www.blogger.com/atom/ns#' term='geometry'/><title type='text'>GeoGeeks presentation on Geometry Libraries</title><content type='html'>Paul Ramsey has been doing his usual excellent work of promoting geo-geekery by setting up a &lt;a href="http://www.meetup.com/Victoria-GeoGeeks/"&gt;Victoria GeoGeeks Meetup&lt;/a&gt;.  Tonight I gave a presentation on &lt;a style="font-weight: bold;" href="https://docs.google.com/present/view?id=dfxd8ng8_51gpc5z9gg"&gt;Geometry Libraries for Fun and Profit&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/-vk0fW0J8XGA/TXB9SgTZ9EI/AAAAAAAAAi8/srqTqNDBb9A/s1600/Geometry_Delaunay.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 527px; height: 155px;" src="http://2.bp.blogspot.com/-vk0fW0J8XGA/TXB9SgTZ9EI/AAAAAAAAAi8/srqTqNDBb9A/s400/Geometry_Delaunay.png" alt="" id="BLOGGER_PHOTO_ID_5580097695174489154" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;I was intending to give it back-to-back with a presentation on JTS, to make the whole subject more concrete - but I rambled on for so long I was yanked from the stage before I could start on the second one!   That's actually good, since it will give me time to polish up the presentation a bit more.  In the meantime, the current slide deck is here: &lt;a style="font-weight: bold;" href="https://docs.google.com/present/view?id=dfxd8ng8_97f8f98kc6"&gt; JTS - A Libary for Geometry Processing&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2420860529344694449-8900088833955811166?l=lin-ear-th-inking.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lin-ear-th-inking.blogspot.com/feeds/8900088833955811166/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2420860529344694449&amp;postID=8900088833955811166&amp;isPopup=true' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2420860529344694449/posts/default/8900088833955811166'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2420860529344694449/posts/default/8900088833955811166'/><link rel='alternate' type='text/html' href='http://lin-ear-th-inking.blogspot.com/2011/03/geogeeks-presentation-on-geometry.html' title='GeoGeeks presentation on Geometry Libraries'/><author><name>Dr JTS</name><uri>http://www.blogger.com/profile/02383381220154739793</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/-vk0fW0J8XGA/TXB9SgTZ9EI/AAAAAAAAAi8/srqTqNDBb9A/s72-c/Geometry_Delaunay.png' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2420860529344694449.post-1269212732736997374</id><published>2011-01-11T22:34:00.000-08:00</published><updated>2011-01-11T22:34:00.532-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='jeql'/><title type='text'>Charting with JEQL</title><content type='html'>SQL has an elegant syntax for grouping and aggregating data.  Java has powerful libraries for charting and graphing (like &lt;a href="http://www.jfree.org/jfreechart"&gt;JFreeChart&lt;/a&gt;).  JEQL has easy handling of tabular data.  These go together like chocolate and peanut butter - and, um, more chocolate. Put them all together and you get this code:&lt;br /&gt;&lt;pre&gt;&lt;span style="font-size:85%;"&gt;&lt;br /&gt;CSVReader troute hasColNames: file: "routeLine2.csv";&lt;br /&gt;&lt;br /&gt;tCityCount = select count(*) cnt, fromCity city&lt;br /&gt; from troute&lt;br /&gt; group by fromCity&lt;br /&gt; order by cnt desc;&lt;br /&gt;&lt;br /&gt;tdata = select city key, cnt value from tCityCount limit 20;&lt;br /&gt;&lt;br /&gt;Chart type: "bar"&lt;br /&gt; data: tdata&lt;br /&gt; extrude:&lt;br /&gt; color: "00c0f0"&lt;br /&gt; showItemLabels:&lt;br /&gt; xAxisTitle: "Top Cities by Originating Air Routes"&lt;br /&gt; xAxisLabelRotation: -0.5&lt;br /&gt; width: 1000&lt;br /&gt; file: "cityRoutes.png";&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;producing this graph:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_q016kExGrVs/TSv8w0fju2I/AAAAAAAAAik/jHl5X37OkH4/s1600/cityRoutes.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 665px; height: 330px;" src="http://4.bp.blogspot.com/_q016kExGrVs/TSv8w0fju2I/AAAAAAAAAik/jHl5X37OkH4/s400/cityRoutes.png" alt="" id="BLOGGER_PHOTO_ID_5560816080573938530" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;This uses the same air routes dataset created in a &lt;a href="http://lin-ear-th-inking.blogspot.com/2010/12/visualizing-geodetic-information-with.html"&gt;previous example&lt;/a&gt;, with a simple grouped summary to show the 20 cities with the most air routes originating in them.&lt;br /&gt;&lt;br /&gt;JFreeChart is a bit notorious for being hard to use, but the JEQL command hides all the gory details behind a much simpler (but still powerful) &lt;span style="font-family: courier new;"&gt;Chart&lt;/span&gt; command interface.  Currently Bar, XY, and Pie charts are supported.  It will be easy to add other chart types as required.&lt;br /&gt;&lt;br /&gt;Also on the ToDo list is to provide an option to emit Google Chart URLs, using the same set of options (at least, the ones that are applicable - and maybe some new ones). &lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;Note: this is an experimental extension, which is not in a final state in the current JEQL release.&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2420860529344694449-1269212732736997374?l=lin-ear-th-inking.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lin-ear-th-inking.blogspot.com/feeds/1269212732736997374/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2420860529344694449&amp;postID=1269212732736997374&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2420860529344694449/posts/default/1269212732736997374'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2420860529344694449/posts/default/1269212732736997374'/><link rel='alternate' type='text/html' href='http://lin-ear-th-inking.blogspot.com/2011/01/charting-with-jeql.html' title='Charting with JEQL'/><author><name>Dr JTS</name><uri>http://www.blogger.com/profile/02383381220154739793</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_q016kExGrVs/TSv8w0fju2I/AAAAAAAAAik/jHl5X37OkH4/s72-c/cityRoutes.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2420860529344694449.post-8293288794633944476</id><published>2011-01-06T12:06:00.000-08:00</published><updated>2011-01-06T12:12:58.632-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='jeql'/><title type='text'>JEQL 0.9 released</title><content type='html'>Good news for those who wanted to try out the&lt;a href="http://lin-ear-th-inking.blogspot.com/2010/12/visualizing-geodetic-information-with.html"&gt; geodetic air routes JEQL script&lt;/a&gt;.  The script requires JEQL version 0.9 to run.  This version is now &lt;a href="http://tsusiatsoftware.net/jeql/download.html"&gt;available for download&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2420860529344694449-8293288794633944476?l=lin-ear-th-inking.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lin-ear-th-inking.blogspot.com/feeds/8293288794633944476/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2420860529344694449&amp;postID=8293288794633944476&amp;isPopup=true' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2420860529344694449/posts/default/8293288794633944476'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2420860529344694449/posts/default/8293288794633944476'/><link rel='alternate' type='text/html' href='http://lin-ear-th-inking.blogspot.com/2011/01/jeql-09-released.html' title='JEQL 0.9 released'/><author><name>Dr JTS</name><uri>http://www.blogger.com/profile/02383381220154739793</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2420860529344694449.post-8894824006728547889</id><published>2010-12-28T21:08:00.000-08:00</published><updated>2010-12-28T21:10:44.684-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='computation'/><category scheme='http://www.blogger.com/atom/ns#' term='web'/><title type='text'>Goodbye LAMP, hello SMAQ</title><content type='html'>A &lt;a href="http://radar.oreilly.com/2010/09/the-smaq-stack-for-big-data.html"&gt;great article&lt;/a&gt; on the emerging SMAQ stack for big data.&lt;br /&gt;&lt;br /&gt;I wonder if PIG does spatial?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2420860529344694449-8894824006728547889?l=lin-ear-th-inking.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lin-ear-th-inking.blogspot.com/feeds/8894824006728547889/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2420860529344694449&amp;postID=8894824006728547889&amp;isPopup=true' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2420860529344694449/posts/default/8894824006728547889'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2420860529344694449/posts/default/8894824006728547889'/><link rel='alternate' type='text/html' href='http://lin-ear-th-inking.blogspot.com/2010/12/goodbye-lamp-hello-smaq.html' title='Goodbye LAMP, hello SMAQ'/><author><name>Dr JTS</name><uri>http://www.blogger.com/profile/02383381220154739793</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2420860529344694449.post-4219611357845156483</id><published>2010-12-27T17:42:00.000-08:00</published><updated>2010-12-27T17:49:03.684-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='computational geometry'/><title type='text'>Diving deep into Computational Geometry</title><content type='html'>For a deep dive into the bracing waters of cutting-edge computational geometry, check out the &lt;a href="http://www.cccg.ca/"&gt;online proceedings&lt;/a&gt; of the &lt;span style="font-weight: bold;"&gt;Canadian Conference of Computational Geometry&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.cccg.ca/cccg_logo.gif"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 380px; height: 145px;" src="http://www.cccg.ca/cccg_logo.gif" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Do NOT expect to see these algorithms appear in &lt;a style="font-weight: bold;" href="http://tsusiatsoftware.net/jts/main.html"&gt;JTS&lt;/a&gt; anytime soon!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2420860529344694449-4219611357845156483?l=lin-ear-th-inking.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lin-ear-th-inking.blogspot.com/feeds/4219611357845156483/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2420860529344694449&amp;postID=4219611357845156483&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2420860529344694449/posts/default/4219611357845156483'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2420860529344694449/posts/default/4219611357845156483'/><link rel='alternate' type='text/html' href='http://lin-ear-th-inking.blogspot.com/2010/12/diving-deep-into-computational-geometry.html' title='Diving deep into Computational Geometry'/><author><name>Dr JTS</name><uri>http://www.blogger.com/profile/02383381220154739793</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2420860529344694449.post-3264857051305222110</id><published>2010-12-26T12:00:00.000-08:00</published><updated>2010-12-26T12:00:01.668-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='cartography'/><category scheme='http://www.blogger.com/atom/ns#' term='geospatial'/><category scheme='http://www.blogger.com/atom/ns#' term='jeql'/><title type='text'>Visualizing geodetic information with JEQL</title><content type='html'>The geo-blogosphere has been &lt;a href="http://www.spatiallyadjusted.com/2010/12/21/using-r-to-visualize-facebook-friends/"&gt;buzzing &lt;/a&gt;about the &lt;a href="http://www.facebook.com/notes/facebook-engineering/visualizing-friendships/469716398919"&gt;global Facebook friends visualization&lt;/a&gt;.  This was done by &lt;a href="http://paulbutler.org/archives/visualizing-facebook-friends/"&gt;Paul Butler&lt;/a&gt; using an R script and some clever techniques for working with geodetic data.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://images.spatiallyadjusted.com/facebook-friends-r-thumb.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 380px; height: 189px;" src="http://images.spatiallyadjusted.com/facebook-friends-r-thumb.png" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;This kind of lightweight spatial analysis and visualization is squarely in the target zone for &lt;a href="http://tsusiatsoftware.net/jeql/main.html"&gt;JEQL&lt;/a&gt;, so I thought I'd try something similar.&lt;br /&gt;&lt;br /&gt;Of course I don't have access to the Facebook friends dataset, so I needed some other suitable dataset of global-scale links.  An obvious candidate is airline routes.  Luckily there is an excellent open data repository called &lt;a href="http://openflights.org/data.html"&gt;OpenFlights&lt;/a&gt;.  It has datasets which are tables of airport locations and air routes between airports:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://openflights.svn.sourceforge.net/viewvc/openflights/openflights/data/airports.dat"&gt;airports.dat&lt;/a&gt;:&lt;br /&gt;&lt;pre&gt;&lt;span style="font-size:85%;"&gt;&lt;br /&gt;1,"Goroka","Goroka","Papua New Guinea","GKA","AYGA",-6.081689,145.391881,5282,10,"U"&lt;br /&gt;2,"Madang","Madang","Papua New Guinea","MAG","AYMD",-5.207083,145.7887,20,10,"U"&lt;br /&gt;3,"Mount Hagen","Mount Hagen","Papua New Guinea","HGU","AYMH",-5.826789,144.295861,5388,10,"U"&lt;br /&gt;...&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;&lt;a href="http://openflights.svn.sourceforge.net/viewvc/openflights/openflights/data/routes.dat"&gt;routes.dat&lt;/a&gt;:&lt;br /&gt;&lt;pre&gt;&lt;span style="font-size:85%;"&gt;&lt;br /&gt;0B,1542,AGP,1230,BBU,1650,,0,738&lt;br /&gt;0B,1542,ARW,1647,BBU,1650,,0,340&lt;br /&gt;0B,1542,BBU,1650,AGP,1230,,0,738&lt;br /&gt;...&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;The first step is to prepare a suitable dataset for rendering.  To get a table of FROM/TO locations, the routes table needs to be joined to the airport table. This is trivial to do in JEQL.  After a bit of cleanup (such as removing missing data and duplicate routes), the final result is a dataset of links between airport locations using Lat/Long coordinates:&lt;br /&gt;&lt;pre&gt;&lt;span style="font-size:85%;"&gt;&lt;br /&gt;28,"Bagotville","Canada",48.330555,-70.996391,146,"Montreal","Canada",45.470556,-73.740833&lt;br /&gt;29,"Baker Lake","Canada",64.298889,-96.077778,132,"Rankin Inlet","Canada",62.81139,-92.115833&lt;br /&gt;30,"Campbell River","Canada",49.950832,-125.270833,119,"Comox","Canada",49.710833,-124.886667&lt;br /&gt;30,"Campbell River","Canada",49.950832,-125.270833,156,"Vancouver","Canada",49.193889,-123.184444&lt;br /&gt;...&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;As Paul found, a few other steps are needed to produce a visually appealing map:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Densify the route links to produce approximations to great-circle arcs&lt;/li&gt;&lt;li&gt;Break the arcs at the International Date Line to allow them to render correctly&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Colour-theme the routes from longest to shortest using lighter colours for shorter routes&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Render the lines with longer ones further back in the Z-order&lt;/li&gt;&lt;/ul&gt;For good measure I also added a background rendering of world land areas, as well as a country boundary layer on top.  To avoid swamping the map, only routes with more than one flight listed are displayed.&lt;br /&gt;&lt;br /&gt;The rendering is done using the following JEQL script:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;CSVReader troute hasColNames: file: "routeLine2.csv";&lt;br /&gt;&lt;br /&gt;trte = select  fromCity, toCity,&lt;br /&gt;  Val.toDouble(fromLon) fromLon, Val.toDouble(fromLat) fromLat,&lt;br /&gt;  Val.toDouble(toLon)   toLon,   Val.toDouble(toLat)   toLat&lt;br /&gt; from troute;&lt;br /&gt; &lt;br /&gt;tlines = select fromCity, toCity, line, len&lt;br /&gt; with {&lt;br /&gt;   line = Geodetic.split180(Geodetic.arc(fromLon, fromLat, toLon, toLat, 2));&lt;br /&gt;   len = Geom.length(line);&lt;br /&gt; }&lt;br /&gt; from trte order by len desc;&lt;br /&gt; &lt;br /&gt;tplot = select line,&lt;br /&gt; Color.interpolate("f0fff0", "00c077", "004020", len / 200.0 ) lineColor,&lt;br /&gt; 0.4 lineWidth&lt;br /&gt; from tlines;&lt;br /&gt; &lt;br /&gt;//----- Plot world landmasses for context&lt;br /&gt;ShapefileReader tworld file: "world.shp";&lt;br /&gt;tworldLine = select GEOMETRY, "22222277" lineColor from tworld;&lt;br /&gt;tworldFill = select GEOMETRY, "333333"   fillColor from tworld;&lt;br /&gt;&lt;br /&gt;width = 2000;&lt;br /&gt;Plot width: width height: width / 2&lt;br /&gt; extent: LINESTRING(-180 -90, 180 90)&lt;br /&gt; &lt;br /&gt; data: tworldFill&lt;br /&gt; data: tplot&lt;br /&gt; data: tworldLine&lt;br /&gt;&lt;br /&gt; file: "routes.png";&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;That's about 40 lines of code, with only 9 statements.  Not a bad LOC score...   Of course the heavy lifting of handling geodetic data is done by Java functions, but that's part of the point.   JEQL makes it easy to link to Java code, since that's a more appropriate technology for creating performant, resusable code.&lt;br /&gt;&lt;br /&gt;Here's the final output:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_q016kExGrVs/TReSLlwH-6I/AAAAAAAAAic/1lmHd6s2QbU/s1600/routes.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 588px; height: 294px;" src="http://3.bp.blogspot.com/_q016kExGrVs/TReSLlwH-6I/AAAAAAAAAic/1lmHd6s2QbU/s400/routes.png" alt="" id="BLOGGER_PHOTO_ID_5555069393194974114" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;The continent outlines aren't revealed as crisply as the Facebook friends map.  That's because friend links tend to be more spatially coherent than airline routes (unless your acquaintances all have private jets).   But it certainly shows where the world hotspots are for air traffic.  Boy, those Europeans love to fly!&lt;br /&gt;&lt;br /&gt;Next up: the KML version...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2420860529344694449-3264857051305222110?l=lin-ear-th-inking.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lin-ear-th-inking.blogspot.com/feeds/3264857051305222110/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2420860529344694449&amp;postID=3264857051305222110&amp;isPopup=true' title='16 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2420860529344694449/posts/default/3264857051305222110'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2420860529344694449/posts/default/3264857051305222110'/><link rel='alternate' type='text/html' href='http://lin-ear-th-inking.blogspot.com/2010/12/visualizing-geodetic-information-with.html' title='Visualizing geodetic information with JEQL'/><author><name>Dr JTS</name><uri>http://www.blogger.com/profile/02383381220154739793</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_q016kExGrVs/TReSLlwH-6I/AAAAAAAAAic/1lmHd6s2QbU/s72-c/routes.png' height='72' width='72'/><thr:total>16</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2420860529344694449.post-803528538006095015</id><published>2010-11-15T21:00:00.000-08:00</published><updated>2011-05-04T10:27:50.581-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='computational geometry'/><category scheme='http://www.blogger.com/atom/ns#' term='jts'/><category scheme='http://www.blogger.com/atom/ns#' term='geometry'/><title type='text'>Single-Sided Buffers in JTS</title><content type='html'>Due to &lt;a href="http://sourceforge.net/mailarchive/forum.php?thread_name=AANLkTinruO2C_XCaQQ5WM0Aog9ONLp87dZWPKAnpCrN1%40mail.gmail.com&amp;amp;forum_name=jts-topo-suite-user"&gt;popular demand&lt;/a&gt; I have added the capability to generate Single-Sided Buffers to &lt;a href="http://tsusiatsoftware.net/jts/main.html"&gt;JTS&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;A single-sided buffer is the polygon formed by connecting a LineString to an offset curve generated on one side of the line.&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_q016kExGrVs/TOIUnI7hFtI/AAAAAAAAAh0/4H1_00mzpZg/s1600/single-sided-buffer-input_arrows.png" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 329px;" src="http://2.bp.blogspot.com/_q016kExGrVs/TOIUnI7hFtI/AAAAAAAAAh0/4H1_00mzpZg/s400/single-sided-buffer-input_arrows.png" alt="" id="BLOGGER_PHOTO_ID_5540013154263701202" border="0" /&gt;&lt;/a&gt;&lt;span style="font-style: italic;"&gt;Input Line&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_q016kExGrVs/TOITmoxW6TI/AAAAAAAAAhs/a2U8xwc2qA0/s1600/single-sided-buffer-right.png" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 329px;" src="http://1.bp.blogspot.com/_q016kExGrVs/TOITmoxW6TI/AAAAAAAAAhs/a2U8xwc2qA0/s400/single-sided-buffer-right.png" alt="" id="BLOGGER_PHOTO_ID_5540012046119528754" border="0" /&gt;&lt;/a&gt;&lt;span style="font-style: italic;"&gt;Single-Sided Buffer (width = 30)&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;Naturally either side can be specified, by choosing an appropriate sign for the offset distance (positive for the right side, negative for the left).&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_q016kExGrVs/TOITmgHvT6I/AAAAAAAAAhk/DHlKOMJNbgg/s1600/single-sided-buffer-left.png" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 329px;" src="http://2.bp.blogspot.com/_q016kExGrVs/TOITmgHvT6I/AAAAAAAAAhk/DHlKOMJNbgg/s400/single-sided-buffer-left.png" alt="" id="BLOGGER_PHOTO_ID_5540012043797483426" border="0" /&gt;&lt;/a&gt;&lt;span style="font-style: italic;"&gt;Single-Sided Buffer (width = -30)&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;At the moment there's a bit of a limitation, in that input linework with very narrow concave angles (relative to the buffer distance) create undesirable artifacts in the generated polygon.  I'm hoping that some further thinking will come up with a way to avoid this, at least in most normal cases.&lt;br /&gt;&lt;br /&gt;This functionality is accessed by setting an appropriate flag in the BufferParameters structure:&lt;br /&gt;&lt;pre wrap=""&gt; BufferParameters bufParams = new BufferParameters();&lt;br /&gt; bufParams.setSingleSided(true);&lt;br /&gt; return BufferOp.bufferOp(geom, distance, bufParams);&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Currently this code is in SVN.  It will be released in JTS 1.12 (which will hopefully be shipping &lt;strike&gt;before year-end&lt;/strike&gt;  in Q2 2011).&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2420860529344694449-803528538006095015?l=lin-ear-th-inking.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lin-ear-th-inking.blogspot.com/feeds/803528538006095015/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2420860529344694449&amp;postID=803528538006095015&amp;isPopup=true' title='7 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2420860529344694449/posts/default/803528538006095015'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2420860529344694449/posts/default/803528538006095015'/><link rel='alternate' type='text/html' href='http://lin-ear-th-inking.blogspot.com/2010/11/single-sided-buffers-in-jts.html' title='Single-Sided Buffers in JTS'/><author><name>Dr JTS</name><uri>http://www.blogger.com/profile/02383381220154739793</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_q016kExGrVs/TOIUnI7hFtI/AAAAAAAAAh0/4H1_00mzpZg/s72-c/single-sided-buffer-input_arrows.png' height='72' width='72'/><thr:total>7</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2420860529344694449.post-6805618136636594379</id><published>2010-08-19T10:00:00.000-07:00</published><updated>2010-08-19T10:00:00.115-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='jts'/><category scheme='http://www.blogger.com/atom/ns#' term='geometry'/><title type='text'>Magnifying Topology using JTS</title><content type='html'>An issue that comes up all the time in the &lt;a href="http://tsusiatsoftware.net/jts/main.html"&gt;JTS&lt;/a&gt; world is how to &lt;span style="font-weight: bold;"&gt;visualize the topology&lt;/span&gt; of geometries which have &lt;span style="font-weight: bold;"&gt;very close vertices and segments&lt;/span&gt;.  For example, a question was &lt;a href="http://www.mail-archive.com/postgis-users@postgis.refractions.net/msg11135.html"&gt;recently posted&lt;/a&gt; on the PostGIS list about why in the situation shown below the spatial relationship predicate &lt;span style="font-family:courier new;"&gt;BLUE.contains(RED)&lt;/span&gt;  evaluates to &lt;span style="font-family:courier new;"&gt;FALSE&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_q016kExGrVs/TGsBKG71C7I/AAAAAAAAAfA/rx3oqEU6zkU/s1600/contains_orig.png"&gt;&lt;img style="display: block; margin: 0px auto 10px; text-align: center; cursor: pointer; width: 400px; height: 269px;" src="http://3.bp.blogspot.com/_q016kExGrVs/TGsBKG71C7I/AAAAAAAAAfA/rx3oqEU6zkU/s400/contains_orig.png" alt="" id="BLOGGER_PHOTO_ID_5506496242562436018" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;At first glance it looks like the red polygon follows the boundary of the blue one exactly, which would result in &lt;span style="font-family:courier new;"&gt;BLUE.contains(RED) = TRUE&lt;/span&gt;.  The immediate suspicion is that one of the apparently collinear points is actually in the exterior of the blue polygon.  But which one?  And how can this be confirmed visually?&lt;br /&gt;&lt;br /&gt;Now it so happens that the rightmost vertex of the red polygon, which  appears to be on the boundary of the blue polygon, is in fact in the  its exterior - thus explaing why &lt;span style="font-family:courier new;"&gt;contains = FALSE&lt;/span&gt;.  But it's so close to the boundary segment that no  matter how far you zoom in, you can't see that this is the case.  And  it's certainly not obvious where to go looking for this error in the  first place.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Back in the Dark Ages&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;The usual way to inspect these kinds of cases is is to tediously zoom in on each vertex.  But this loses the visual context of the situation.  And in very close cases it simply doesn't work, because the zoom factor is so great that the Swing graphics API is unable to display the scene correctly.&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;span style="font-style: italic;"&gt;Zoomed in...&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_q016kExGrVs/TGwicJIwiKI/AAAAAAAAAgA/QkVCDnP4YWc/s1600/Mag_Topo_zoom.png"&gt;&lt;img style="display: block; margin: 0px auto 10px; text-align: center; cursor: pointer; width: 277px; height: 241px;" src="http://3.bp.blogspot.com/_q016kExGrVs/TGwicJIwiKI/AAAAAAAAAgA/QkVCDnP4YWc/s400/Mag_Topo_zoom.png" alt="" id="BLOGGER_PHOTO_ID_5506814311251609762" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;span style="font-style: italic;"&gt;Zoomed further in...&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_q016kExGrVs/TGwic_MTLlI/AAAAAAAAAgQ/gjvTByzLkR4/s1600/Mag_Topo_zoomMore.png"&gt;&lt;img style="display: block; margin: 0px auto 10px; text-align: center; cursor: pointer; width: 277px; height: 241px;" src="http://1.bp.blogspot.com/_q016kExGrVs/TGwic_MTLlI/AAAAAAAAAgQ/gjvTByzLkR4/s400/Mag_Topo_zoomMore.png" alt="" id="BLOGGER_PHOTO_ID_5506814325761977938" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;span style="font-style: italic;"&gt;Zoomed way in - FAIL!&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: left;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_q016kExGrVs/TGwicercEZI/AAAAAAAAAgI/ZRrCQ27tvGQ/s1600/Mag_Topo_zoomFail.png"&gt;&lt;img style="display: block; margin: 0px auto 10px; text-align: center; cursor: pointer; width: 277px; height: 241px;" src="http://4.bp.blogspot.com/_q016kExGrVs/TGwicercEZI/AAAAAAAAAgI/ZRrCQ27tvGQ/s400/Mag_Topo_zoomFail.png" alt="" id="BLOGGER_PHOTO_ID_5506814317034213778" border="0" /&gt;&lt;/a&gt;Another alternative is a painstaking manual inspection of the coordinates of each vertex and segment (which by the way is straightforward in the TestBuilder and  OpenJUMP, but can be difficult in other tools).   But it's hard to convert the coordinate numbers into a mental image of the situation.  And it's essentially impossible to do mentally if a vertex is near a non-rectilinear (slanted) line - in this case it's necessary to evaluate a complex mathematical algorithm to to determine the relative orientation of the vertex and line.&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Into the 21st Century!&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;This limitation has bugged me for a long time, ever since JTS and the &lt;span style="font-weight: bold;"&gt;JCS Conflation Suite&lt;/span&gt; were being developed.   And it keeps coming up as a question, since this kind of situation occurs a lot when overlaying polygons.  Cutting new vertices into line segments almost always causes them to be non-coincident with the original segment,  but with very, very small discrepancies.&lt;br /&gt;&lt;br /&gt;So a while back I started to think about a tool that would somehow make subtle topological situations visible at convenient zoom levels.  The idea has been gathering dust on the lab bench for years, but I've finally had a chance to implement it.   It's now a feature in the &lt;span style="font-weight: bold;"&gt;JTS TestBuilder&lt;/span&gt; called &lt;span style="font-weight: bold;"&gt;Magnify Topology&lt;/span&gt;. Enabling it on changes the geometry view to provide &lt;span style="font-weight: bold;"&gt;easy and effective visualization&lt;/span&gt; of small topological differences.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_q016kExGrVs/TGwZBEeWtxI/AAAAAAAAAfI/ek3PSIzt2cA/s1600/JTS_TestBuilder_Magnify_Topology.png"&gt;&lt;img style="display: block; margin: 0px auto 10px; text-align: center; cursor: pointer; width: 242px; height: 61px;" src="http://1.bp.blogspot.com/_q016kExGrVs/TGwZBEeWtxI/AAAAAAAAAfI/ek3PSIzt2cA/s400/JTS_TestBuilder_Magnify_Topology.png" alt="" id="BLOGGER_PHOTO_ID_5506803950538897170" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Key aspects of Magnify Topology behaviour are:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Vertex  displacement is done in a way that preserves the original topology (e.g.  if a vertex is on the right side of a line it will stay on the right)&lt;/li&gt;&lt;li&gt;Vertices which are truly coincident or collinear remain unchanged in the magnified view.  &lt;/li&gt;&lt;li&gt;It's easy and quick to toggle Magnify Topology on and off to compare the actual and magnified views.&lt;/li&gt;&lt;/ul&gt;Using Magnify Topology, the above case looks like this:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_q016kExGrVs/TGsAsUub6MI/AAAAAAAAAew/p5ykva5C3ek/s1600/contains.magnify.png"&gt;&lt;img style="display: block; margin: 0px auto 10px; text-align: center; cursor: pointer; width: 400px; height: 269px;" src="http://2.bp.blogspot.com/_q016kExGrVs/TGsAsUub6MI/AAAAAAAAAew/p5ykva5C3ek/s400/contains.magnify.png" alt="" id="BLOGGER_PHOTO_ID_5506495730868283586" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Now it's &lt;span style="font-weight: bold;"&gt;obvious &lt;/span&gt;where the red polygon violates the &lt;span style="font-family:courier new;"&gt;contains &lt;/span&gt;relationship!  In addition, you can see that there are some very close vertices in the red polygon, that some of them are truly collinear with the blue boundary, and that the lower right red vertex is actually in the interior of the blue polygon.&lt;br /&gt;&lt;br /&gt;Here's some more examples, showing actual and magnified views:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;font-size:100%;" &gt;Example 1&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_q016kExGrVs/TGwd4pRIiQI/AAAAAAAAAfw/sXgqor7HeU0/s1600/Mag_Topo_jaggy_before.png"&gt;&lt;img style="display: block; margin: 0px auto 10px; text-align: center; cursor: pointer; width: 400px; height: 349px;" src="http://1.bp.blogspot.com/_q016kExGrVs/TGwd4pRIiQI/AAAAAAAAAfw/sXgqor7HeU0/s400/Mag_Topo_jaggy_before.png" alt="" id="BLOGGER_PHOTO_ID_5506809303354870018" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_q016kExGrVs/TGwd8HNXYwI/AAAAAAAAAf4/Xc3fw4jTf_I/s1600/Mag_Topo_jaggy_after.png"&gt;&lt;img style="display: block; margin: 0px auto 10px; text-align: center; cursor: pointer; width: 372px; height: 400px;" src="http://2.bp.blogspot.com/_q016kExGrVs/TGwd8HNXYwI/AAAAAAAAAf4/Xc3fw4jTf_I/s400/Mag_Topo_jaggy_after.png" alt="" id="BLOGGER_PHOTO_ID_5506809362931737346" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;font-size:100%;" &gt;Example 2&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;Note the truly coincident vertex along the boundary, which remains unchanged in the magnified view.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_q016kExGrVs/TGwd34LnaYI/AAAAAAAAAfg/p3BJzgrlCl8/s1600/Mag_Topo_boxes_before.png"&gt;&lt;img style="display: block; margin: 0px auto 10px; text-align: center; cursor: pointer; width: 400px; height: 184px;" src="http://1.bp.blogspot.com/_q016kExGrVs/TGwd34LnaYI/AAAAAAAAAfg/p3BJzgrlCl8/s400/Mag_Topo_boxes_before.png" alt="" id="BLOGGER_PHOTO_ID_5506809290178390402" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_q016kExGrVs/TGwd4XdAhvI/AAAAAAAAAfo/eJTfFdOkdww/s1600/Mag_Topo_boxes_after.png"&gt;&lt;img style="display: block; margin: 0px auto 10px; text-align: center; cursor: pointer; width: 400px; height: 194px;" src="http://4.bp.blogspot.com/_q016kExGrVs/TGwd4XdAhvI/AAAAAAAAAfo/eJTfFdOkdww/s400/Mag_Topo_boxes_after.png" alt="" id="BLOGGER_PHOTO_ID_5506809298572838642" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;font-size:100%;" &gt;Example 3&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_q016kExGrVs/TGwd3Hbz7UI/AAAAAAAAAfQ/Ku1jF9JXzmk/s1600/Mag_Topo_circle_before.png"&gt;&lt;img style="display: block; margin: 0px auto 10px; text-align: center; cursor: pointer; width: 400px; height: 327px;" src="http://2.bp.blogspot.com/_q016kExGrVs/TGwd3Hbz7UI/AAAAAAAAAfQ/Ku1jF9JXzmk/s400/Mag_Topo_circle_before.png" alt="" id="BLOGGER_PHOTO_ID_5506809277092982082" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_q016kExGrVs/TGwd3qEESEI/AAAAAAAAAfY/gs9i38v0FJA/s1600/Mag_Topo_circle_after.png"&gt;&lt;img style="display: block; margin: 0px auto 10px; text-align: center; cursor: pointer; width: 400px; height: 313px;" src="http://1.bp.blogspot.com/_q016kExGrVs/TGwd3qEESEI/AAAAAAAAAfY/gs9i38v0FJA/s400/Mag_Topo_circle_after.png" alt="" id="BLOGGER_PHOTO_ID_5506809286388631618" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Magnify Topology can also be used to detect and visualized differences between similar geometries (sort of like a visual geometric &lt;span style="font-family:courier new;"&gt;diff&lt;/span&gt;)  Here's a contrived example, showing two copies of a JTS logo, in which one copy has two tiny discrepancies (in the 15th decimal place!):&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_q016kExGrVs/TGxBgShNzTI/AAAAAAAAAgY/8Jng1It9i94/s1600/Mag_Topo_JTS_diff.png"&gt;&lt;img style="display: block; margin: 0px auto 10px; text-align: center; cursor: pointer; width: 400px; height: 299px;" src="http://1.bp.blogspot.com/_q016kExGrVs/TGxBgShNzTI/AAAAAAAAAgY/8Jng1It9i94/s400/Mag_Topo_JTS_diff.png" alt="" id="BLOGGER_PHOTO_ID_5506848467350048050" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Here's a more realistic real-world example:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_q016kExGrVs/TGxO2hCNhNI/AAAAAAAAAgg/Ak53YIiJBLE/s1600/Mag_Topo_polyDiff_actual.png"&gt;&lt;img style="display: block; margin: 0px auto 10px; text-align: center; cursor: pointer; width: 385px; height: 399px;" src="http://2.bp.blogspot.com/_q016kExGrVs/TGxO2hCNhNI/AAAAAAAAAgg/Ak53YIiJBLE/s400/Mag_Topo_polyDiff_actual.png" alt="" id="BLOGGER_PHOTO_ID_5506863142854821074" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_q016kExGrVs/TGxO2wzlqjI/AAAAAAAAAgo/YrVDAlUPDQA/s1600/Mag_Topo_polyDiff_mag.png"&gt;&lt;img style="display: block; margin: 0px auto 10px; text-align: center; cursor: pointer; width: 385px; height: 399px;" src="http://3.bp.blogspot.com/_q016kExGrVs/TGxO2wzlqjI/AAAAAAAAAgo/YrVDAlUPDQA/s400/Mag_Topo_polyDiff_mag.png" alt="" id="BLOGGER_PHOTO_ID_5506863147088456242" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;This feature will be released in the next version of JTS.  In the meantime it's available in the &lt;a href="http://sourceforge.net/projects/jts-topo-suite/develop"&gt;JTS SVN&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2420860529344694449-6805618136636594379?l=lin-ear-th-inking.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lin-ear-th-inking.blogspot.com/feeds/6805618136636594379/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2420860529344694449&amp;postID=6805618136636594379&amp;isPopup=true' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2420860529344694449/posts/default/6805618136636594379'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2420860529344694449/posts/default/6805618136636594379'/><link rel='alternate' type='text/html' href='http://lin-ear-th-inking.blogspot.com/2010/08/magnifying-topology-using-jts.html' title='Magnifying Topology using JTS'/><author><name>Dr JTS</name><uri>http://www.blogger.com/profile/02383381220154739793</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_q016kExGrVs/TGsBKG71C7I/AAAAAAAAAfA/rx3oqEU6zkU/s72-c/contains_orig.png' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2420860529344694449.post-7039198772071290972</id><published>2010-08-02T21:43:00.000-07:00</published><updated>2010-08-02T21:48:02.316-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='cloud computing'/><title type='text'>Cloudy Blogs</title><content type='html'>In order to try and keep abreast of the most far-reaching change to IT and computing since the invention of the PC (or the Internet, or time-sharing, or LSI, or solid-state, or commercial computing, or binary logic...), I have inaugurated a Blog Roll for sites which focus on cloud computing (in all its myriad and ever-changing forms...)&lt;br /&gt;&lt;br /&gt;See &lt;span style="font-weight: bold;"&gt;Cloudy Blog Roll&lt;/span&gt; in the RH side bar ---&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2420860529344694449-7039198772071290972?l=lin-ear-th-inking.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lin-ear-th-inking.blogspot.com/feeds/7039198772071290972/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2420860529344694449&amp;postID=7039198772071290972&amp;isPopup=true' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2420860529344694449/posts/default/7039198772071290972'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2420860529344694449/posts/default/7039198772071290972'/><link rel='alternate' type='text/html' href='http://lin-ear-th-inking.blogspot.com/2010/08/cloudy-blogs.html' title='Cloudy Blogs'/><author><name>Dr JTS</name><uri>http://www.blogger.com/profile/02383381220154739793</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2420860529344694449.post-7467566570981215063</id><published>2010-07-09T10:28:00.000-07:00</published><updated>2010-07-09T11:42:12.896-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='computation'/><category scheme='http://www.blogger.com/atom/ns#' term='json'/><category scheme='http://www.blogger.com/atom/ns#' term='web'/><title type='text'>Is JSON the CSV of the 21st Century?</title><content type='html'>It strikes me that JSON might be the CSV of the 21st century.   Consider these similarities:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;They both use POT (plain old text) as their encoding&lt;br /&gt;&lt;/li&gt;&lt;li&gt;The basic datatypes are &lt;span style="font-weight: bold;"&gt;strings &lt;/span&gt;and &lt;span style="font-weight: bold;"&gt;numbers&lt;/span&gt;. JSON adds &lt;span style="font-weight: bold;"&gt;booleans&lt;/span&gt; and &lt;span style="font-weight: bold;"&gt;nulls &lt;/span&gt;-  Yay for progress!&lt;/li&gt;&lt;li&gt;The only schema metadata supported is field names&lt;/li&gt;&lt;/ul&gt;JSON has the major advance of supporting hierarchical and array structures.  Of course, this makes it correspondingly more difficult to parse.&lt;br /&gt;&lt;br /&gt;CSV has stood the test of time extraordinarily well.  According to good 'ol Wikipedia &lt;a style="font-weight: bold;" href="http://en.wikipedia.org/wiki/Comma-separated_values#History"&gt;it's been around since at least 1967&lt;/a&gt; - that's over 40 years!&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://upload.wikimedia.org/wikipedia/commons/9/9e/360-91-panel.jpg"&gt;&lt;img style="display: block; margin: 0px auto 10px; text-align: center; cursor: pointer; width: 600px;" src="http://upload.wikimedia.org/wikipedia/commons/9/9e/360-91-panel.jpg" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;And CSV is still well supported whereever tabular data is used.  Let's see if JSON is still around in 2035...  I suspect not, because the half-life of technologies is a lot shorter these days.  (Maybe CSV is the &lt;a style="font-weight: bold;" href="http://en.wikipedia.org/wiki/Stromatolite"&gt;stromatolite &lt;/a&gt;of file formats!)&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://upload.wikimedia.org/wikipedia/commons/thumb/1/1b/Stromatolites_in_Sharkbay.jpg/300px-Stromatolites_in_Sharkbay.jpg"&gt;&lt;img style="display: block; margin: 0px auto 10px; text-align: center; cursor: pointer; width: 300px; height: 223px;" src="http://upload.wikimedia.org/wikipedia/commons/thumb/1/1b/Stromatolites_in_Sharkbay.jpg/300px-Stromatolites_in_Sharkbay.jpg" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;It would be nice if JSON had a standard schema notation. (There is &lt;a href="http://json-schema.org/"&gt;JSON-Schema&lt;/a&gt;. It copies the XML Schema idea of encoding the schema in JSON.   It remains to be seen whether this makes it as easy to use and popular as XML Schema has been. 8^)&lt;br /&gt;&lt;br /&gt;And why, o why, do field names have to be in quotes?  Ok, I know why &lt;span style="font-style: italic;"&gt;technically &lt;/span&gt;- they're just strings, and JSON strings need to be in quotes, because they need to be embeddable in JavaScript code.   But this is a classic case of a vestigial artifact which has a detrimental effect in a new environment.  Nobody should be evaling JSON as just another chunk of Javascript anyway, for obvious security reasons.  And in the wider world of JSON use cases following Javascript synax is completely irrelevant.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://en.wikipedia.org/wiki/YAML"&gt;YAML &lt;/a&gt;seems to have a lot advantages over JSON as a rich textual format.  For instance, it has minimal use of quotes, and a richer, extensible set of datatypes including timestamps and binary (WKB, anyone?).  But it's going to be pretty hard to dislodge JSON, which is solidly entrenched for all the wrong reasons.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2420860529344694449-7467566570981215063?l=lin-ear-th-inking.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lin-ear-th-inking.blogspot.com/feeds/7467566570981215063/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2420860529344694449&amp;postID=7467566570981215063&amp;isPopup=true' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2420860529344694449/posts/default/7467566570981215063'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2420860529344694449/posts/default/7467566570981215063'/><link rel='alternate' type='text/html' href='http://lin-ear-th-inking.blogspot.com/2010/07/is-json-csv-of-21st-century.html' title='Is JSON the CSV of the 21st Century?'/><author><name>Dr JTS</name><uri>http://www.blogger.com/profile/02383381220154739793</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2420860529344694449.post-5909661652943468121</id><published>2010-06-15T22:08:00.000-07:00</published><updated>2010-06-26T14:58:46.483-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='computational geometry'/><category scheme='http://www.blogger.com/atom/ns#' term='computation'/><category scheme='http://www.blogger.com/atom/ns#' term='jts'/><title type='text'>Improving DoubleDouble performance with self-modifying methods</title><content type='html'>In a &lt;a href="http://lin-ear-th-inking.blogspot.com/2010/06/improvements-to-robustness-in-jts.html"&gt;previous post&lt;/a&gt; I discussed how the &lt;tt&gt;DoubleDouble&lt;/tt&gt; extended-precision API provides more robust computation for the Delaunay &lt;tt&gt;inCircle&lt;/tt&gt; test.  Quite rightly there were questions about the performance impact of using &lt;tt&gt;DoubleDouble&lt;/tt&gt;.   Of course, there is a performance penalty, but it's not as large as you might think, since the inCircle computation is only a portion of the cost of the overall Delaunay algorithm .  For larger datasets the performance penalty is about &lt;span style="font-weight: bold;"&gt;2x&lt;/span&gt; - which seems like an acceptable tradeoff for obtaining robust computation.&lt;br /&gt;&lt;br /&gt;But after a bit of thought I realized that there was a simple way to improve the performance of using DoubleDouble.   I originally designed the &lt;tt&gt;DoubleDouble&lt;/tt&gt; API to provide &lt;span style="font-weight: bold;"&gt;value semantics&lt;/span&gt;, since this is a 100% safe way of evaluating expressions.   However, this requires creating a new object to contain the results of every operation.   The alternative is to provide &lt;span style="font-weight: bold;"&gt;self-modifying methods&lt;/span&gt;, which update the value of the object the method is called on.   In many arithmetic expressions, it's possible to use self-methods for most operations.  This avoids a lot of object instantiation and provides a significant performance benefit (even with Java's ultra-efficient object allocation code).&lt;br /&gt;&lt;br /&gt;I added self-method versions of all the basic operations to the &lt;tt&gt;DoubleDouble&lt;/tt&gt; API.  While I was at it I threw in operations which took &lt;tt&gt;double&lt;/tt&gt; arguments as well, since this is a common use case and allows avoiding even more allocations (as well as simplifying the code).  The self-methods are all prefixed with the word "self", to make them stand out since they are potentially dangerous if used incorrectly.  (I suppose a more Java-esque term would be "this-methods", but in this case the Smalltalk argot seems more elegant).&lt;br /&gt;&lt;br /&gt;I also decided to rename the class to &lt;span style="font-weight: bold;font-family:courier new;" &gt;DD&lt;/span&gt;, to improve the readability of the code.  Another enhancement might be to shorten the method names to 3 characters (e.g. "mul" instead of "multiply").&lt;br /&gt;&lt;br /&gt;As an example, here's the &lt;tt&gt;inCircle&lt;/tt&gt; code in the original implementation and using the improved API.  Note the use of the new &lt;span style="font-family:courier new;"&gt;DD.sqr(double)&lt;/span&gt; function to improve readability as well as performance.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:100%;"&gt;&lt;span style="font-weight: bold;"&gt;Original code&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;pre style="font-size: 90%; color: rgb(0, 0, 144);"&gt;&lt;br /&gt;public static boolean isInCircleDDSlow(&lt;br /&gt; Coordinate a, Coordinate b, Coordinate c,&lt;br /&gt; Coordinate p) {&lt;br /&gt;DD px = DD.valueOf(p.x);&lt;br /&gt;DD py = DD.valueOf(p.y);&lt;br /&gt;DD ax = DD.valueOf(a.x);&lt;br /&gt;DD ay = DD.valueOf(a.y);&lt;br /&gt;DD bx = DD.valueOf(b.x);&lt;br /&gt;DD by = DD.valueOf(b.y);&lt;br /&gt;DD cx = DD.valueOf(c.x);&lt;br /&gt;DD cy = DD.valueOf(c.y);&lt;br /&gt;&lt;br /&gt;DD aTerm = (ax.multiply(ax).add(ay.multiply(ay)))&lt;br /&gt;   .multiply(triAreaDDSlow(bx, by, cx, cy, px, py));&lt;br /&gt;DD bTerm = (bx.multiply(bx).add(by.multiply(by)))&lt;br /&gt;   .multiply(triAreaDDSlow(ax, ay, cx, cy, px, py));&lt;br /&gt;DD cTerm = (cx.multiply(cx).add(cy.multiply(cy)))&lt;br /&gt;   .multiply(triAreaDDSlow(ax, ay, bx, by, px, py));&lt;br /&gt;DD pTerm = (px.multiply(px).add(py.multiply(py)))&lt;br /&gt;   .multiply(triAreaDDSlow(ax, ay, bx, by, cx, cy));&lt;br /&gt;&lt;br /&gt;DD sum = aTerm.subtract(bTerm).add(cTerm).subtract(pTerm);&lt;br /&gt;boolean isInCircle = sum.doubleValue() &gt; 0;&lt;br /&gt;&lt;br /&gt;return isInCircle;&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:100%;"&gt;&lt;span style="font-weight: bold;"&gt;Improved code&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;pre style="font-size: 90%; color: rgb(0, 0, 144);"&gt;&lt;br /&gt;public static boolean isInCircleDDFast(&lt;br /&gt; Coordinate a, Coordinate b, Coordinate c,&lt;br /&gt; Coordinate p) {&lt;br /&gt;DD aTerm = (DD.sqr(a.x).selfAdd(DD.sqr(a.y)))&lt;br /&gt;   .selfMultiply(triAreaDDFast(b, c, p));&lt;br /&gt;DD bTerm = (DD.sqr(b.x).selfAdd(DD.sqr(b.y)))&lt;br /&gt;   .selfMultiply(triAreaDDFast(a, c, p));&lt;br /&gt;DD cTerm = (DD.sqr(c.x).selfAdd(DD.sqr(c.y)))&lt;br /&gt;   .selfMultiply(triAreaDDFast(a, b, p));&lt;br /&gt;DD pTerm = (DD.sqr(p.x).selfAdd(DD.sqr(p.y)))&lt;br /&gt;   .selfMultiply(triAreaDDFast(a, b, c));&lt;br /&gt;&lt;br /&gt;DD sum = aTerm.selfSubtract(bTerm).selfAdd(cTerm).selfSubtract(pTerm);&lt;br /&gt;boolean isInCircle = sum.doubleValue() &gt; 0;&lt;br /&gt;&lt;br /&gt;return isInCircle;&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;The table below summarizes the performance increase provided by using self-methods for &lt;tt&gt;inCircle&lt;/tt&gt;.  The penalty for using DD for improved robustness is now down to only about &lt;span style="font-weight: bold;"&gt;1.5x&lt;/span&gt; slowdown.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-style: italic;"&gt;Timings for Delaunay triangulation using inCircle predicate implemented using double-precision (DP), DoubleDouble (DD), and DoubleDouble with in-place operations (DD-self).  All times in milliseconds.&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;table border="1" cellspacing="1"&gt;&lt;br /&gt;&lt;tbody&gt;&lt;tr&gt;&lt;th&gt;# pts&lt;/th&gt;&lt;th&gt;DP&lt;/th&gt;&lt;th&gt;DD-self&lt;/th&gt;&lt;th&gt;DD&lt;/th&gt;&lt;/tr&gt;&lt;br /&gt;&lt;tr&gt;&lt;td align="right"&gt;1,000&lt;/td&gt;&lt;td align="right"&gt;30&lt;/td&gt;&lt;td align="right"&gt;47&lt;/td&gt;&lt;td align="right"&gt;80&lt;/td&gt;&lt;/tr&gt;&lt;br /&gt;&lt;tr&gt;&lt;td align="right"&gt;10,000&lt;/td&gt;&lt;td align="right"&gt;334&lt;/td&gt;&lt;td align="right"&gt;782&lt;/td&gt;&lt;td align="right"&gt;984&lt;/td&gt;&lt;/tr&gt;&lt;br /&gt;&lt;tr&gt;&lt;td align="right"&gt;10,000&lt;/td&gt;&lt;td align="right"&gt;7953&lt;/td&gt;&lt;td align="right"&gt;12578&lt;/td&gt;&lt;td align="right"&gt;16000&lt;/td&gt;&lt;/tr&gt;&lt;br /&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2420860529344694449-5909661652943468121?l=lin-ear-th-inking.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lin-ear-th-inking.blogspot.com/feeds/5909661652943468121/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2420860529344694449&amp;postID=5909661652943468121&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2420860529344694449/posts/default/5909661652943468121'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2420860529344694449/posts/default/5909661652943468121'/><link rel='alternate' type='text/html' href='http://lin-ear-th-inking.blogspot.com/2010/06/improving-doubledouble-performance-with.html' title='Improving DoubleDouble performance with self-modifying methods'/><author><name>Dr JTS</name><uri>http://www.blogger.com/profile/02383381220154739793</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2420860529344694449.post-2938472616436836310</id><published>2010-06-09T15:50:00.000-07:00</published><updated>2010-06-10T19:10:21.833-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='computational geometry'/><category scheme='http://www.blogger.com/atom/ns#' term='jts'/><title type='text'>Improvements to robustness in JTS Delaunay Triangulation</title><content type='html'>JTS 1.11 &lt;a href="http://tsusiatsoftware.net/jts/javadoc/com/vividsolutions/jts/triangulate/DelaunayTriangulationBuilder.html"&gt;added the capability&lt;/a&gt; to compute &lt;a href="http://en.wikipedia.org/wiki/Delaunay_triangulation"&gt;Delaunay Triangulations&lt;/a&gt; of point sets.  Although the triangulation code was extensively tested and used prior to release, it unfortunately didn't take long before someone &lt;a href="http://sourceforge.net/mailarchive/forum.php?thread_name=1270982868.2207.23.camel%40braz-laptop&amp;amp;forum_name=jts-topo-suite-user"&gt;uncovered a robustness issue&lt;/a&gt;.  The problem occurred in a large dataset of over 288,000 points.  When the JTS 1.11 Delaunay algorithm was run against this data, a &lt;span style="font-family:courier new;"&gt; TopologyException &lt;/span&gt;was thrown, preventing the computation from completing.&lt;br /&gt;&lt;br /&gt;Here's a portion of the dataset which produced the problem:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_q016kExGrVs/TBAi-LqGIEI/AAAAAAAAAYk/nzLx6kGsGAk/s1600/large_pointset.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 378px;" src="http://1.bp.blogspot.com/_q016kExGrVs/TBAi-LqGIEI/AAAAAAAAAYk/nzLx6kGsGAk/s400/large_pointset.png" alt="" id="BLOGGER_PHOTO_ID_5480919198186479682" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Digging into the code , it turned out (not unexpectedly) to be caused by a robustness failure in the &lt;span style="font-family:courier new;"&gt;inCircle&lt;/span&gt; predicate.  &lt;span style="font-family:courier new;"&gt;InCircle&lt;/span&gt; is a key test used in Delaunay triangulation.  The standard algorithm for computing it involves determining the sign of the determinant of a 4x4 matrix.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_q016kExGrVs/TBFis8u1vuI/AAAAAAAAAY4/Rwcxzz0hsXY/s1600/incircle_algorithm.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 212px;" src="http://4.bp.blogspot.com/_q016kExGrVs/TBFis8u1vuI/AAAAAAAAAY4/Rwcxzz0hsXY/s400/incircle_algorithm.png" alt="" id="BLOGGER_PHOTO_ID_5481270745842958050" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;This computation is notoriously prone to robustness failure when evaluated using double-precision arithmetic. The rounding errors inherent in using double-precision can cause the sign of the determinant to be computed incorrectly.  (For an good explanation of the issue see &lt;a href="http://www.cs.cmu.edu/%7Equake/robust.html"&gt;this page by Jonathan Shewchuk&lt;/a&gt;.)&lt;br /&gt;&lt;br /&gt;As a concrete example, consider testing whether the point&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;POINT (687958.13 7460720.99)&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;lies in the circumcircle of the triangle&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:courier new;"&gt;POLYGON ((687958.05 7460725.97, 687957.43 7460725.93, 687957.58 7460721, 687958.05 7460725.97)&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Visually this looks like:&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_q016kExGrVs/TBAgHlJB_DI/AAAAAAAAAYM/KSfqqCk-YIM/s1600/incircle_failure.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 384px;" src="http://2.bp.blogspot.com/_q016kExGrVs/TBAgHlJB_DI/AAAAAAAAAYM/KSfqqCk-YIM/s400/incircle_failure.png" alt="" id="BLOGGER_PHOTO_ID_5480916061111057458" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Zooming in, you can see that the query point is NOT in the circumcircle, so that&lt;span style="font-family:courier new;"&gt; InCircle()=FALSE&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_q016kExGrVs/TBAhkggNOXI/AAAAAAAAAYc/lKhpuxlqToc/s1600/incircle_failure_zoom.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 234px; height: 102px;" src="http://2.bp.blogspot.com/_q016kExGrVs/TBAhkggNOXI/AAAAAAAAAYc/lKhpuxlqToc/s400/incircle_failure_zoom.png" alt="" id="BLOGGER_PHOTO_ID_5480917657593919858" border="0" /&gt;&lt;/a&gt;However, evaluating the inCircle predicate determinant using double-precision computes &lt;span style="font-family:courier new;"&gt;InCircle()=TRUE&lt;/span&gt;.   This is because the large magnitude of the ordinate values relative to the size of the triangle causes the significant information to be lost in the roundoff error.  The effect of this error propagates through the Delaunay algorithm.  Ultimately this results in a convergence failure which is detected and reported.&lt;br /&gt;&lt;br /&gt;Luckily, a solution was immediately to hand, in the form of the &lt;span style="font-family:courier new;"&gt;DoubleDouble &lt;/span&gt;extended-precision library I &lt;a href="http://tsusiatsoftware.net/dd/main.html"&gt;ported to Java&lt;/a&gt; a while ago.  Re-implementing the predicate evaluation using DoubleDouble computed the correct results for inCircle in all cases.  This eliminated the robustness failure, and allowed the Delaunay Triangulation of the entire 288K point dataset to be computed without errors (for the record, this took 5 min 20 s).&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_q016kExGrVs/TBAi-mmWPuI/AAAAAAAAAYs/HKjaSWMpei4/s1600/large_pointset_DT.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 380px;" src="http://3.bp.blogspot.com/_q016kExGrVs/TBAi-mmWPuI/AAAAAAAAAYs/HKjaSWMpei4/s400/large_pointset_DT.png" alt="" id="BLOGGER_PHOTO_ID_5480919205418516194" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;The DoubleDouble code had been a solution in search of a problem for quite a while, so I was happy to get to prove its usefulness in a real-world situation.&lt;br /&gt;&lt;br /&gt;And the story doesn't end there - it gets even better...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2420860529344694449-2938472616436836310?l=lin-ear-th-inking.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lin-ear-th-inking.blogspot.com/feeds/2938472616436836310/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2420860529344694449&amp;postID=2938472616436836310&amp;isPopup=true' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2420860529344694449/posts/default/2938472616436836310'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2420860529344694449/posts/default/2938472616436836310'/><link rel='alternate' type='text/html' href='http://lin-ear-th-inking.blogspot.com/2010/06/improvements-to-robustness-in-jts.html' title='Improvements to robustness in JTS Delaunay Triangulation'/><author><name>Dr JTS</name><uri>http://www.blogger.com/profile/02383381220154739793</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_q016kExGrVs/TBAi-LqGIEI/AAAAAAAAAYk/nzLx6kGsGAk/s72-c/large_pointset.png' height='72' width='72'/><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2420860529344694449.post-6015994439852831786</id><published>2010-05-06T14:27:00.001-07:00</published><updated>2010-05-06T14:55:00.687-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='gis'/><category scheme='http://www.blogger.com/atom/ns#' term='computational geometry'/><category scheme='http://www.blogger.com/atom/ns#' term='cartography'/><category scheme='http://www.blogger.com/atom/ns#' term='jts'/><title type='text'>More Random Points in JTS</title><content type='html'>In my &lt;a href="http://lin-ear-th-inking.blogspot.com/2010/05/random-points-in-polygon-in-jts.html"&gt;last post&lt;/a&gt; I talked about the &lt;a href="http://postgis.refractions.net/pipermail/postgis-users/2010-May/026566.html"&gt;request on the PostGIS list&lt;/a&gt; for a function to generate dot-density maps, and about a JTS class to implement it. &lt;br /&gt;&lt;br /&gt;Currently the JTS implementation uses purely random points.  Here's what a field of purely random points looks like:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_q016kExGrVs/S-M1mNMk4KI/AAAAAAAAAWs/CUNpNqEd5mo/s1600/JTS_random_points.png"&gt;&lt;img style="display: block; margin: 0px auto 10px; text-align: center; cursor: pointer; width: 400px; height: 354px;" src="http://2.bp.blogspot.com/_q016kExGrVs/S-M1mNMk4KI/AAAAAAAAAWs/CUNpNqEd5mo/s400/JTS_random_points.png" alt="" id="BLOGGER_PHOTO_ID_5468273303051624610" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://postgis.refractions.net/pipermail/postgis-users/2010-May/026595.html"&gt;As a few people pointed out&lt;/a&gt;, and as is obvious from the image, this doesn't look that great, since there tends to be a lot of clusters and blank areas.  This doesn't give a very aesthetic effect when used for cartographic purposes.&lt;br /&gt;&lt;br /&gt;So I experimented with a few other options.&lt;br /&gt;&lt;br /&gt;Here's &lt;span style="font-weight: bold;"&gt;random points generated in a grid&lt;/span&gt; of cells (one point randomly located in each cell).  Better, but there are still clusters and blank areas.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_q016kExGrVs/S-M1mnjKSWI/AAAAAAAAAW0/o2blGBGjYvQ/s1600/JTS_random_points_in_grid.png"&gt;&lt;img style="display: block; margin: 0px auto 10px; text-align: center; cursor: pointer; width: 400px; height: 354px;" src="http://2.bp.blogspot.com/_q016kExGrVs/S-M1mnjKSWI/AAAAAAAAAW0/o2blGBGjYvQ/s400/JTS_random_points_in_grid.png" alt="" id="BLOGGER_PHOTO_ID_5468273310125672802" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Following &lt;a href="http://postgis.refractions.net/pipermail/postgis-users/2010-May/026598.html"&gt;an idea by Paul Ramsey&lt;/a&gt;, here's a grid where the &lt;span style="font-weight: bold;"&gt;random points are located in circles centred on each grid cell&lt;/span&gt;.  This is an improvementl, but still doesn't prevent points from ending up  close together.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_q016kExGrVs/S-M1m3mLZnI/AAAAAAAAAW8/zmeLN3abO_Q/s1600/JTS_random_points_in_grid_circles.png"&gt;&lt;img style="display: block; margin: 0px auto 10px; text-align: center; cursor: pointer; width: 400px; height: 354px;" src="http://4.bp.blogspot.com/_q016kExGrVs/S-M1m3mLZnI/AAAAAAAAAW8/zmeLN3abO_Q/s400/JTS_random_points_in_grid_circles.png" alt="" id="BLOGGER_PHOTO_ID_5468273314433295986" border="0" /&gt;&lt;/a&gt;Next idea: &lt;span style="font-weight: bold;"&gt;use square cells, but add a "gutter" between each cell&lt;/span&gt;.  No points are created in the gutter, ensuring that points cannot be closer than the gutter width.  In this image the gutter width is 30% of the overall cell width.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_q016kExGrVs/S-M1nAZvsLI/AAAAAAAAAXE/mQpPCvGLYRs/s1600/JTS_random_points_in_grid_with_gutter.png"&gt;&lt;img style="display: block; margin: 0px auto 10px; text-align: center; cursor: pointer; width: 400px; height: 354px;" src="http://1.bp.blogspot.com/_q016kExGrVs/S-M1nAZvsLI/AAAAAAAAAXE/mQpPCvGLYRs/s400/JTS_random_points_in_grid_with_gutter.png" alt="" id="BLOGGER_PHOTO_ID_5468273316797067442" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Much better, I think.    Although, as the gutter size increases, the underlying grid becomes apparent.  Here's a 50% gutter:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_q016kExGrVs/S-M3YIWO2_I/AAAAAAAAAXM/-FKOOgfgLPU/s1600/JTS_random_points_in_grid_with_gutter_50.png"&gt;&lt;img style="display: block; margin: 0px auto 10px; text-align: center; cursor: pointer; width: 400px; height: 354px;" src="http://4.bp.blogspot.com/_q016kExGrVs/S-M3YIWO2_I/AAAAAAAAAXM/-FKOOgfgLPU/s400/JTS_random_points_in_grid_with_gutter_50.png" alt="" id="BLOGGER_PHOTO_ID_5468275260255034354" border="0" /&gt;&lt;/a&gt;Maybe's there's still improvements that can be made....  It would be nice to avoid the grid effect, and also to reduce the use of a gutter (which skews the density of the distribution).&lt;br /&gt;&lt;br /&gt;As &lt;a href="http://postgis.refractions.net/pipermail/postgis-users/2010-May/026602.html"&gt;David William Bitner pointed out&lt;/a&gt;, these can all be restricted to polygonal areas by simply intersecting the point field with the polygon.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2420860529344694449-6015994439852831786?l=lin-ear-th-inking.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lin-ear-th-inking.blogspot.com/feeds/6015994439852831786/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2420860529344694449&amp;postID=6015994439852831786&amp;isPopup=true' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2420860529344694449/posts/default/6015994439852831786'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2420860529344694449/posts/default/6015994439852831786'/><link rel='alternate' type='text/html' href='http://lin-ear-th-inking.blogspot.com/2010/05/more-random-points-in-jts.html' title='More Random Points in JTS'/><author><name>Dr JTS</name><uri>http://www.blogger.com/profile/02383381220154739793</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_q016kExGrVs/S-M1mNMk4KI/AAAAAAAAAWs/CUNpNqEd5mo/s72-c/JTS_random_points.png' height='72' width='72'/><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2420860529344694449.post-3679395926738759637</id><published>2010-05-06T09:50:00.001-07:00</published><updated>2010-05-06T10:29:13.751-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='jts'/><title type='text'>Random Points in Polygon in JTS</title><content type='html'>Recently there was a &lt;a href="http://postgis.refractions.net/pipermail/postgis-users/2010-May/026566.html"&gt;thread on the PostGIS list&lt;/a&gt; about how to create "&lt;span style="font-weight: bold;"&gt;dot-density&lt;/span&gt;" maps.  Essentially this involves creating a &lt;span style="font-weight: bold;"&gt;set of N randomly-placed points which lie within a given polygon&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;JTS already has a lot of random shape creation functions provided in the TestBuilder (randomPoints, randomPointsInGrid, randomRadialPoints, randomRectilinearWalk, etc).  But they aren't currently exposed as a class in the API.  This seemed like a good use case to initiate the development of such a class.&lt;br /&gt;&lt;br /&gt;So now JTS has a &lt;span style="font-family: courier new;"&gt;RandomShapeFactory &lt;/span&gt;class.  The class allows setting an extent using either a rectangular Envelope or a polygonal geometry, and will create sets of N points within the defined extent.&lt;br /&gt;&lt;br /&gt;Here's a screenshot of the TestBuilder showing the new function at work:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_q016kExGrVs/S-L541260WI/AAAAAAAAAWk/NROywGt3kXg/s1600/JTS-Random_points_in_poly.png"&gt;&lt;img style="display: block; margin: 0px auto 10px; text-align: center; cursor: pointer; width: 376px; height: 400px;" src="http://2.bp.blogspot.com/_q016kExGrVs/S-L541260WI/AAAAAAAAAWk/NROywGt3kXg/s400/JTS-Random_points_in_poly.png" alt="" id="BLOGGER_PHOTO_ID_5468207652506620258" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Update:&lt;/span&gt; it's been pointed out that what is really desired is to have the points &lt;span style="font-weight: bold;"&gt;evenly distributed&lt;/span&gt; through the polygon.  This will take a bit more thinking...   At least the API won't have to change much to support this.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2420860529344694449-3679395926738759637?l=lin-ear-th-inking.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lin-ear-th-inking.blogspot.com/feeds/3679395926738759637/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2420860529344694449&amp;postID=3679395926738759637&amp;isPopup=true' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2420860529344694449/posts/default/3679395926738759637'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2420860529344694449/posts/default/3679395926738759637'/><link rel='alternate' type='text/html' href='http://lin-ear-th-inking.blogspot.com/2010/05/random-points-in-polygon-in-jts.html' title='Random Points in Polygon in JTS'/><author><name>Dr JTS</name><uri>http://www.blogger.com/profile/02383381220154739793</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_q016kExGrVs/S-L541260WI/AAAAAAAAAWk/NROywGt3kXg/s72-c/JTS-Random_points_in_poly.png' height='72' width='72'/><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2420860529344694449.post-545814540169466008</id><published>2010-04-26T12:49:00.001-07:00</published><updated>2010-04-26T13:07:04.518-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='computation'/><category scheme='http://www.blogger.com/atom/ns#' term='web'/><title type='text'>Late night link roundup</title><content type='html'>Here's a few interesting links that occupied my late-night browsing...&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.infoq.com/news/2010/04/facebook-graph-api"&gt;Facebook's Graph API: The Future Of Semantic Web?&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;This is interesting for two reasons.  One is that this is a hardball play by Facebook to subvert many other sites whose business model is linking social networking to categories of cultural artifacts.  The other is the implications for the Semantic Web.  I'm not so sure that the latter is quite so easily accomplished, but perhaps the 80-20 rule will truly turn out to be key here.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.infoq.com/news/2010/04/mahout-03"&gt;Mahout 0.3: Open Source Machine Learning&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Neat stuff.  Pulls together some fascinating technologies like Hadoop and clustering techniques.  Perhaps the best thing about this is the chance to learn more about how this stuff actually works in practice.  It would be great if there's a spatial component to this.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://acs.lbl.gov/%7Ehoschek/colt/index.html"&gt;Colt&lt;/a&gt; - a set of Open Source Libraries for High Performance Scientific and Technical Computing in Java.   One more nail in the old "Java is too slow" canard.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2420860529344694449-545814540169466008?l=lin-ear-th-inking.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lin-ear-th-inking.blogspot.com/feeds/545814540169466008/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2420860529344694449&amp;postID=545814540169466008&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2420860529344694449/posts/default/545814540169466008'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2420860529344694449/posts/default/545814540169466008'/><link rel='alternate' type='text/html' href='http://lin-ear-th-inking.blogspot.com/2010/04/late-night-link-roundup.html' title='Late night link roundup'/><author><name>Dr JTS</name><uri>http://www.blogger.com/profile/02383381220154739793</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2420860529344694449.post-1892319362763167798</id><published>2010-04-07T13:49:00.000-07:00</published><updated>2010-04-26T10:07:11.684-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='jts'/><title type='text'>Twitter heart JTS</title><content type='html'>At least, that's what it looks like from their presentation on &lt;a href="http://en.oreilly.com/where2010/public/schedule/detail/12398"&gt;Handling Real-Time Datastreams&lt;/a&gt; at the recent Where 2.0.&lt;br /&gt;&lt;br /&gt;They note that JTS does not have support for GeoRSS or GeoJSON.  Actually there is a GeoJSON implementation sitting in the labs - but it really needs some funding to get it finished off (hint, hint, Twitter - what, you think this groovy open-source spatial stuff just codes itself?)&lt;br /&gt;&lt;br /&gt;And as usual people have not noticed that the real source for JTS information is on the new &lt;a href="http://tsusiatsoftware.net/jts/main.html"&gt;home page&lt;/a&gt; and the &lt;a href="http://sourceforge.net/projects/jts-topo-suite/"&gt;Sourceforge site&lt;/a&gt; - not this &lt;a href="http://www.vividsolutions.com/jts/jtshome.htm"&gt;stale web page&lt;/a&gt;.  Sigh...  if only URLs had expiry dates.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_q016kExGrVs/S7zype5J_AI/AAAAAAAAAWA/oMBBdSibhsY/s1600/twitter_heart_jts.png"&gt;&lt;img style="display: block; margin: 0px auto 10px; text-align: center; cursor: pointer; width: 356px; height: 190px;" src="http://1.bp.blogspot.com/_q016kExGrVs/S7zype5J_AI/AAAAAAAAAWA/oMBBdSibhsY/s400/twitter_heart_jts.png" alt="" id="BLOGGER_PHOTO_ID_5457503642947550210" border="0" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2420860529344694449-1892319362763167798?l=lin-ear-th-inking.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lin-ear-th-inking.blogspot.com/feeds/1892319362763167798/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2420860529344694449&amp;postID=1892319362763167798&amp;isPopup=true' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2420860529344694449/posts/default/1892319362763167798'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2420860529344694449/posts/default/1892319362763167798'/><link rel='alternate' type='text/html' href='http://lin-ear-th-inking.blogspot.com/2010/04/twiiter-heart-jts.html' title='Twitter heart JTS'/><author><name>Dr JTS</name><uri>http://www.blogger.com/profile/02383381220154739793</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_q016kExGrVs/S7zype5J_AI/AAAAAAAAAWA/oMBBdSibhsY/s72-c/twitter_heart_jts.png' height='72' width='72'/><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2420860529344694449.post-8730363573916836134</id><published>2010-03-10T14:54:00.001-08:00</published><updated>2010-03-10T15:03:04.342-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='jts'/><title type='text'>Google heart JTS</title><content type='html'>... and a &lt;a href="http://randommarkers.blogspot.com/2010/01/slides-from-my-upcoming-talk-at.html"&gt;bunch of other OSS spatial tools and goodies&lt;/a&gt;, too, of course.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_q016kExGrVs/S5glBNYacAI/AAAAAAAAAVc/wlqRgOyYv2c/s1600-h/google_heart_jts.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 393px; height: 131px;" src="http://1.bp.blogspot.com/_q016kExGrVs/S5glBNYacAI/AAAAAAAAAVc/wlqRgOyYv2c/s400/google_heart_jts.png" alt="" id="BLOGGER_PHOTO_ID_5447144452006768642" border="0" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2420860529344694449-8730363573916836134?l=lin-ear-th-inking.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lin-ear-th-inking.blogspot.com/feeds/8730363573916836134/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2420860529344694449&amp;postID=8730363573916836134&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2420860529344694449/posts/default/8730363573916836134'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2420860529344694449/posts/default/8730363573916836134'/><link rel='alternate' type='text/html' href='http://lin-ear-th-inking.blogspot.com/2010/03/google-heart-jts.html' title='Google heart JTS'/><author><name>Dr JTS</name><uri>http://www.blogger.com/profile/02383381220154739793</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_q016kExGrVs/S5glBNYacAI/AAAAAAAAAVc/wlqRgOyYv2c/s72-c/google_heart_jts.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2420860529344694449.post-8657239733722833437</id><published>2010-03-09T17:39:00.000-08:00</published><updated>2010-03-09T17:39:00.447-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='open source'/><category scheme='http://www.blogger.com/atom/ns#' term='software'/><category scheme='http://www.blogger.com/atom/ns#' term='geospatial'/><category scheme='http://www.blogger.com/atom/ns#' term='geocoding'/><title type='text'>More Open-Source Geocoders</title><content type='html'>To continue my &lt;a href="http://lin-ear-th-inking.blogspot.com/2010/03/open-source-geocoders.html"&gt;previous post on open-source geocoders&lt;/a&gt;, here's a few more geocoding projects we've reviewed here at &lt;a href="http://www.refractions.net/"&gt;Refractions&lt;/a&gt;:&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a style="font-weight: bold;" href="http://www.pagcgeo.org/"&gt;PAGC Postal Address GeoCoder&lt;/a&gt; (  )  is "&lt;span style="font-style: italic;"&gt;a library and a &lt;/span&gt;&lt;span style="font-style: italic;" class="caps"&gt;CGI&lt;/span&gt;&lt;span style="font-style: italic;"&gt; based web service written in &lt;/span&gt;&lt;span style="font-style: italic;" class="caps"&gt;ANSI C&lt;/span&gt;&lt;span style="font-style: italic;"&gt; that uses an address-ranged street network shapefile&lt;/span&gt;".  It uses a rule-based parser based on the Aho-Corasick string searching algorithm.  The parser rules are user-configurable, which is nice (although the rule format is NON-user-friendly, consisting of opaque lists of integers!).  Exact match, Soundex and Edit distance are used in the matching phase.   Supported reference road networks include both the TIGER and the StatsCan networks.  BerkeleyDB is used as the reference network data store.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;The &lt;a style="font-weight: bold;" href="https://webgis.usc.edu/Services/Geocode/Default.aspx"&gt;USC WebGIS Geocoder&lt;/a&gt; provides a free, size-limited geocoding service.  It claims to be open source,  however links to the source code are not obviously provided.  It is documented as using a "rule-based parser", but it's not clear how a user could actually customize this and run their own instance. Matching uses attribute relaxation, substring matching, and Soundex.  The reference dataset appears to be TIGER, stored in a MS SQLServer database.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;The &lt;a style="font-weight: bold;" href="http://cs.anu.edu.au/%7EPeter.Christen/Febrl/febrl-0.3/febrldoc-0.3/node53.html"&gt;FEBRL Geocoder&lt;/a&gt; is a well-researched, well-documented system implemented in Python.  It targets Australian road network data.  It specifically does not attempt to work with North American data (but suggests that the address models are close enough that this would be possible.)   The address parser is unique in using a trainable &lt;a style="font-weight: bold;" href="http://en.wikipedia.org/wiki/Hidden_Markov_model"&gt;Hidden Markov Model&lt;/a&gt;, and also in being documented by a series of academic papers (e.g. [1] ) describing the approach in detail.  An address cleaning module is supplied.  Matching uses exact or "approximate matching".&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;The &lt;a style="font-weight: bold;" href="http://wiki.osgeo.org/wiki/OpenGeocoder"&gt;OpenGeocoder&lt;/a&gt; initiative appears to be a worthy attempt to create a geocoder under the auspices of &lt;span style="font-weight: bold;"&gt;OpenGeo &lt;/span&gt;(possibly as a port of PAGC?). However, this project has not had much recent activity, and doesn't appear to provide any actual code.&lt;/li&gt;&lt;/ul&gt;One salient aspect of these systems is that they provide address parsing algorithms which are based on well-understood parsing theory.  This is of particular interest for our geocoder project - of which more later.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;References&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;br /&gt;[1] &lt;span style="font-style: italic; font-weight: bold;"&gt;A probabilistic geocoding system utilising a parcel based address file&lt;/span&gt;; CHRISTEN Peter,  WILLMORE Alan,  CHURCHES Tim; &lt;span style="font-style: italic;"&gt;Data mining :   (   theory, methodology, techniques, and applications  ), &lt;/span&gt;2006&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2420860529344694449-8657239733722833437?l=lin-ear-th-inking.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lin-ear-th-inking.blogspot.com/feeds/8657239733722833437/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2420860529344694449&amp;postID=8657239733722833437&amp;isPopup=true' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2420860529344694449/posts/default/8657239733722833437'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2420860529344694449/posts/default/8657239733722833437'/><link rel='alternate' type='text/html' href='http://lin-ear-th-inking.blogspot.com/2010/03/more-open-source-geocoders.html' title='More Open-Source Geocoders'/><author><name>Dr JTS</name><uri>http://www.blogger.com/profile/02383381220154739793</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2420860529344694449.post-8064488945966870024</id><published>2010-03-06T13:30:00.000-08:00</published><updated>2010-03-07T14:37:42.904-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='algorithms'/><category scheme='http://www.blogger.com/atom/ns#' term='computation'/><category scheme='http://www.blogger.com/atom/ns#' term='geospatial'/><category scheme='http://www.blogger.com/atom/ns#' term='geocoding'/><title type='text'>Open Source Geocoders</title><content type='html'>One of the more interesting projects we have going on here at &lt;a href="http://www.refractions.net/"&gt;Refractions&lt;/a&gt; is to build a geocoder for use in a crime-mapping application we are developing for a client.    We do have an existing geocoder codebase developed for another project.  But we're not 100% happy with its performance and customizability, so we decided to look into developing a new library specifically for this project.&lt;br /&gt;&lt;br /&gt;Of course the first thing we did was carry out a technology review of all the open-source geocoders we could find.  Here's a list of all the ones we looked at:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a style="font-weight: bold;" href="http://search.cpan.org/%7Esderle/Geo-Coder-US/"&gt;Geo-Coder-US&lt;/a&gt; - A Perl module developed by the ubiquitous Schuyler Erle.  "&lt;span style="font-style: italic;"&gt;For geocoding US addresses, that is, estimating the latitude and longitude of any street address or intersection in the United States, using the TIGER/Line data set&lt;/span&gt;".  Probably no longer being developed, since it has been superseded by&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;GeoCommons &lt;/span&gt;&lt;a style="font-weight: bold;" href="http://github.com/geocommons/geocoder"&gt;Geocoder::US&lt;/a&gt; - a rewrite of Geo-Coder-US into Ruby (and also requiring C and SQLite).  "&lt;span style="font-style: italic;"&gt;Although it is primarily intended for use with the US Census Bureau’s free TIGER/Line dataset, it uses an abstract US address data model that can be employed with other sources of US street address range data&lt;/span&gt;"&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;&lt;a style="font-weight: bold;" href="http://jgeocoder.sourceforge.net/"&gt;JGeoCoder&lt;/a&gt; - A Java API loosely modelled after Geo::Coder::US.   Works against a SQL database loaded with TIGER data (an H2 image is supplied).  Last activity in 2008.&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;&lt;a style="font-weight: bold;" href="http://www.extendthereach.com/products/OpenSourceGeocoder.srct"&gt;Explorer GeoCoder&lt;/a&gt; by SRC - A C++ library for "&lt;span style="font-style: italic;"&gt;a data and country independent geocoding engine&lt;/span&gt;" which can "&lt;span style="font-style: italic;"&gt;assign latitude and longitude coordinates to any United States street address or intersection&lt;/span&gt;".  Has an active mailing list.&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://www.snowman.net/git/tiger_geocoder/"&gt;&lt;span style="font-weight: bold;"&gt;Frost Tiger Geocoder&lt;/span&gt;&lt;/a&gt; by Stephen Frost et al - a Postgres SQL library for geocoding against TIGER data&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;(This is summarized in tabular form on this &lt;a href="http://tsusiatsoftware.net/geocode.html"&gt;Tsusiat page&lt;/a&gt;).&lt;br /&gt;&lt;br /&gt;Some observations:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;All of the engines implement parsing and matching logic purely in code.  None of them provide a declarative description language to allow easy modification of parsing, standardization, and matching rules.  (To be fair, this is bit of a tall order.  And it's not clear that it's even possible to provide an &lt;span style="font-style: italic;"&gt;understandable &lt;/span&gt;declarative language for the fully general case.    For example, the ArcMap geocoder  (which appears to be the old MatchWare engine) provides a geocoding definition language (actually 5 different ones)  - but the languages look scarily complex!   Nonetheless, this is an important feature for easy of maintenance and customization.)&lt;/li&gt;&lt;li&gt;JGeoCoder uses a large number of complex regular expressions to perform parsing.  This looks like it would be difficult to customize, due to the well-known opaqueness of large REs, and perhaps also to the relative inflexibility of the RE paradigm&lt;/li&gt;&lt;li&gt;The GeoCoder::US Ruby module seems to be the simplest code base.   (I ended up almost understanding its parsing algorithm  8^)  It uses REs, but in a saner amount.   However, it's unclear how well it deals with erroneous input data, and how easy it would be to modify for a different address model.&lt;/li&gt;&lt;li&gt;The Explorer geocoder uses a large amount of fairly complex C++ code. It also looked quite challenging to understand and modify.&lt;/li&gt;&lt;li&gt;In all the projects the parser design appears to be fairly ad-hoc and poorly documented.    This situation doesn't inspire confidence that it would be possible to modify the parser to support a different address model, or to handle particular kinds of input errors. (GeoCoder::US is a possible exception to this - it has a relatively simple parsing algorithm with at least some documentation).&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;In the end we decided not to use any of these projects.    I'll talk about what we &lt;span style="font-style: italic;"&gt;did &lt;/span&gt;do in another post.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2420860529344694449-8064488945966870024?l=lin-ear-th-inking.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lin-ear-th-inking.blogspot.com/feeds/8064488945966870024/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2420860529344694449&amp;postID=8064488945966870024&amp;isPopup=true' title='11 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2420860529344694449/posts/default/8064488945966870024'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2420860529344694449/posts/default/8064488945966870024'/><link rel='alternate' type='text/html' href='http://lin-ear-th-inking.blogspot.com/2010/03/open-source-geocoders.html' title='Open Source Geocoders'/><author><name>Dr JTS</name><uri>http://www.blogger.com/profile/02383381220154739793</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>11</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2420860529344694449.post-857714516510908232</id><published>2010-03-01T21:47:00.000-08:00</published><updated>2010-03-01T21:58:11.872-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='jts'/><title type='text'>JTS Version 1.11 released!</title><content type='html'>JTS Version 1.11 is &lt;a href="http://sourceforge.net/projects/jts-topo-suite/"&gt;now available for download from SourceForge&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_q016kExGrVs/S4yn-2KL5aI/AAAAAAAAAVU/noteaxsZh1o/s1600-h/JTS.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 274px; height: 125px;" src="http://1.bp.blogspot.com/_q016kExGrVs/S4yn-2KL5aI/AAAAAAAAAVU/noteaxsZh1o/s400/JTS.png" alt="" id="BLOGGER_PHOTO_ID_5443910747716052386" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;The version contains numerous enhancements, including&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Delaunay triangulation&lt;/span&gt; and &lt;span style="font-weight: bold;"&gt;Voronoi diagrams&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;AWT Shape&lt;/span&gt; reading and writing&lt;/li&gt;&lt;li&gt;Geometry &lt;span style="font-weight: bold;"&gt;similarity metrics&lt;/span&gt;&lt;/li&gt;&lt;li&gt;support for Geometry &lt;span style="font-weight: bold;"&gt;densification&lt;/span&gt;&lt;/li&gt;&lt;li&gt;Numerous improvements to the&lt;span style="font-weight: bold;"&gt; JTS TestBuilder&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;Full release notes:&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Functionality Improvements&lt;/h3&gt; &lt;ul&gt;&lt;li&gt;Added &lt;tt&gt;CoordinateArrays.isRing&lt;/tt&gt; &lt;/li&gt;&lt;li&gt;Added &lt;tt&gt;CGAlgorithms.signedArea(CoordinateSequence)&lt;/tt&gt; &lt;/li&gt;&lt;li&gt;Added &lt;tt&gt;CoordinateArrays.copyDeep(...)&lt;/tt&gt; method to copy sections of arrays &lt;/li&gt;&lt;li&gt;Added &lt;tt&gt;CoordinateList.add(Coordinate[], boolean, int, int)&lt;/tt&gt; method to add sections of arrays &lt;/li&gt;&lt;li&gt;Added &lt;tt&gt;LineSegment.toGeometry()&lt;/tt&gt;, &lt;tt&gt;LineSegment.lineIntersection()()&lt;/tt&gt; &lt;/li&gt;&lt;li&gt;Added &lt;tt&gt;LineSegment.hashCode()&lt;/tt&gt; &lt;/li&gt;&lt;li&gt;Added geometric similarity classes (&lt;tt&gt;HausdorffSimilarityMeasure&lt;/tt&gt;, &lt;tt&gt;AreaSimilarityMeasure&lt;/tt&gt;) &lt;/li&gt;&lt;li&gt;Added &lt;tt&gt;MinimumDiameter.getMinimumRectangle()&lt;/tt&gt; &lt;/li&gt;&lt;li&gt;Added &lt;tt&gt;MinimumBoundingCircle&lt;/tt&gt; class &lt;/li&gt;&lt;li&gt;Added &lt;tt&gt;Densifier&lt;/tt&gt; class &lt;/li&gt;&lt;li&gt;Added triangulation API, including &lt;tt&gt;QuadEdgeSubdivision&lt;/tt&gt;, &lt;tt&gt;IncrementalDelaunayTriangulator&lt;/tt&gt;,  &lt;tt&gt;ConformingDelaunayTriangulator&lt;/tt&gt; and supporting classes &lt;/li&gt;&lt;li&gt;Added &lt;tt&gt;VoronoiDiagramBuilder&lt;/tt&gt; to perform Voronoi diagram generation &lt;/li&gt;&lt;li&gt;Added &lt;tt&gt;scaleInstance(scaleX, scaleY, x, y)&lt;/tt&gt; to &lt;tt&gt;AffineTransformation&lt;/tt&gt; &lt;/li&gt;&lt;li&gt;Added &lt;tt&gt;AffineTransformationFactory&lt;/tt&gt; to allow generating transformations from various kinds of control inputs &lt;/li&gt;&lt;li&gt;Added &lt;tt&gt;BinTree.remove()&lt;/tt&gt; method &lt;/li&gt;&lt;li&gt;Fixed &lt;tt&gt;BinTree.query()&lt;/tt&gt; to allow null interval arguments &lt;/li&gt;&lt;li&gt;Added &lt;tt&gt;ShapeReader&lt;/tt&gt; API to convert Java2D Shapes into JTS Geometry &lt;/li&gt;&lt;li&gt;Added &lt;tt&gt;ShapeWriter&lt;/tt&gt; API to convert JTS geometry into Java2D Shapes &lt;/li&gt;&lt;li&gt;Added &lt;tt&gt;FontGlyphReader&lt;/tt&gt; API to render Java2D text font glyphs into geometry &lt;/li&gt;&lt;li&gt;Added &lt;tt&gt;SdeReader&lt;/tt&gt; to &lt;b&gt;jtsio&lt;/b&gt; library &lt;/li&gt;&lt;li&gt;Added &lt;tt&gt;Debug&lt;/tt&gt; break methods &lt;/li&gt;&lt;li&gt;Added &lt;tt&gt;Memory&lt;/tt&gt; utility for reporting memory statistics &lt;/li&gt;&lt;li&gt;Added &lt;tt&gt;ObjectCounter&lt;/tt&gt; utility for counting objects &lt;/li&gt;&lt;li&gt;Added &lt;tt&gt;createSquircle&lt;/tt&gt; and &lt;tt&gt;createSuperCircle&lt;/tt&gt; to &lt;tt&gt;GeometricShapeFactory&lt;/tt&gt; &lt;/li&gt;&lt;/ul&gt;  &lt;h3&gt;Performance Improvements&lt;/h3&gt; &lt;ul&gt;&lt;li&gt;Improved performance of &lt;tt&gt;Geometry.getArea()&lt;/tt&gt; and &lt;tt&gt;Geometry.getLength()&lt;/tt&gt; when used with custom &lt;tt&gt;CoordinateSequence&lt;/tt&gt;s &lt;/li&gt;&lt;/ul&gt;  &lt;h3&gt;API Changes&lt;/h3&gt; &lt;ul&gt;&lt;li&gt;Deprecated &lt;tt&gt;WKBWriter.bytesToHex&lt;/tt&gt; in favour of &lt;tt&gt;WKBWriter.toHex&lt;/tt&gt;to regularize and simplify method name &lt;/li&gt;&lt;/ul&gt;  &lt;h3&gt;Bug Fixes&lt;/h3&gt; &lt;ul&gt;&lt;li&gt;Fixed Point.isValid() to check for invalid coordinates (ie with Nan ordinates) &lt;/li&gt;&lt;li&gt;Fixed &lt;tt&gt;Geometry.distance()&lt;/tt&gt; and &lt;tt&gt;DistanceOp&lt;/tt&gt; to return 0.0 for empty inputs &lt;/li&gt;&lt;li&gt;Fixed &lt;tt&gt;Buffer&lt;/tt&gt; to handle degenerate polygons with too few distinct points correctly &lt;/li&gt;&lt;li&gt;Added illegal state check in &lt;tt&gt;LineSegment.pointAlongOffset()&lt;/tt&gt; &lt;/li&gt;&lt;li&gt;Fixed exception strategy in &lt;tt&gt;BufferSubgraph&lt;/tt&gt; to handle certain robustness failures correctly &lt;/li&gt;&lt;li&gt;Fixed robustness problem in &lt;tt&gt;OffsetCurveBuilder&lt;/tt&gt; in computing mitred joins for nearly parallel segments &lt;/li&gt;&lt;li&gt;Fixed minor bug in &lt;tt&gt;BufferInputLineSimplifier&lt;/tt&gt; which prevented simplification of some situations &lt;/li&gt;&lt;li&gt;Fixed bug in &lt;tt&gt;BufferInputLineSimplifier&lt;/tt&gt; which caused over-simplification for large tolerances &lt;/li&gt;&lt;li&gt;Fixed bug in &lt;tt&gt;Angle.normalizePositive&lt;/tt&gt; to handle values &gt; 2PI correctly &lt;/li&gt;&lt;li&gt;Fixed &lt;tt&gt;WKTWriter&lt;/tt&gt; to emit correct syntax for MULTIPOINTs &lt;/li&gt;&lt;li&gt;Fixed &lt;tt&gt;WKTReader&lt;/tt&gt; to accept correct syntax for MULTIPOINTs &lt;/li&gt;&lt;li&gt;&lt;tt&gt;CGAlgorithms.isCCW&lt;/tt&gt; now checks for too few points in the ring and throws an &lt;tt&gt;IllegalArgumentException&lt;/tt&gt; &lt;/li&gt;&lt;li&gt;Fixed bug in &lt;tt&gt;AffineTransformation#eqals&lt;/tt&gt; (logic bug) &lt;/li&gt;&lt;li&gt;Fixed bug in &lt;tt&gt;CoordinateList#closeRing&lt;/tt&gt; (cloning closing Coordinate) &lt;/li&gt;&lt;/ul&gt;   &lt;hr color="darkblue" size="0"&gt; &lt;h3 style="font-family: sans-serif; color: darkblue;"&gt;JTS TestBuilder&lt;/h3&gt;  &lt;h3&gt;Functionality Improvements&lt;/h3&gt; &lt;ul&gt;&lt;li&gt;WKT input is cleaned automatically when loaded (illegal chars are removed) &lt;/li&gt;&lt;li&gt;Added WKT-Formatted option to Test Case View dialog &lt;/li&gt;&lt;li&gt;Many new geometry functions added &lt;/li&gt;&lt;li&gt;Geometry functions are displayed in tree &lt;/li&gt;&lt;li&gt;Geometry functions can be implemented as Java static class methods. &lt;/li&gt;&lt;li&gt;Geometry function classes can be loaded dynamically from command-line &lt;/li&gt;&lt;li&gt;Improved handling of very large geometry inputs and results &lt;/li&gt;&lt;li&gt;Threaded rendering allows display of very large geometries without limiting usability &lt;/li&gt;&lt;li&gt;Added Draw Rectangle tool &lt;/li&gt;&lt;li&gt;Added Drag-n-drop loading of .SHP files &lt;/li&gt;&lt;li&gt;Added Info tool to provide persistent display of geometry point/segment information &lt;/li&gt;&lt;li&gt;Added display of memory usage &lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2420860529344694449-857714516510908232?l=lin-ear-th-inking.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lin-ear-th-inking.blogspot.com/feeds/857714516510908232/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2420860529344694449&amp;postID=857714516510908232&amp;isPopup=true' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2420860529344694449/posts/default/857714516510908232'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2420860529344694449/posts/default/857714516510908232'/><link rel='alternate' type='text/html' href='http://lin-ear-th-inking.blogspot.com/2010/03/jts-version-111-released.html' title='JTS Version 1.11 released!'/><author><name>Dr JTS</name><uri>http://www.blogger.com/profile/02383381220154739793</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_q016kExGrVs/S4yn-2KL5aI/AAAAAAAAAVU/noteaxsZh1o/s72-c/JTS.png' height='72' width='72'/><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2420860529344694449.post-5966392222857328308</id><published>2010-02-17T10:10:00.000-08:00</published><updated>2010-02-17T10:21:56.707-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='jts'/><category scheme='http://www.blogger.com/atom/ns#' term='geospatial'/><category scheme='http://www.blogger.com/atom/ns#' term='cloud computing'/><title type='text'>JTS and Google App Engine</title><content type='html'>Nice to see that JTS is &lt;a href="http://groups.google.ca/group/google-appengine-java/web/will-it-play-in-app-engine?pli=1"&gt;officially certified&lt;/a&gt; as compatible with Google App Engine.&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_q016kExGrVs/S3wzScSvm7I/AAAAAAAAAVI/jLiug5r03vw/s1600-h/jts-cloud.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 251px;" src="http://3.bp.blogspot.com/_q016kExGrVs/S3wzScSvm7I/AAAAAAAAAVI/jLiug5r03vw/s400/jts-cloud.png" alt="" id="BLOGGER_PHOTO_ID_5439278841882188722" border="0" /&gt;&lt;/a&gt;&lt;span style="font-style: italic; font-weight: bold;"&gt;JTS makes clouds easy!&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic; font-weight: bold;"&gt;&lt;/span&gt;&lt;/div&gt;&lt;span style="font-style: italic; font-weight: bold;"&gt;&lt;br /&gt;&lt;/span&gt;A few people have tinkered with running JTS in GAE (eg &lt;a href="http://giscloud.appspot.com/"&gt;here&lt;/a&gt; and &lt;a href="http://iqbalyusuf.wordpress.com/java-topology-suite-google-app-engine-restlet-test/"&gt;here&lt;/a&gt;).  But the killer app has yet to emerge...   How about a Java-based App Engine version of &lt;a href="http://www.giscloud.com/"&gt;this&lt;/a&gt;?&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;span style="font-style: italic; font-weight: bold;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2420860529344694449-5966392222857328308?l=lin-ear-th-inking.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lin-ear-th-inking.blogspot.com/feeds/5966392222857328308/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2420860529344694449&amp;postID=5966392222857328308&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2420860529344694449/posts/default/5966392222857328308'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2420860529344694449/posts/default/5966392222857328308'/><link rel='alternate' type='text/html' href='http://lin-ear-th-inking.blogspot.com/2010/02/jts-and-google-app-engine.html' title='JTS and Google App Engine'/><author><name>Dr JTS</name><uri>http://www.blogger.com/profile/02383381220154739793</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_q016kExGrVs/S3wzScSvm7I/AAAAAAAAAVI/jLiug5r03vw/s72-c/jts-cloud.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2420860529344694449.post-6188266463390219618</id><published>2010-02-17T09:12:00.000-08:00</published><updated>2010-02-17T09:20:40.584-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='software'/><category scheme='http://www.blogger.com/atom/ns#' term='jts'/><title type='text'>JTS &amp; Jython</title><content type='html'>Sean's &lt;a href="http://sgillies.net/blog/1000/geospatial-jython/"&gt;post &lt;/a&gt;suddenly made me realize that it might be really cool to have a nice set of &lt;a style="font-weight: bold;" href="http://jython.org/"&gt;Jython&lt;/a&gt; bindings for &lt;a style="font-weight: bold;" href="http://tsusiatsoftware.net/jts/main.html"&gt;JTS&lt;/a&gt; (a la what &lt;a href="http://trac.gispython.org/lab/wiki/Shapely"&gt;Shapely&lt;/a&gt; has done for GEOS).&lt;br /&gt;&lt;br /&gt;Now, of course Jython can call Java classes directly, so maybe this is an empty task.  But perhaps there are some impedance mismatches which could be removed via some simple glue code.  And it would be nice to provide some examples of Jython code using JTS, to make it easier for people to figure out how to get started.&lt;br /&gt;&lt;br /&gt;And of course I'd throw in &lt;a style="font-weight: bold;" href="http://trac.osgeo.org/proj4j/"&gt;Proj4J &lt;/a&gt;as well!&lt;br /&gt;&lt;br /&gt;One more thing for my ever-growing task list... &lt;br /&gt;&lt;br /&gt;If anyone has any ideas on what needs doing here, I'd like to hear them.&lt;br /&gt;&lt;br /&gt;(This also makes me think that both Jython and JTS need some cool logos...  I don't have any pictures to post!)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2420860529344694449-6188266463390219618?l=lin-ear-th-inking.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lin-ear-th-inking.blogspot.com/feeds/6188266463390219618/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2420860529344694449&amp;postID=6188266463390219618&amp;isPopup=true' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2420860529344694449/posts/default/6188266463390219618'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2420860529344694449/posts/default/6188266463390219618'/><link rel='alternate' type='text/html' href='http://lin-ear-th-inking.blogspot.com/2010/02/jts-jython.html' title='JTS &amp; Jython'/><author><name>Dr JTS</name><uri>http://www.blogger.com/profile/02383381220154739793</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2420860529344694449.post-794953835422111286</id><published>2010-02-05T18:58:00.000-08:00</published><updated>2010-02-05T21:39:41.730-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='open source'/><category scheme='http://www.blogger.com/atom/ns#' term='geospatial'/><category scheme='http://www.blogger.com/atom/ns#' term='database'/><title type='text'>Opposites attract?</title><content type='html'>&lt;a href="http://blog.cleverelephant.ca/2010/02/chocolate-and-peanut-butter.html"&gt;This&lt;/a&gt; sounds like&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;&lt;span style="font-weight: bold;"&gt;Fine Swiss shade-grown organic chocolate&lt;/span&gt; and &lt;span style="font-weight: bold;"&gt;rancid peanut butter from the big-box store discount aisle&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2420860529344694449-794953835422111286?l=lin-ear-th-inking.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lin-ear-th-inking.blogspot.com/feeds/794953835422111286/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2420860529344694449&amp;postID=794953835422111286&amp;isPopup=true' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2420860529344694449/posts/default/794953835422111286'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2420860529344694449/posts/default/794953835422111286'/><link rel='alternate' type='text/html' href='http://lin-ear-th-inking.blogspot.com/2010/02/opposites-attract.html' title='Opposites attract?'/><author><name>Dr JTS</name><uri>http://www.blogger.com/profile/02383381220154739793</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2420860529344694449.post-7067010089745441410</id><published>2010-02-05T08:48:00.000-08:00</published><updated>2010-02-05T09:20:35.620-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='geospatial'/><category scheme='http://www.blogger.com/atom/ns#' term='database'/><title type='text'>HatBox for Derby and H2</title><content type='html'>I just saw the &lt;a style="font-weight: bold;" href="http://hatbox.sourceforge.net/"&gt;HatBox spatial extension&lt;/a&gt; to Derby and H2.  (Cute name - Derby, Hat&lt;span style="font-weight: bold;"&gt;BOX&lt;/span&gt; - get it?)&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://hatbox.sourceforge.net/hatbox1.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 106px; height: 130px;" src="http://hatbox.sourceforge.net/hatbox1.jpg" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;And of course HatBox uses &lt;a href="http://tsusiatsoftware.net/jts/main.html"&gt;&lt;span style="font-weight: bold;"&gt;JTS&lt;/span&gt;&lt;/a&gt;!&lt;br /&gt;&lt;br /&gt;This is great - H2 is a fantastic pure Java database, which has been crying out for spatial support.   (Perhaps if this extension proves its worth it will be merged into the main H2 codebase at some point?)&lt;br /&gt;&lt;br /&gt;However, HatBox is still a "user-space extension" - which means that it has not enhanced the SQL evaluation engine itself with knowledge about spatial indexes and when to use them.  So to utilize spatial indexing you have to explicitly join to the spatial index table, which results in ugly SQL like this:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;select ID, GEOM from T1 as t&lt;br /&gt;inner join&lt;br /&gt;HATBOX_MBR_INTERSECTS_ENV('PUBLIC','T1',145.05,145.25,-37.25,-37.05) as i&lt;br /&gt;on t.ID = i.HATBOX_JOIN_ID&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;This is the same approach used in Sqlite and ESRI SDE and other spatial extensions which operate in user space rather than DB engine space (Mike Butler of SDBE fame used to call this "staying above the blood-brain barrier"  8^).  Basically you are adding the index filter condition which for scalar indexes the SQL engine adds automatically.&lt;br /&gt;&lt;br /&gt;In contrast, the "big boys" like PostGIS, Oracle, SQL Server, DB2, Informix, etc have actually extended their database engine to handle spatial datatypes and indexes.  Most of these systems actually have provided a general extensibility mechanism which allows a clean separation between the engine core and the new datatypes. PostgreSQL is probably the one which takes this to the ultimate extent.&lt;br /&gt;&lt;br /&gt;User-space spatial extensions are for a first approach, but it would be really nice to be able to play with the big boys and incorporate knowledge of spatial indexes and functions directly into the database engine.  This should be easierto do in Java than in C - are you listening, H2?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2420860529344694449-7067010089745441410?l=lin-ear-th-inking.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lin-ear-th-inking.blogspot.com/feeds/7067010089745441410/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2420860529344694449&amp;postID=7067010089745441410&amp;isPopup=true' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2420860529344694449/posts/default/7067010089745441410'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2420860529344694449/posts/default/7067010089745441410'/><link rel='alternate' type='text/html' href='http://lin-ear-th-inking.blogspot.com/2010/02/hatbox-for-derby-and-h2.html' title='HatBox for Derby and H2'/><author><name>Dr JTS</name><uri>http://www.blogger.com/profile/02383381220154739793</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2420860529344694449.post-4552328783796436925</id><published>2010-02-02T17:42:00.000-08:00</published><updated>2010-02-02T17:48:10.098-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='geoweb'/><category scheme='http://www.blogger.com/atom/ns#' term='geospatial'/><title type='text'>SlashGeo'ed!</title><content type='html'>Woohoo!  I got &lt;a href="http://technology.slashgeo.org/technology/10/02/02/145239.shtml"&gt;SlashGeo'ed&lt;/a&gt;!&lt;br /&gt;&lt;br /&gt;Tagged with cool icons as Software, Open Source, and - er - Geocoding?&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_q016kExGrVs/S2jVv5e8RKI/AAAAAAAAAVA/5nIJQABLbfU/s1600-h/slashgeo_proj4j.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 85px; height: 243px;" src="http://2.bp.blogspot.com/_q016kExGrVs/S2jVv5e8RKI/AAAAAAAAAVA/5nIJQABLbfU/s400/slashgeo_proj4j.png" alt="" id="BLOGGER_PHOTO_ID_5433827969283671202" border="0" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2420860529344694449-4552328783796436925?l=lin-ear-th-inking.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lin-ear-th-inking.blogspot.com/feeds/4552328783796436925/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2420860529344694449&amp;postID=4552328783796436925&amp;isPopup=true' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2420860529344694449/posts/default/4552328783796436925'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2420860529344694449/posts/default/4552328783796436925'/><link rel='alternate' type='text/html' href='http://lin-ear-th-inking.blogspot.com/2010/02/slashgeoed.html' title='SlashGeo&apos;ed!'/><author><name>Dr JTS</name><uri>http://www.blogger.com/profile/02383381220154739793</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_q016kExGrVs/S2jVv5e8RKI/AAAAAAAAAVA/5nIJQABLbfU/s72-c/slashgeo_proj4j.png' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2420860529344694449.post-8131634824363875570</id><published>2010-01-30T06:57:00.000-08:00</published><updated>2010-01-30T11:12:49.707-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='open source'/><category scheme='http://www.blogger.com/atom/ns#' term='geospatial'/><title type='text'>Announcing Proj4J</title><content type='html'>It's been a while since I posted anything, because like a true programmer I've been too busy cutting code to write about it.  Time to catch up!&lt;br /&gt;&lt;br /&gt;My main focus for a while has been working on a Java port of the popular &lt;a href="http://trac.osgeo.org/proj/"&gt;&lt;span style="font-weight: bold;"&gt;PROJ.4&lt;/span&gt; &lt;/a&gt;projection library.  This was motivated by finding the great work that&lt;a href="http://www.jhlabs.com/java/maps/proj/index.html"&gt; JHLabs&lt;/a&gt; started with his JavaProj port.  That seemed too good to be left to languish, so I dusted it off and started to clean it up.  The library is now known as &lt;a style="font-weight: bold;" href="http://trac.osgeo.org/proj4j/"&gt;Proj4J&lt;/a&gt;.  It has been substantially reworked to provide a more functional API and a cleaner codebase.  Various bug fixes have been made to the core projections (although more remains to do!), and a formal test suite has been added.&lt;br /&gt;&lt;br /&gt;To answer the question of "Why another Java projection library?", the main reason is that PROJ.4 is popular, well-tested and well-documented, so it seems like a good idea to make it available in the Java world.    Other goals include creating a small, easy-to-understand, easy-to-use library, which can be embedded and/or extended as desired by small projects.  A personal goal is to provide coordinate system transformation services in JEQL (which is now realized by  exposing Proj4J via JEQL functions).&lt;br /&gt;&lt;br /&gt;&lt;a href="http://osgeo.org/"&gt;OSGeo&lt;/a&gt; is hosting the codebase as part of the &lt;a href="http://trac.osgeo.org/metacrs/"&gt;MetaCRS&lt;/a&gt; umbrella project.  There it lives in the good company of &lt;span style="font-weight: bold;"&gt;Proj4JS, CS-MAP, &lt;a href="http://spatialreference.org/"&gt;spatialreference.org&lt;/a&gt;&lt;/span&gt; and of course &lt;span style="font-weight: bold;"&gt;PROJ.4&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;The code is shaping up nicely for a 1.0 release.  It can also be downloaded and used as it stands.  &lt;a href="http://trac.osgeo.org/proj4j/"&gt;Check it out&lt;/a&gt;!  Even better, contribute some tests and bug fixes!&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_q016kExGrVs/S2RMF9nO_II/AAAAAAAAAU4/58l2bwu386U/s1600-h/globe-wagnerVII.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 234px;" src="http://4.bp.blogspot.com/_q016kExGrVs/S2RMF9nO_II/AAAAAAAAAU4/58l2bwu386U/s400/globe-wagnerVII.png" alt="" id="BLOGGER_PHOTO_ID_5432550715837840514" border="0" /&gt;&lt;/a&gt;&lt;span style="font-style: italic;"&gt;Wagner VII Projection&lt;/span&gt; &lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2420860529344694449-8131634824363875570?l=lin-ear-th-inking.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lin-ear-th-inking.blogspot.com/feeds/8131634824363875570/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2420860529344694449&amp;postID=8131634824363875570&amp;isPopup=true' title='12 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2420860529344694449/posts/default/8131634824363875570'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2420860529344694449/posts/default/8131634824363875570'/><link rel='alternate' type='text/html' href='http://lin-ear-th-inking.blogspot.com/2010/01/announcing-proj4j.html' title='Announcing Proj4J'/><author><name>Dr JTS</name><uri>http://www.blogger.com/profile/02383381220154739793</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_q016kExGrVs/S2RMF9nO_II/AAAAAAAAAU4/58l2bwu386U/s72-c/globe-wagnerVII.png' height='72' width='72'/><thr:total>12</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2420860529344694449.post-8638146105654826557</id><published>2009-10-02T15:18:00.000-07:00</published><updated>2009-10-02T15:21:08.164-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='web'/><title type='text'>Why you should not sit on Wolfram Alpha</title><content type='html'>&lt;a href="http://unqualified-reservations.blogspot.com"&gt;Unqualified Reservations&lt;/a&gt; has a great post dissecting the &lt;a href="http://unqualified-reservations.blogspot.com/2009/07/wolfram-alpha-and-hubristic-user.html"&gt;Wolfram Alpha hubristic User Interface.&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Warning: this guy seems to be able to write faster than most people can read.  Browse his blog at your peril!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2420860529344694449-8638146105654826557?l=lin-ear-th-inking.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lin-ear-th-inking.blogspot.com/feeds/8638146105654826557/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2420860529344694449&amp;postID=8638146105654826557&amp;isPopup=true' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2420860529344694449/posts/default/8638146105654826557'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2420860529344694449/posts/default/8638146105654826557'/><link rel='alternate' type='text/html' href='http://lin-ear-th-inking.blogspot.com/2009/10/why-you-should-not-sit-on-wolfram-alpha.html' title='Why you should not sit on Wolfram Alpha'/><author><name>Dr JTS</name><uri>http://www.blogger.com/profile/02383381220154739793</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2420860529344694449.post-8596736623038708016</id><published>2009-09-21T17:12:00.000-07:00</published><updated>2009-09-21T17:25:25.919-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='geoweb'/><category scheme='http://www.blogger.com/atom/ns#' term='web mapping'/><category scheme='http://www.blogger.com/atom/ns#' term='kml'/><title type='text'>OS and GM SXS for LEJOG in the UK</title><content type='html'>&lt;span style="font-style: italic;"&gt;Translation: Ordnance Survey and Google Maps side-by-side for planning the Land's End-John O'Groats walk in the United Kingdom.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;My friend Steve is walking the LEJOG in 2010 (I guess that makes him a LEJOGger - as opposed to the  JOGLErs who go North to South).    Of course he is &lt;a href="http://lejog2010.wordpress.com/"&gt;blogging &lt;/a&gt;about it - &lt;a href="http://lejog2010.wordpress.com/links/"&gt;doesn't everybody&lt;/a&gt;?.  &lt;br /&gt;&lt;br /&gt;Even better, he's planning his route using &lt;a style="font-weight: bold;" href="http://wtp2.appspot.com/wheresthepath.htm"&gt;Where's The Path&lt;/a&gt;, which is a fantastic side-by-side map site for the U.K.    It shows Ordnance Survey topographic maps and Google Maps imagery in a cleverly linked view (similar to the VExGM web site I &lt;a href="http://lin-ear-th-inking.blogspot.com/2009/03/gm-and-ve-side-by-side-and-head-to-head.html"&gt;blogged about earlier this year&lt;/a&gt;, but even more useful).  Here's a &lt;a href="http://wtp2.appspot.com/wheresthepath.htm?lat=51.505537109466715&amp;amp;lon=-0.07555246353149414&amp;amp;gz=16&amp;amp;oz=9&amp;amp;gt=1"&gt;link to the most famous location in Britain&lt;/a&gt;  (but I suspect it doesn't feature in many  LEJOG itineraries, unless you're a real anorak for walking).&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_q016kExGrVs/Spci-N96KZI/AAAAAAAAATA/evfL8DziWQg/s1600-h/wtp-tower_bridge.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 252px;" src="http://4.bp.blogspot.com/_q016kExGrVs/Spci-N96KZI/AAAAAAAAATA/evfL8DziWQg/s400/wtp-tower_bridge.png" alt="" id="BLOGGER_PHOTO_ID_5374803132586535314" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;WTP also lets you digitize paths and export them to GPX and KML.   Steve is finding the KML export particularly useful, since it allows him to locate all the &lt;span style="font-weight: bold;"&gt;pubs &lt;/span&gt;along the route of his walk.&lt;br /&gt;&lt;br /&gt;Now, when is someone going to do this for Canada?  All those prospective SJV'ers out there would be overjoyed!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2420860529344694449-8596736623038708016?l=lin-ear-th-inking.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lin-ear-th-inking.blogspot.com/feeds/8596736623038708016/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2420860529344694449&amp;postID=8596736623038708016&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2420860529344694449/posts/default/8596736623038708016'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2420860529344694449/posts/default/8596736623038708016'/><link rel='alternate' type='text/html' href='http://lin-ear-th-inking.blogspot.com/2009/09/os-and-gm-sxs-for-lejog-in-uk.html' title='OS and GM SXS for LEJOG in the UK'/><author><name>Dr JTS</name><uri>http://www.blogger.com/profile/02383381220154739793</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_q016kExGrVs/Spci-N96KZI/AAAAAAAAATA/evfL8DziWQg/s72-c/wtp-tower_bridge.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2420860529344694449.post-1860104629435831163</id><published>2009-09-15T17:26:00.001-07:00</published><updated>2009-09-15T18:08:31.387-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='jts'/><title type='text'>Earn a diploma with JTS!</title><content type='html'>(No doubt by choosing that title I've exposed by my blog to death by spam filter.   Although if the ones with titles like "Increase your performance with JTS!" got through, maybe I'm ok.)&lt;br /&gt;&lt;br /&gt;The &lt;a href="http://www.kth.se/"&gt;Kungliga Tekniska högskolan&lt;/a&gt; in Sweden (isn't Unicode wonderful?) is offering a course on &lt;a href="http://www.infra.kth.se/courses/AG2411/"&gt;GIS Architecture&lt;/a&gt;.  I was happy to see that they're using &lt;a href="http://tsusiatsoftware.net/jts/main.html"&gt;JTS&lt;/a&gt; as a tool for &lt;a href="http://www.infra.kth.se/courses/AG2411/labs/E1.pdf"&gt;exploring the DE-9IM spatial relationship model&lt;/a&gt;, and also as an example of a &lt;a href="http://www.infra.kth.se/courses/AG2411/labs/E8.pdf"&gt;Open Source geospatial library&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_q016kExGrVs/SrAy8OxTNtI/AAAAAAAAATM/a21jI41lS9M/s1600-h/JTS+DE-9IM.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 282px;" src="http://2.bp.blogspot.com/_q016kExGrVs/SrAy8OxTNtI/AAAAAAAAATM/a21jI41lS9M/s400/JTS+DE-9IM.png" alt="" id="BLOGGER_PHOTO_ID_5381857565046159058" border="0" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2420860529344694449-1860104629435831163?l=lin-ear-th-inking.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lin-ear-th-inking.blogspot.com/feeds/1860104629435831163/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2420860529344694449&amp;postID=1860104629435831163&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2420860529344694449/posts/default/1860104629435831163'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2420860529344694449/posts/default/1860104629435831163'/><link rel='alternate' type='text/html' href='http://lin-ear-th-inking.blogspot.com/2009/09/earn-diploma-with-jts.html' title='Earn a diploma with JTS!'/><author><name>Dr JTS</name><uri>http://www.blogger.com/profile/02383381220154739793</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_q016kExGrVs/SrAy8OxTNtI/AAAAAAAAATM/a21jI41lS9M/s72-c/JTS+DE-9IM.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2420860529344694449.post-9136546373736118997</id><published>2009-08-25T15:06:00.000-07:00</published><updated>2009-08-25T15:13:52.477-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='jts'/><title type='text'>JTS - Links to Geometry APIs and papers</title><content type='html'>Motivated by a &lt;a href="http://lists.osgeo.org/pipermail/geos-devel/2009-August/004336.html"&gt;thread &lt;/a&gt;on the &lt;a href="http://lists.osgeo.org/pipermail/geos-devel/"&gt;GEOS list&lt;/a&gt; about the Boost.Polygon library, I've added some new resources to the &lt;a href="http://tsusiatsoftware.net/jts/main.html"&gt;JTS web site&lt;/a&gt;, including:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;a list of geometry APIs&lt;/li&gt;&lt;li&gt;a section of references to papers about topics in Computational Geometry which are relevant to JTS.  &lt;/li&gt;&lt;/ul&gt;The resources have been factored out onto &lt;a href="http://tsusiatsoftware.net/jts/jts-links.html"&gt;this page&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Over the years of working with JTS I've read a ton of interesting and sometimes even useful academic papers about aspects of Computational Geometry.  I hope to start documenting these on this page, perhaps with some (no doubt opinionated) comments about applicability.  A treasure trove for Geometry geeks!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2420860529344694449-9136546373736118997?l=lin-ear-th-inking.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lin-ear-th-inking.blogspot.com/feeds/9136546373736118997/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2420860529344694449&amp;postID=9136546373736118997&amp;isPopup=true' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2420860529344694449/posts/default/9136546373736118997'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2420860529344694449/posts/default/9136546373736118997'/><link rel='alternate' type='text/html' href='http://lin-ear-th-inking.blogspot.com/2009/08/jts-links-to-geometry-apis-and-papers.html' title='JTS - Links to Geometry APIs and papers'/><author><name>Dr JTS</name><uri>http://www.blogger.com/profile/02383381220154739793</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2420860529344694449.post-4542003863957849975</id><published>2009-08-19T17:15:00.000-07:00</published><updated>2009-08-19T17:25:27.141-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='geoweb'/><category scheme='http://www.blogger.com/atom/ns#' term='web mapping'/><category scheme='http://www.blogger.com/atom/ns#' term='web'/><title type='text'>Super Zoom Control is really super!</title><content type='html'>The web mapping site &lt;a href="http://www.192.com/places/search/?Type=All&amp;amp;place=BUCKINGHAM%20PALACE&amp;amp;gre=529168&amp;amp;grn=179747"&gt;192.com&lt;/a&gt; has a very nice map zoom control which dynamically displays a representative image of the map at the prospective zoom level.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_q016kExGrVs/SoyWzbAFFpI/AAAAAAAAAS4/JCGd1nEN5YI/s1600-h/super_zoom_control.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 280px; height: 315px;" src="http://1.bp.blogspot.com/_q016kExGrVs/SoyWzbAFFpI/AAAAAAAAAS4/JCGd1nEN5YI/s400/super_zoom_control.png" alt="" id="BLOGGER_PHOTO_ID_5371834265711744658" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;This nicely addresses a problem which has occurred in a few applications I've been involved with recently - how to communicate to the user what a given zoom level actually looks like.&lt;br /&gt;&lt;br /&gt;At first I thought the control might be truly dynamic - i.e. pulling a live tile from the centre point of the current map view.   But it's actually just a set of tile snippets at a fixed point.  Still, it provides a very nice effect.  (The dynamic version would be simple to implement, but perhaps would be too slow in actual use, with unpredicatable latency).&lt;br /&gt;&lt;br /&gt;Are you listening, &lt;a href="http://openlayers.org/"&gt;OpenLayers&lt;/a&gt;?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2420860529344694449-4542003863957849975?l=lin-ear-th-inking.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lin-ear-th-inking.blogspot.com/feeds/4542003863957849975/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2420860529344694449&amp;postID=4542003863957849975&amp;isPopup=true' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2420860529344694449/posts/default/4542003863957849975'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2420860529344694449/posts/default/4542003863957849975'/><link rel='alternate' type='text/html' href='http://lin-ear-th-inking.blogspot.com/2009/08/super-zoom-control-is-really-super.html' title='Super Zoom Control is really super!'/><author><name>Dr JTS</name><uri>http://www.blogger.com/profile/02383381220154739793</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_q016kExGrVs/SoyWzbAFFpI/AAAAAAAAAS4/JCGd1nEN5YI/s72-c/super_zoom_control.png' height='72' width='72'/><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2420860529344694449.post-9158271215803247809</id><published>2009-08-06T10:16:00.000-07:00</published><updated>2009-08-06T10:27:13.963-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='computer art'/><category scheme='http://www.blogger.com/atom/ns#' term='algorithms'/><category scheme='http://www.blogger.com/atom/ns#' term='web'/><title type='text'>Visualizations of Sorting Algorithms in your browser</title><content type='html'>&lt;a href="http://www.nihilogic.dk/labs/sorting_visualization/"&gt;Here's a nifty web page&lt;/a&gt; which shows a way of visualizing the operation of various common sorting algorithms.&lt;br /&gt;&lt;br /&gt;Sample output for Heapsort:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_q016kExGrVs/SnsQvXqfm9I/AAAAAAAAASw/DkPFA7G00cU/s1600-h/heapsort.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; " src="http://2.bp.blogspot.com/_q016kExGrVs/SnsQvXqfm9I/AAAAAAAAASw/DkPFA7G00cU/s400/heapsort.png" alt="" id="BLOGGER_PHOTO_ID_5366901786934221778" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;The coolest thing about this of course is the ability to dynamically generate rich graphics in the browser.  All hail the &lt;a href="https://developer.mozilla.org/en/HTML/Canvas"&gt;HTML5 &lt;span style="font-family:courier new;"&gt;&amp;lt;canvas&amp;gt;&lt;/span&gt;&lt;/a&gt; element!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2420860529344694449-9158271215803247809?l=lin-ear-th-inking.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lin-ear-th-inking.blogspot.com/feeds/9158271215803247809/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2420860529344694449&amp;postID=9158271215803247809&amp;isPopup=true' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2420860529344694449/posts/default/9158271215803247809'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2420860529344694449/posts/default/9158271215803247809'/><link rel='alternate' type='text/html' href='http://lin-ear-th-inking.blogspot.com/2009/08/visualizations-of-sorting-algorithms-in.html' title='Visualizations of Sorting Algorithms in your browser'/><author><name>Dr JTS</name><uri>http://www.blogger.com/profile/02383381220154739793</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_q016kExGrVs/SnsQvXqfm9I/AAAAAAAAASw/DkPFA7G00cU/s72-c/heapsort.png' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2420860529344694449.post-4420992329185423923</id><published>2009-06-09T20:21:00.001-07:00</published><updated>2009-06-09T20:24:03.042-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='bing'/><category scheme='http://www.blogger.com/atom/ns#' term='microsoft'/><title type='text'>Meme of the Month</title><content type='html'>Well, it's obvious, innit?&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_q016kExGrVs/Si8m7cdPu_I/AAAAAAAAASo/lSL6jqfkILM/s1600-h/bingdows.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 143px; height: 48px;" src="http://2.bp.blogspot.com/_q016kExGrVs/Si8m7cdPu_I/AAAAAAAAASo/lSL6jqfkILM/s400/bingdows.png" alt="" id="BLOGGER_PHOTO_ID_5345534085405064178" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;You can be the first to write the &lt;a href="http://en.wikipedia.org/wiki/Microsoft_Bingdows"&gt;Wikipedia article&lt;/a&gt;!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2420860529344694449-4420992329185423923?l=lin-ear-th-inking.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lin-ear-th-inking.blogspot.com/feeds/4420992329185423923/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2420860529344694449&amp;postID=4420992329185423923&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2420860529344694449/posts/default/4420992329185423923'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2420860529344694449/posts/default/4420992329185423923'/><link rel='alternate' type='text/html' href='http://lin-ear-th-inking.blogspot.com/2009/06/meme-of-month.html' title='Meme of the Month'/><author><name>Dr JTS</name><uri>http://www.blogger.com/profile/02383381220154739793</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_q016kExGrVs/Si8m7cdPu_I/AAAAAAAAASo/lSL6jqfkILM/s72-c/bingdows.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2420860529344694449.post-8687737235933270081</id><published>2009-05-15T21:23:00.000-07:00</published><updated>2009-05-15T22:15:13.959-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='uml'/><category scheme='http://www.blogger.com/atom/ns#' term='software'/><category scheme='http://www.blogger.com/atom/ns#' term='web'/><title type='text'>UML Sequence Diagrams on the Web</title><content type='html'>I find the &lt;a href="http://en.wikipedia.org/wiki/Sequence_diagram"&gt;&lt;span style="font-weight: bold;"&gt;sequence diagram&lt;/span&gt;&lt;/a&gt; to be one of the most useful UML diagrams - but it's also one of the most fiddly &amp;amp; annoying to generate in a diagramming tool.    There's a few reasons for that:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;there's a large amount of implicit structure which is tedious to maintain&lt;/li&gt;&lt;li&gt;sequence diagrams quickly get complex for processes with lots of actors and/or actions&lt;/li&gt;&lt;li&gt;I can never remember all the conventions for representing concepts like alternation, loops and nesting&lt;/li&gt;&lt;/ul&gt;Luckily, the web to the rescue! The &lt;a href="http://www.websequencediagrams.com/"&gt;websequencediagrams &lt;/a&gt;website has a on-line diagram generator which uses a simple language to describe the diagram.  This works well precisely &lt;span style="font-weight: bold;"&gt;because &lt;/span&gt;of the structure in sequence diagrams.  Because they are inherently linear in structure,  they are more constrained than other UML diagrams. &lt;br /&gt;&lt;br /&gt;The language supports just about everything you might want - signal types, groups, nesting, notes, lifelines, etc.  It outputs in images or as PDF - and it even has cool styles!  Here's the idea:&lt;br /&gt;&lt;pre&gt;loop 1000 times&lt;br /&gt;Me-&gt;Visio: draw sequence diagram&lt;br /&gt;Visio-&gt;Me: frustration&lt;br /&gt;end&lt;br /&gt;Me-&gt;Google: search for better way&lt;br /&gt;Google-&gt;Me: find websequencediagram tool&lt;br /&gt;Me-&gt;WebSequenceDiagram: draw sequence diagram&lt;br /&gt;WebSequenceDiagram-&gt;Me: happiness!&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;produces&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_q016kExGrVs/Sg5FTUfc1TI/AAAAAAAAASI/Lso6E34l0Y4/s1600-h/webseq-example.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 218px;" src="http://2.bp.blogspot.com/_q016kExGrVs/Sg5FTUfc1TI/AAAAAAAAASI/Lso6E34l0Y4/s400/webseq-example.png" alt="" id="BLOGGER_PHOTO_ID_5336278806701069618" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;I've blogged about the appeal of specifying UML diagrams using code &lt;a href="http://lin-ear-th-inking.blogspot.com/2008/01/paradoxically-poor-power-of-visual.html"&gt;before&lt;/a&gt;.  I'm not sure how much traction TextUML is getting - but it's hard to resist the appeal of a web interface, a simple language, and sexy ouput.&lt;br /&gt;&lt;br /&gt;Now, if only someone would develop a force-directed web-based &lt;span style="font-weight: bold;"&gt;state diagram&lt;/span&gt; engine...&lt;br /&gt;&lt;br /&gt;Note: there's some other alternatives to the websequencediagram tool - the author blogs about them &lt;a href="http://gandolf.homelinux.org/%7Esmhanov/blog/?id=25"&gt;here&lt;/a&gt;.  The most interesting from my point of view is &lt;a href="http://sdedit.sourceforge.net/"&gt;sdedit&lt;/a&gt;, which is open-source and Java-based.  It's more powerful, but the language looks a mite complex.  (Too bad there's no standard language for describing UML - maybe the Three Amigos should skip a siesta and whip one up.)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2420860529344694449-8687737235933270081?l=lin-ear-th-inking.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lin-ear-th-inking.blogspot.com/feeds/8687737235933270081/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2420860529344694449&amp;postID=8687737235933270081&amp;isPopup=true' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2420860529344694449/posts/default/8687737235933270081'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2420860529344694449/posts/default/8687737235933270081'/><link rel='alternate' type='text/html' href='http://lin-ear-th-inking.blogspot.com/2009/05/uml-sequence-diagrams-on-web.html' title='UML Sequence Diagrams on the Web'/><author><name>Dr JTS</name><uri>http://www.blogger.com/profile/02383381220154739793</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_q016kExGrVs/Sg5FTUfc1TI/AAAAAAAAASI/Lso6E34l0Y4/s72-c/webseq-example.png' height='72' width='72'/><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2420860529344694449.post-484354415836813443</id><published>2009-05-04T16:37:00.000-07:00</published><updated>2009-05-10T21:27:39.344-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='computational geometry'/><category scheme='http://www.blogger.com/atom/ns#' term='jts'/><title type='text'>Voronoi Diagrams in JTS 1.11</title><content type='html'>As is well-known, the &lt;a href="http://en.wikipedia.org/wiki/Voronoi_diagram"&gt;Voronoi diagram&lt;/a&gt; (or tesselation) is the &lt;a href="http://en.wikipedia.org/wiki/Dual_graph"&gt;dual &lt;/a&gt;of the &lt;a href="http://en.wikipedia.org/wiki/Delaunay_triangulation"&gt;Delaunay triangulation&lt;/a&gt;.  So the &lt;a href="http://lin-ear-th-inking.blogspot.com/2009/04/delaunay-triangulation-in-jts-111.html"&gt;new Delaunay Triangulation code in JTS&lt;/a&gt; has a natural extension to computing Voronoi diagrams.  Thanks to the &lt;a href="http://en.wikipedia.org/wiki/Quad-edge"&gt;quad-edge data structure&lt;/a&gt; underlying the Delaunay algorithm this was relatively trivial to implement, after a few design issues were sorted out (such as:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;efficiently enumerating all vertices in the QuadEdge data structure which provides the basis for Delaunay computation&lt;br /&gt;&lt;/li&gt;&lt;li&gt;computing the circumcentre of all Delaunay triangles in a consistent way&lt;/li&gt;&lt;li&gt;clipping the generated Voronoi cell polygons to a reasonable bounding area)&lt;/li&gt;&lt;/ul&gt;Some examples on randomly-generated point sets:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_q016kExGrVs/SgZjnRRo53I/AAAAAAAAASA/ccxsc71X8zI/s1600-h/delaunay-voronoi.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 377px;" src="http://2.bp.blogspot.com/_q016kExGrVs/SgZjnRRo53I/AAAAAAAAASA/ccxsc71X8zI/s400/delaunay-voronoi.png" alt="" id="BLOGGER_PHOTO_ID_5334060334970365810" border="0" /&gt;&lt;/a&gt;&lt;div style="text-align: center;"&gt;&lt;span style="font-style: italic; font-weight: bold;"&gt;Delaunay and Voronoi diagrams of 20 points (15 ms)&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_q016kExGrVs/SgZf9OoBLEI/AAAAAAAAARg/T_83mQSYIXE/s1600-h/voronoi-random100.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 334px; height: 357px;" src="http://2.bp.blogspot.com/_q016kExGrVs/SgZf9OoBLEI/AAAAAAAAARg/T_83mQSYIXE/s400/voronoi-random100.png" alt="" id="BLOGGER_PHOTO_ID_5334056314169535554" border="0" /&gt;&lt;/a&gt;&lt;div style="text-align: center;"&gt;&lt;span style="font-style: italic; font-weight: bold;"&gt;Voronoi diagram of 100 points (63 ms)&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_q016kExGrVs/SgZhW4SAssI/AAAAAAAAARw/na9Z_fdgWTA/s1600-h/voronoi-random100K.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 334px; height: 357px;" src="http://4.bp.blogspot.com/_q016kExGrVs/SgZhW4SAssI/AAAAAAAAARw/na9Z_fdgWTA/s400/voronoi-random100K.png" alt="" id="BLOGGER_PHOTO_ID_5334057854359876290" border="0" /&gt;&lt;/a&gt;&lt;div style="text-align: center;"&gt;&lt;span style="font-style: italic; font-weight: bold;"&gt;Voronoi diagram of 100,000 points (7.3 sec)&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;The JTS implementation scales very well - a Delaunay/Voronoi diagram of 1 million points computes in under 5 minutes.   The one downside is memory usage.  As usual, Java is quite memory-hungry - a 1 M point Delaunay takes around 700 MB.  This seems excessive, even for Java.  Hopefully some memory profiling may reveal that this can be reduced by some tuning of the class structures involved.&lt;br /&gt;&lt;br /&gt;Even better, the Delaunay/Voronoi algorithm seems to be quite robust, even though no special attempt has been made to provide high-precision or otherwise robust implementations of some of the key predicates (inCircle and orientation).  This may yet prove to be an issue for some inputs, but at this point it seems possible to claim that for non-pathological inputs the algorithms execute correctly.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2420860529344694449-484354415836813443?l=lin-ear-th-inking.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lin-ear-th-inking.blogspot.com/feeds/484354415836813443/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2420860529344694449&amp;postID=484354415836813443&amp;isPopup=true' title='8 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2420860529344694449/posts/default/484354415836813443'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2420860529344694449/posts/default/484354415836813443'/><link rel='alternate' type='text/html' href='http://lin-ear-th-inking.blogspot.com/2009/05/voronoi-diagrams-in-jts-111.html' title='Voronoi Diagrams in JTS 1.11'/><author><name>Dr JTS</name><uri>http://www.blogger.com/profile/02383381220154739793</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_q016kExGrVs/SgZjnRRo53I/AAAAAAAAASA/ccxsc71X8zI/s72-c/delaunay-voronoi.png' height='72' width='72'/><thr:total>8</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2420860529344694449.post-2190172878614519714</id><published>2009-04-30T14:15:00.000-07:00</published><updated>2009-04-30T14:48:35.433-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='computational geometry'/><category scheme='http://www.blogger.com/atom/ns#' term='jts'/><category scheme='http://www.blogger.com/atom/ns#' term='geometry'/><title type='text'>Delaunay Triangulation in JTS 1.11</title><content type='html'>The next version of &lt;a href="http://tsusiatsoftware.net/jts/main.html"&gt;JTS &lt;/a&gt;(1.11) will include an API for creating &lt;span style="font-weight: bold;"&gt;Delaunay triangulations&lt;/span&gt; and &lt;span style="font-weight: bold;"&gt;Conforming Delaunay triangulations&lt;/span&gt;.  For a thorough explanation of the &lt;a href="http://www.cs.cmu.edu/%7Equake/triangle.defs.html#conform"&gt;differences between Delaunay, Conforming Delaunay, and Constrained Delaunay&lt;/a&gt;, and why they are actually quite difficult to compute, see &lt;a href="http://www.cs.cmu.edu/%7Equake/triangle.html"&gt;Jonathan Shewchuk's wonderful web site&lt;/a&gt;.  [Side note - yet another B.C.-grown spatial dude - must be something in the water up here!]&lt;br /&gt;&lt;br /&gt;This Delaunay implementation arose out of the work I did on &lt;a href="http://lin-ear-th-inking.blogspot.com/2007/05/geotec-2007-presentation-on-watershed.html"&gt;automated watershed extraction&lt;/a&gt; using a system called WaterBuG a while back.  It's taken a while to make its way into JTS because there's quite a bit of work involved in turning a codebase targeted at a very specific project into a clean, user-friendly API.  Not to mention writing documentation...&lt;br /&gt;&lt;br /&gt;But it's there now, and I'll be interested to see if it's of use to JTSer's.  There seems to be a sudden surfeit of Delaunay and CDT Java libraries (see &lt;a href="http://geosysin.iict.ch/irstv-trac/browser/platform-contrib/jdelaunay"&gt;here&lt;/a&gt;, &lt;a href="http://conference.osgeo.org/index.php/foss4g/2008/paper/view/282/177"&gt;here&lt;/a&gt;, &lt;a href="http://geo.michaelm.free.fr/OpenJUMP/resources/%29"&gt;here&lt;/a&gt;, &lt;a href="http://www.ordnancesurvey.co.uk/oswebsite/partnerships/research/publications/docs/2005/034_NICOLASREGNAULD_gen.pdf"&gt;here &lt;/a&gt;and &lt;a href="http://hal.archives-ouvertes.fr/docs/00/32/95/03/PDF/CDT-paper.pdf"&gt;here&lt;/a&gt;), so I make no claims that the JTS one is best-of-breed.  But hopefully having a decent implementation easily accessible and embedded in a general-purpose library will meet some needs.  Also, my hope is that it will serve as the basis for further algorithms in JTS (such as the much-sought-after &lt;span style="font-weight: bold;"&gt;Concave Hull&lt;/span&gt;!).&lt;br /&gt;&lt;br /&gt;Here's some screenshots showing the triangulation API at work:&lt;br /&gt;&lt;br /&gt;The input points and constraint segments:&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_q016kExGrVs/SfoZ1OaX-1I/AAAAAAAAARA/zB0YlK_xw2o/s1600-h/jts-points.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 253px;" src="http://4.bp.blogspot.com/_q016kExGrVs/SfoZ1OaX-1I/AAAAAAAAARA/zB0YlK_xw2o/s400/jts-points.png" alt="" id="BLOGGER_PHOTO_ID_5330601511138884434" border="0" /&gt;&lt;/a&gt;The Delaunay triangulation (notice that triangle edges cross some of the longer constraint edges):&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_q016kExGrVs/SfoZ5Ie1NBI/AAAAAAAAARI/oJKVrJCAgaw/s1600-h/jts-points-delaunay.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 253px;" src="http://2.bp.blogspot.com/_q016kExGrVs/SfoZ5Ie1NBI/AAAAAAAAARI/oJKVrJCAgaw/s400/jts-points-delaunay.png" alt="" id="BLOGGER_PHOTO_ID_5330601578266440722" border="0" /&gt;&lt;/a&gt;A conforming Delaunay triangulation (the triangulation edges are now faithful to the constraint edges):&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_q016kExGrVs/SfoZ8vLMnpI/AAAAAAAAARQ/SyOQQnx15MI/s1600-h/jts-points-conforming.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 253px;" src="http://3.bp.blogspot.com/_q016kExGrVs/SfoZ8vLMnpI/AAAAAAAAARQ/SyOQQnx15MI/s400/jts-points-conforming.png" alt="" id="BLOGGER_PHOTO_ID_5330601640192679570" border="0" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2420860529344694449-2190172878614519714?l=lin-ear-th-inking.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lin-ear-th-inking.blogspot.com/feeds/2190172878614519714/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2420860529344694449&amp;postID=2190172878614519714&amp;isPopup=true' title='8 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2420860529344694449/posts/default/2190172878614519714'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2420860529344694449/posts/default/2190172878614519714'/><link rel='alternate' type='text/html' href='http://lin-ear-th-inking.blogspot.com/2009/04/delaunay-triangulation-in-jts-111.html' title='Delaunay Triangulation in JTS 1.11'/><author><name>Dr JTS</name><uri>http://www.blogger.com/profile/02383381220154739793</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_q016kExGrVs/SfoZ1OaX-1I/AAAAAAAAARA/zB0YlK_xw2o/s72-c/jts-points.png' height='72' width='72'/><thr:total>8</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2420860529344694449.post-8020563336521969826</id><published>2009-03-04T13:14:00.000-08:00</published><updated>2009-03-04T13:30:35.135-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='computational geometry'/><category scheme='http://www.blogger.com/atom/ns#' term='jts'/><title type='text'>Web Monkeys with Laserbeams like JTS</title><content type='html'>...As they explain in &lt;a href="http://webmonkeyswithlaserbeams.wordpress.com/2009/03/04/the-sweet-java-topology-suite-part-ii/"&gt;this blog post&lt;/a&gt; about using JTS to simplify a polygonal coverage.&lt;br /&gt;&lt;br /&gt;The really sweet thing is that not only do the Web Monkeys have laser beams, but also &lt;span style="font-weight: bold;"&gt;honkin' big computers&lt;/span&gt; as well.  The post states that they use &lt;span style="font-weight: bold;"&gt;7 GB&lt;/span&gt; of memory to process &lt;span style="font-weight: bold;"&gt;41,000 polygons&lt;/span&gt; in a single batch (as is required for the simplification algorithm that they're using).  I inquired and found out that they're using:&lt;br /&gt;&lt;pre wrap=""&gt;java version "1.6.0_11"&lt;br /&gt;Java(TM) SE Runtime Environment (build 1.6.0_11-b03)&lt;br /&gt;Java HotSpot(TM) 64-Bit Server VM (build 11.0-b16, mixed mode)&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Niice... I've always wanted to experiment with large memory space for JTS processing, for things like large overlays, large TIN building, etc.  So far I haven't had a machine large enough to let me try.   But it sounds like 64-bit Java "just works", as expected.   Another great reason for coding to a JVM - 64-bit memory space support with no recompilation!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2420860529344694449-8020563336521969826?l=lin-ear-th-inking.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lin-ear-th-inking.blogspot.com/feeds/8020563336521969826/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2420860529344694449&amp;postID=8020563336521969826&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2420860529344694449/posts/default/8020563336521969826'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2420860529344694449/posts/default/8020563336521969826'/><link rel='alternate' type='text/html' href='http://lin-ear-th-inking.blogspot.com/2009/03/web-monkeys-with-laserbeams-like-jts.html' title='Web Monkeys with Laserbeams like JTS'/><author><name>Dr JTS</name><uri>http://www.blogger.com/profile/02383381220154739793</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2420860529344694449.post-7616767209055918540</id><published>2009-03-03T10:55:00.000-08:00</published><updated>2009-03-03T11:09:23.589-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='geoweb'/><category scheme='http://www.blogger.com/atom/ns#' term='microsoft'/><category scheme='http://www.blogger.com/atom/ns#' term='google-earth'/><title type='text'>GM and VE side-by-side and head-to-head</title><content type='html'>&lt;a href="http://www.jonasson.org/maps/"&gt;Here's a nifty page&lt;/a&gt; which shows GM and VE side-by-side, with slaved navigation.  It's quite handy for seeing differences in map rendering and imagery.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_q016kExGrVs/Sa1_ns8VuWI/AAAAAAAAAQI/TbxJWpxP0vk/s1600-h/GMvsVE.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 423px; height: 204px;" src="http://3.bp.blogspot.com/_q016kExGrVs/Sa1_ns8VuWI/AAAAAAAAAQI/TbxJWpxP0vk/s400/GMvsVE.jpg" alt="" id="BLOGGER_PHOTO_ID_5309039855795550562" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;For my area of interest (Victoria B.C.)  my 20-second appraisal is that they both have aspects of their rendering which are better than the other; and VE's imagery coverage is more limited than GM's (probably due to &lt;a href="http://www2.canada.com/vancouversun/news/business/story.html?id=c183fccb-7759-4cf1-89e5-a1007c7ea36d"&gt;this deal&lt;/a&gt;).&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2420860529344694449-7616767209055918540?l=lin-ear-th-inking.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lin-ear-th-inking.blogspot.com/feeds/7616767209055918540/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2420860529344694449&amp;postID=7616767209055918540&amp;isPopup=true' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2420860529344694449/posts/default/7616767209055918540'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2420860529344694449/posts/default/7616767209055918540'/><link rel='alternate' type='text/html' href='http://lin-ear-th-inking.blogspot.com/2009/03/gm-and-ve-side-by-side-and-head-to-head.html' title='GM and VE side-by-side and head-to-head'/><author><name>Dr JTS</name><uri>http://www.blogger.com/profile/02383381220154739793</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_q016kExGrVs/Sa1_ns8VuWI/AAAAAAAAAQI/TbxJWpxP0vk/s72-c/GMvsVE.jpg' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2420860529344694449.post-1236499506653277525</id><published>2009-01-13T10:58:00.000-08:00</published><updated>2009-01-13T11:17:01.179-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='database'/><title type='text'>More on Database Thawing</title><content type='html'>I just saw &lt;a href="http://typicalprogrammer.com/?p=101"&gt;this blog post&lt;/a&gt; in rebuttal to Martin Fowler's &lt;a href="http://martinfowler.com/bliki/DatabaseThaw.html"&gt;DatabaseThaw&lt;/a&gt; article.  It's a typically well-thought out response from Typical Programmer.  The short summary is that he rejects Fowler's criticism of using RDB's as the mechanism for application integration.  (And don't dismiss him as simply a RDB bigot - he's not shy about nailing relational gurus, as in &lt;a href="http://typicalprogrammer.com/?p=16"&gt;&lt;span style="font-style: italic;"&gt;Relational Database Experts Jump The MapReduce Shark&lt;/span&gt;&lt;/a&gt;).&lt;br /&gt;&lt;br /&gt;TP's arguments ring true to me, although in my experience it takes a very concientious DB shop to fully maintain the "encapsulation of data and operations" across many applications, many custodians,  and many developers. &lt;br /&gt;&lt;br /&gt;It would be great if Fowler's vision of the integration point being HTTP rather than SQL solved all our problems.  Loose coupling is a wonderful thing to have.  But so far I'm not seeing how this provides equivalent performance for all cases, and how it avoids the problem of data model mismatch.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2420860529344694449-1236499506653277525?l=lin-ear-th-inking.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lin-ear-th-inking.blogspot.com/feeds/1236499506653277525/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2420860529344694449&amp;postID=1236499506653277525&amp;isPopup=true' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2420860529344694449/posts/default/1236499506653277525'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2420860529344694449/posts/default/1236499506653277525'/><link rel='alternate' type='text/html' href='http://lin-ear-th-inking.blogspot.com/2009/01/more-on-database-thawing.html' title='More on Database Thawing'/><author><name>Dr JTS</name><uri>http://www.blogger.com/profile/02383381220154739793</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2420860529344694449.post-8446521236788579173</id><published>2009-01-09T17:22:00.000-08:00</published><updated>2009-01-09T17:34:38.250-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='database'/><title type='text'>Is Global Database Warming happening?</title><content type='html'>Martin Fowler has a great &lt;a href="http://martinfowler.com/bliki"&gt;bliki&lt;/a&gt;&lt;sup&gt;TM&lt;/sup&gt; post on &lt;a href="http://martinfowler.com/bliki/DatabaseThaw.html"&gt;DatabaseThaw&lt;/a&gt;. The soundbite is something like "What happens after relational DBs?".  He has some interesting links to things like &lt;a href="http://en.wikipedia.org/wiki/Drizzle_%28database_server%29"&gt;Drizzle&lt;/a&gt;. &lt;br /&gt;&lt;br /&gt;His opinon of relational DBs is that&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-style: italic;"&gt;their dominance is due less to their role in data    management than their role in integration&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;This makes sense, but I think they also have offered the benefit of providing a fairly powerful, standard way of modelling and querying data.  Over the lifetime of this technology this has fought off some powerful challengers, notably object-oriented data modelling. (Although perhaps this battle was only won by becoming more like the "loser").  The latest challenger is semantic data modelling (RDF, SPARQL, etc).  Perhaps the world is ready to make this transition - although I'm not rushing to sell my Oracle stock.&lt;br /&gt;&lt;br /&gt;He also makes a good point that the focus of integration is shifting from the DB to the Web.  Hard to argue with this...  the clouds are moving in!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2420860529344694449-8446521236788579173?l=lin-ear-th-inking.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lin-ear-th-inking.blogspot.com/feeds/8446521236788579173/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2420860529344694449&amp;postID=8446521236788579173&amp;isPopup=true' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2420860529344694449/posts/default/8446521236788579173'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2420860529344694449/posts/default/8446521236788579173'/><link rel='alternate' type='text/html' href='http://lin-ear-th-inking.blogspot.com/2009/01/is-global-database-warming-happening.html' title='Is Global Database Warming happening?'/><author><name>Dr JTS</name><uri>http://www.blogger.com/profile/02383381220154739793</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2420860529344694449.post-1962208100275947975</id><published>2009-01-08T06:21:00.000-08:00</published><updated>2009-01-08T07:20:06.345-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='computational geometry'/><category scheme='http://www.blogger.com/atom/ns#' term='jts'/><title type='text'>Computing Geometric Similarity</title><content type='html'>The GEOS team is working on porting the JTS &lt;a href="http://lin-ear-th-inking.blogspot.com/2007/11/fast-polygon-merging-in-jts-using.html"&gt;&lt;span style="font-family:courier new;"&gt;CascadedPolygonUnion&lt;/span&gt;&lt;/a&gt; algorithm.   Reasonably enough they asked whether there were unit tests that they could use to check the correctness of their code.  I was a bit dismayed to realize that in fact there weren't any unit tests for this class (although having used the code extensively I'm pretty confident that it's correct.)&lt;br /&gt;&lt;br /&gt;So fine, some unit tests are needed.  This should be easy, right? Just create or obtain some polygonal datasets, union them using both CascadedPolygonUnion (fast) and Geometry.union (slow), and compare the results.&lt;br /&gt;&lt;br /&gt;But there's a catch (in geometric processing there usually is).  Due to rounding effects, there's no guarantee that the results of the two algorithms will be vertex-by-vertex identical.  Of course, they should be very, very similar...  but how to check this? &lt;br /&gt;&lt;br /&gt;In geometry processing it's usually much harder to test "similar" than it is to test "exact", and this case is no exception.  In fact, there's many different tests that could be used, depending on how you want to define "similar".  In the context of unit tests, similarity testing is essentially checking for discrepancies which might be introduced into a theoretically correct result.  So the tests to use may depend on the operation(s) that are being performed, since different kinds of algorithms can produce different kinds of discrepancies.  A further issue which needs to be considered is to detect gross differences which might result from catastrophic algorithm failure.&lt;br /&gt;&lt;br /&gt;So now the task is to write a &lt;span style="font-family:courier new;"&gt;SimilarityValidator &lt;/span&gt;for geometries.  For polygons there's various characteristics which can be compared:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;A simple thing to do is to compare basic quantities like the area and perimeter length of the polygons.  Paradoxically, these are good for detecting small discrepancies, but not for detecting gross ones (e.g. two identical rectangles which are offset by a large distance)&lt;br /&gt;&lt;/li&gt;&lt;li&gt;One obvious thing to do is to compute the symmetricDifference of the polygons and inspect the area of the result.  This has a couple of issues.  One is what area tolerance to use?  A more serious issue is that the symmetric difference operation is itself an approximation to an exact answer.  This is especially true in situations where the inputs are very close - which is exactly the situation we are trying to check!  So there may be a certain lack of confidence that this is detecting all discrepancies&lt;/li&gt;&lt;li&gt;A more robust test is to compute the Hausdorff distance between the rings of the polygons.  This allows expressing the tolerance in terms of distance, which is more intuitive.  It's also fairly robust and easy to confirm the answer.  There's a challenge in developing an efficient Hausdorff algorithm - but that's a topic for another blog post.&lt;/li&gt;&lt;li&gt;Other tests might include comparing structural things like comparing the number of rings in the polygons.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_q016kExGrVs/SWYYYQHdYfI/AAAAAAAAAP4/2nA6neJ05zs/s1600-h/jts-similarityValidation-hausdorff.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 318px; height: 400px;" src="http://3.bp.blogspot.com/_q016kExGrVs/SWYYYQHdYfI/AAAAAAAAAP4/2nA6neJ05zs/s400/jts-similarityValidation-hausdorff.png" alt="" id="BLOGGER_PHOTO_ID_5288941617315406322" border="0" /&gt;&lt;/a&gt;&lt;span style="font-style: italic;"&gt;Hausdorff Distance between two polygons&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;With this validator written and some test datasets run I can finally confirm that CascadedPolygonUnion actually works!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2420860529344694449-1962208100275947975?l=lin-ear-th-inking.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lin-ear-th-inking.blogspot.com/feeds/1962208100275947975/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2420860529344694449&amp;postID=1962208100275947975&amp;isPopup=true' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2420860529344694449/posts/default/1962208100275947975'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2420860529344694449/posts/default/1962208100275947975'/><link rel='alternate' type='text/html' href='http://lin-ear-th-inking.blogspot.com/2009/01/computing-geometric-similarity.html' title='Computing Geometric Similarity'/><author><name>Dr JTS</name><uri>http://www.blogger.com/profile/02383381220154739793</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_q016kExGrVs/SWYYYQHdYfI/AAAAAAAAAP4/2nA6neJ05zs/s72-c/jts-similarityValidation-hausdorff.png' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2420860529344694449.post-828572609873664954</id><published>2009-01-02T12:32:00.000-08:00</published><updated>2009-01-02T12:41:46.977-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='jts'/><title type='text'>JTS Version 1.10 released</title><content type='html'>I'm happy to announce that after a long gestation JTS 1.10 has been released.   (This is my contribution to help fulfill James Fee's &lt;a href="http://feeds.spatiallyadjusted.com/%7Er/SpatiallyAdjusted/%7E3/500240609/"&gt;prediction &lt;/a&gt;8^)&lt;br /&gt;&lt;br /&gt;The package is available on SourceForge &lt;a href="http://sourceforge.net/projects/jts-topo-suite/"&gt;here&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;There are numerous enhancements in this version.  The highlights are:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://lin-ear-th-inking.blogspot.com/2008/10/improvements-to-jts-buffering.html"&gt;Dramatic improvements&lt;/a&gt; to buffer performance, robustness and quality&lt;/li&gt;&lt;li&gt;Moving the GML I/O classes into the core library, and provided more control over the emitted GML&lt;br /&gt;&lt;/li&gt;&lt;li&gt;numerous bug fixes and performance improvements.&lt;/li&gt;&lt;/ul&gt;The full list of changes is:&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Functionality Improvements&lt;/h3&gt; &lt;ul&gt;&lt;li&gt;Added &lt;tt&gt;Geometry.reverse()&lt;/tt&gt; method for all geometry types &lt;/li&gt;&lt;li&gt;Added &lt;tt&gt;setSrsName&lt;/tt&gt;, &lt;tt&gt;setNamespace&lt;/tt&gt;, &lt;tt&gt;setCustomRootElements&lt;/tt&gt; methods to &lt;tt&gt;GMLWriter&lt;/tt&gt; &lt;/li&gt;&lt;li&gt;Added &lt;tt&gt;Envelope.getArea&lt;/tt&gt; method &lt;/li&gt;&lt;li&gt;Added &lt;tt&gt;copy&lt;/tt&gt;, &lt;tt&gt;copyCoord&lt;/tt&gt; methods to &lt;tt&gt;CoordinateSequences&lt;/tt&gt; &lt;/li&gt;&lt;li&gt;Added &lt;tt&gt;area&lt;/tt&gt; method to &lt;tt&gt;Envelope&lt;/tt&gt; &lt;/li&gt;&lt;li&gt;Added &lt;tt&gt;extractPoint(pt, offset)&lt;/tt&gt; methods to &lt;tt&gt;LengthIndexedLine&lt;/tt&gt; and &lt;tt&gt;LocationIndexedLine&lt;/tt&gt; &lt;/li&gt;&lt;li&gt;Added &lt;tt&gt;CoordinatePrecisionReducerFilter&lt;/tt&gt; &lt;/li&gt;&lt;li&gt;Added &lt;tt&gt;UnaryUnionOp(Collection, GeometryFactory)&lt;/tt&gt; constructor to handle empty inputs more automatically &lt;/li&gt;&lt;li&gt;Added &lt;tt&gt;DiscreteHausdorffDistance&lt;/tt&gt; class &lt;/li&gt;&lt;li&gt;Made &lt;tt&gt;LineMerger&lt;/tt&gt; able to be called incrementally &lt;/li&gt;&lt;li&gt;Added &lt;tt&gt;GeometricShapeFactory.createArcPolygon&lt;/tt&gt; to create a polygonal arc &lt;/li&gt;&lt;li&gt;Enhanced &lt;tt&gt;Geometry.buffer()&lt;/tt&gt; to preserve SRID &lt;/li&gt;&lt;/ul&gt;  &lt;h3&gt;Performance Improvements&lt;/h3&gt; &lt;ul&gt;&lt;li&gt;Improved performance for &lt;code&gt;EdgeList&lt;/code&gt; (by using a more efficient technique for detecting duplicate edges) &lt;/li&gt;&lt;li&gt;Improved performance for &lt;code&gt;ByteArrayInStream&lt;/code&gt; (by avoiding use of &lt;tt&gt;java.io.ByteArrayInputStream&lt;/tt&gt;) &lt;/li&gt;&lt;li&gt;Unrolled intersection computation in &lt;tt&gt;HCoordinate&lt;/tt&gt; to avoid object allocation &lt;/li&gt;&lt;li&gt;Improved performance for buffering via better offset curve generation and simplification. &lt;/li&gt;&lt;li&gt;Improved performance for &lt;tt&gt;IsValipOp&lt;/tt&gt; by switching to use &lt;tt&gt;STRtree&lt;/tt&gt; for nested hole checking &lt;/li&gt;&lt;/ul&gt;  &lt;h3&gt;Bug Fixes&lt;/h3&gt; &lt;ul&gt;&lt;li&gt;Fixed &lt;tt&gt;Geometry.getClassSortIndex()&lt;/tt&gt; to lazily initialize the sorted class list.  This fixes a threading bug. &lt;/li&gt;&lt;li&gt;Fixed &lt;tt&gt;RectangleContains&lt;/tt&gt; to return correct result for points on the boundary of the rectangle &lt;/li&gt;&lt;li&gt;Fixed error in &lt;tt&gt;com.vividsolutions.jts.simplify.LineSegmentIndex&lt;/tt&gt; which caused polygons simplified using &lt;tt&gt;TopologyPreservingSimplifier&lt;/tt&gt; to be invalid in certain situations &lt;/li&gt;&lt;li&gt;Fixed error in &lt;tt&gt;DouglasPeuckerSimplifier&lt;/tt&gt; which caused empty polygons to be returned when they contained a very small hole &lt;/li&gt;&lt;li&gt;Fixed &lt;tt&gt;PackedCoordinateSequence&lt;/tt&gt; to return &lt;tt&gt;NaN&lt;/tt&gt; for null ordinate values &lt;/li&gt;&lt;li&gt;Fixed &lt;tt&gt;Geometry.centroid()&lt;/tt&gt; (&lt;tt&gt;CentroidArea&lt;/tt&gt;) so that it handles degenerate (zero-area) polygons &lt;/li&gt;&lt;li&gt;Fixed &lt;tt&gt;Geometry.buffer()&lt;/tt&gt; (&lt;tt&gt;OffsetCurveBuilder&lt;/tt&gt;) so that it handles JOIN_MITRE cases with nearly collinear lines correctly &lt;/li&gt;&lt;li&gt;Fixed &lt;tt&gt;GeometryFactory.toGeometry(Envelope)&lt;/tt&gt; to return a CW polygon &lt;/li&gt;&lt;li&gt;Fixed &lt;tt&gt;UnaryUnionOp&lt;/tt&gt; to correctly handle heterogeneous inputs with P/L/A components &lt;/li&gt;&lt;li&gt;Fixed &lt;tt&gt;UnaryUnionOp&lt;/tt&gt; to accept &lt;tt&gt;LINEARRING&lt;/tt&gt;s &lt;/li&gt;&lt;li&gt;Fixed &lt;tt&gt;CentroidArea&lt;/tt&gt; to handle zero-area polygons correctly &lt;/li&gt;&lt;li&gt;Fixed &lt;tt&gt;WKBWriter&lt;/tt&gt; to always output 3D when requested, and to handle 2D &lt;tt&gt;PackedCoordinateSequences&lt;/tt&gt; correctly in this case &lt;/li&gt;&lt;li&gt;Fixed &lt;tt&gt;NodedSegmentString&lt;/tt&gt; to handle zero-length line segments correctly (via &lt;tt&gt;safeOctant&lt;/tt&gt;) &lt;/li&gt;&lt;li&gt;Cleaned up code to remove unneeded &lt;tt&gt;CGAlgorithms&lt;/tt&gt; objects &lt;/li&gt;&lt;li&gt;Fixed &lt;tt&gt;GeometricShapeFactory.createArc&lt;/tt&gt; to ensure arc has requested number of vertices &lt;/li&gt;&lt;/ul&gt;  &lt;h3&gt;API Changes&lt;/h3&gt; &lt;ul&gt;&lt;li&gt;Moved GML I/O classes into core JTS codebase &lt;/li&gt;&lt;li&gt;Changed &lt;tt&gt;GMLWriter&lt;/tt&gt; to not write the &lt;tt&gt;srsName&lt;/tt&gt; attribute by default &lt;/li&gt;&lt;li&gt;In &lt;tt&gt;DistanceOp&lt;/tt&gt; switched to using &lt;tt&gt;nearestPoints&lt;/tt&gt; method names &lt;/li&gt;&lt;li&gt;Exposed &lt;tt&gt;STRtree.getRoot()&lt;/tt&gt; method &lt;/li&gt;&lt;/ul&gt;   &lt;!------- TestBuilder --------------------&gt; &lt;hr size="1" color="darkblue"&gt; &lt;h3 style="font-family: sans-serif; color: darkblue;"&gt;JTS TestBuilder&lt;/h3&gt;  &lt;h3&gt;UI Improvements&lt;/h3&gt; &lt;ul&gt;&lt;li&gt;Added ability to read GML from input panel &lt;/li&gt;&lt;li&gt;Added GML output to View dialog &lt;/li&gt;&lt;li&gt;Added file drag'n'drop to Geometry Input text areas &lt;/li&gt;&lt;li&gt;Add display of computation time &lt;/li&gt;&lt;li&gt;Added Stats panel &lt;/li&gt;&lt;li&gt;Added Scalar functions panel, with extensible function list &lt;/li&gt;&lt;li&gt;Added &lt;b&gt;Save as PNG...&lt;/b&gt; &lt;/li&gt;&lt;/ul&gt;  &lt;!------- TestRunner --------------------&gt; &lt;hr size="1" color="darkblue"&gt; &lt;h3 style="font-family: sans-serif; color: darkblue;"&gt;JTS TestRunner&lt;/h3&gt;  &lt;h3&gt;Functionality Improvements&lt;/h3&gt; &lt;ul&gt;&lt;li&gt;Added &lt;tt&gt;-testCaseIndex&lt;/tt&gt; command-line option &lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2420860529344694449-828572609873664954?l=lin-ear-th-inking.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lin-ear-th-inking.blogspot.com/feeds/828572609873664954/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2420860529344694449&amp;postID=828572609873664954&amp;isPopup=true' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2420860529344694449/posts/default/828572609873664954'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2420860529344694449/posts/default/828572609873664954'/><link rel='alternate' type='text/html' href='http://lin-ear-th-inking.blogspot.com/2009/01/jts-version-110-released.html' title='JTS Version 1.10 released'/><author><name>Dr JTS</name><uri>http://www.blogger.com/profile/02383381220154739793</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2420860529344694449.post-3654356649898901744</id><published>2008-12-15T10:24:00.000-08:00</published><updated>2008-12-15T10:40:40.654-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='foss4g'/><category scheme='http://www.blogger.com/atom/ns#' term='geospatial'/><title type='text'>OGRS 2009: International Opensource Geospatial Research Symposium</title><content type='html'>Via the &lt;a href="http://openjump.org/"&gt;OpenJUMP&lt;/a&gt; list comes this notice of the &lt;a href="http://www.ogrs2009.org"&gt;OGRS 2009: International Opensource Geospatial Research Symposium&lt;/a&gt; conference in Nantes, France.&lt;br /&gt;&lt;br /&gt;France and &lt;a href="http://2009.foss4g.org/"&gt;Australia &lt;/a&gt;in one year sounds like a pretty good training plan to me!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2420860529344694449-3654356649898901744?l=lin-ear-th-inking.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lin-ear-th-inking.blogspot.com/feeds/3654356649898901744/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2420860529344694449&amp;postID=3654356649898901744&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2420860529344694449/posts/default/3654356649898901744'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2420860529344694449/posts/default/3654356649898901744'/><link rel='alternate' type='text/html' href='http://lin-ear-th-inking.blogspot.com/2008/12/ogrs-2009-international-opensource.html' title='OGRS 2009: International Opensource Geospatial Research Symposium'/><author><name>Dr JTS</name><uri>http://www.blogger.com/profile/02383381220154739793</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2420860529344694449.post-3441364092947785489</id><published>2008-11-28T15:43:00.000-08:00</published><updated>2008-11-28T20:56:38.732-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='jeql'/><category scheme='http://www.blogger.com/atom/ns#' term='kml'/><category scheme='http://www.blogger.com/atom/ns#' term='google-earth'/><title type='text'>KML Pie Charts in JEQL</title><content type='html'>Pie Charts are a nice way of displaying &lt;a href="http://blog.thematicmapping.org/2008_04_01_archive.html"&gt;thematic visualization&lt;/a&gt; in Google Earth.  They're also a good test of the chops of a &lt;a href="http://www.fmepedia.com/index.php/Pie_Chart_Creator"&gt;KML generator&lt;/a&gt;.  So naturally I was keen to see how to produce pie charts with &lt;a href="http://tsusiatsoftware.net/jeql/main.html"&gt;JEQL&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;For simplicity I decided to make my test statistic an orthographic comparison of the names of countries, showing the relative length of the country names and their vowel/consonant distribution.  (This wasn't because this is  a particularly interesting statistic, but it uses easily available data and exercises some of the data processing capabilities of JEQL).&lt;br /&gt;&lt;br /&gt;The solution ended up using lots of existing capabilities, such as splitting multigeometries, regular expressions, JTS functions such as interior point, boundary and distance, and of course generating KML with extrusions and styling.  The only new function I had to add was one to generate elliptical arc polygons - which is a good thing to have.&lt;br /&gt;&lt;br /&gt;The &lt;a href="http://tsusiatsoftware.net/jeql/user/files/namePie.kmz"&gt;results&lt;/a&gt; look pretty snazzy, I think - and would be even better with more meaningful data!&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_q016kExGrVs/STCIzTaS-fI/AAAAAAAAAPA/QdkFI-2eSY8/s1600-h/GE-countryNamePieChart.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 585px; height: 532px;" src="http://2.bp.blogspot.com/_q016kExGrVs/STCIzTaS-fI/AAAAAAAAAPA/QdkFI-2eSY8/s400/GE-countryNamePieChart.jpg" alt="" id="BLOGGER_PHOTO_ID_5273865578616125938" border="0" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2420860529344694449-3441364092947785489?l=lin-ear-th-inking.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lin-ear-th-inking.blogspot.com/feeds/3441364092947785489/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2420860529344694449&amp;postID=3441364092947785489&amp;isPopup=true' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2420860529344694449/posts/default/3441364092947785489'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2420860529344694449/posts/default/3441364092947785489'/><link rel='alternate' type='text/html' href='http://lin-ear-th-inking.blogspot.com/2008/11/kml-pie-charts-in-jeql.html' title='KML Pie Charts in JEQL'/><author><name>Dr JTS</name><uri>http://www.blogger.com/profile/02383381220154739793</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_q016kExGrVs/STCIzTaS-fI/AAAAAAAAAPA/QdkFI-2eSY8/s72-c/GE-countryNamePieChart.jpg' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2420860529344694449.post-5250790110730417392</id><published>2008-11-04T09:02:00.001-08:00</published><updated>2008-11-04T09:21:05.135-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='humour'/><category scheme='http://www.blogger.com/atom/ns#' term='computer art'/><category scheme='http://www.blogger.com/atom/ns#' term='web'/><title type='text'>Wordlicious</title><content type='html'>After seeing &lt;a href="http://surveying-mapping-gis.blogspot.com/"&gt;this post&lt;/a&gt; on &lt;a href="http://www.wordle.net"&gt;Wordle&lt;/a&gt;, I &lt;span&gt;&lt;span style="font-style: italic;"&gt;had&lt;/span&gt;&lt;/span&gt;&lt;span style="font-weight: bold;"&gt; &lt;/span&gt;to try it....&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_q016kExGrVs/SRCAQF9gqSI/AAAAAAAAAOg/Ypk_TItDTEo/s1600-h/wordle.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 563px; height: 352px;" src="http://3.bp.blogspot.com/_q016kExGrVs/SRCAQF9gqSI/AAAAAAAAAOg/Ypk_TItDTEo/s400/wordle.png" alt="" id="BLOGGER_PHOTO_ID_5264848978362542370" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;and there's no stopping at just one...&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_q016kExGrVs/SRCAwHFsiVI/AAAAAAAAAOo/8B5qedrGD_w/s1600-h/wordle2.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 554px; height: 263px;" src="http://3.bp.blogspot.com/_q016kExGrVs/SRCAwHFsiVI/AAAAAAAAAOo/8B5qedrGD_w/s400/wordle2.png" alt="" id="BLOGGER_PHOTO_ID_5264849528421124434" border="0" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2420860529344694449-5250790110730417392?l=lin-ear-th-inking.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lin-ear-th-inking.blogspot.com/feeds/5250790110730417392/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2420860529344694449&amp;postID=5250790110730417392&amp;isPopup=true' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2420860529344694449/posts/default/5250790110730417392'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2420860529344694449/posts/default/5250790110730417392'/><link rel='alternate' type='text/html' href='http://lin-ear-th-inking.blogspot.com/2008/11/wordlicious.html' title='Wordlicious'/><author><name>Dr JTS</name><uri>http://www.blogger.com/profile/02383381220154739793</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_q016kExGrVs/SRCAQF9gqSI/AAAAAAAAAOg/Ypk_TItDTEo/s72-c/wordle.png' height='72' width='72'/><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2420860529344694449.post-1725738767377699857</id><published>2008-10-21T03:12:00.000-07:00</published><updated>2008-10-21T03:44:55.492-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='computation'/><category scheme='http://www.blogger.com/atom/ns#' term='nostalgia'/><title type='text'>Nostalgic Trivia</title><content type='html'>When I was but a wee nerdling, I took a course taught by a grizzled veteran of the computer industry.  I can no longer remember the subject matter of the course, but I do remember that at one point he referred to the main players in the computer business as "IBM and D'BUNCH".  D'BUNCH were &lt;span style="font-weight: bold;"&gt;DEC&lt;/span&gt;, &lt;span style="font-weight: bold;"&gt;Burroughs&lt;/span&gt;, &lt;span style="font-weight: bold;"&gt;Univac&lt;/span&gt;, &lt;span style="font-weight: bold;"&gt;NCR&lt;/span&gt;, &lt;span style="font-weight: bold;"&gt;Control Data&lt;/span&gt;, and &lt;span style="font-weight: bold;"&gt;Honeywell&lt;/span&gt;.  (And yes, I had to resort to &lt;a href="http://en.wikipedia.org/wiki/BUNCH"&gt;Wikipedia&lt;/a&gt; to remember all these names.)&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_q016kExGrVs/SP2wbm9tvEI/AAAAAAAAALc/v7MZX-8AfCI/s1600-h/IBM-logo.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://3.bp.blogspot.com/_q016kExGrVs/SP2wbm9tvEI/AAAAAAAAALc/v7MZX-8AfCI/s400/IBM-logo.png" alt="" id="BLOGGER_PHOTO_ID_5259553928200961090" border="0" /&gt;&lt;/a&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_q016kExGrVs/SP2we4niyiI/AAAAAAAAALk/e49N9Qhp-WA/s1600-h/DEC-logo.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://1.bp.blogspot.com/_q016kExGrVs/SP2we4niyiI/AAAAAAAAALk/e49N9Qhp-WA/s400/DEC-logo.png" alt="" id="BLOGGER_PHOTO_ID_5259553984479414818" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;The moral of the story?  Computer manufacturers come and go, but IBM remaineth eternal, apparently.&lt;br /&gt;&lt;br /&gt;Dating myself even more, in the early part of my career I used machines made by the first 3 of these.  The Univac had the distinction of having the most obtuse, unwieldy, difficult-to-use OS I have ever encountered.  DEC, in contrast, had the best OS (of proprietary ones, that is - *nix blows 'em all away).&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2420860529344694449-1725738767377699857?l=lin-ear-th-inking.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lin-ear-th-inking.blogspot.com/feeds/1725738767377699857/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2420860529344694449&amp;postID=1725738767377699857&amp;isPopup=true' title='11 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2420860529344694449/posts/default/1725738767377699857'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2420860529344694449/posts/default/1725738767377699857'/><link rel='alternate' type='text/html' href='http://lin-ear-th-inking.blogspot.com/2008/10/nostalgic-trivia.html' title='Nostalgic Trivia'/><author><name>Dr JTS</name><uri>http://www.blogger.com/profile/02383381220154739793</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_q016kExGrVs/SP2wbm9tvEI/AAAAAAAAALc/v7MZX-8AfCI/s72-c/IBM-logo.png' height='72' width='72'/><thr:total>11</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2420860529344694449.post-3166562209038997535</id><published>2008-10-20T15:59:00.001-07:00</published><updated>2008-10-20T16:13:02.346-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='REST'/><category scheme='http://www.blogger.com/atom/ns#' term='software'/><category scheme='http://www.blogger.com/atom/ns#' term='web'/><title type='text'>Untangling REST</title><content type='html'>Thanks to &lt;a href="http://sgillies.net/blog/820/the-hypertext-constraint/"&gt;Sean&lt;/a&gt; I just learned about &lt;a href="http://en.wikipedia.org/wiki/Roy_Fielding"&gt;Roy Fielding's&lt;/a&gt; &lt;a href="http://roy.gbiv.com/untangled/"&gt;blog&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://roy.gbiv.com/untangled/wp-content/themes/gbiv/img/top-roy.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px;" src="http://roy.gbiv.com/untangled/wp-content/themes/gbiv/img/top-roy.jpg" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;I don't know why it never occurred to me that Roy Fielding would have a blog, and it would likely to be a good source of commentary on the evolving philosophy of the Web, but it didn't.  He does, and sure enough it's chock full o' goodness.&lt;br /&gt;&lt;br /&gt;Highlights include &lt;a href="http://roy.gbiv.com/untangled/2008/paper-tigers-and-hidden-dragons"&gt;this post&lt;/a&gt; about how to efficiently build a RESTful &lt;a href="http://www.isr.uci.edu/events/twist/wisen98/"&gt;Internet-scale event notification system&lt;/a&gt; for querying Flickr photo update events - using images as bitmap indexes of event timeslices!  Or the &lt;a href="http://roy.gbiv.com/untangled/2008/rest-apis-must-be-hypertext-driven"&gt;post&lt;/a&gt; which Sean noted, along with &lt;a href="http://roy.gbiv.com/untangled/2008/no-rest-in-cmis"&gt;this one&lt;/a&gt; - both &lt;span style="font-style: italic;"&gt;cri-de-coeurs&lt;/span&gt; about the pain of seing the clean concept of REST muddied to the point of meaningless.&lt;br /&gt;&lt;br /&gt;Anyone confused about REST would do well to avoid inhaling too much smoke and get a dose of fresh air from the source...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2420860529344694449-3166562209038997535?l=lin-ear-th-inking.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lin-ear-th-inking.blogspot.com/feeds/3166562209038997535/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2420860529344694449&amp;postID=3166562209038997535&amp;isPopup=true' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2420860529344694449/posts/default/3166562209038997535'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2420860529344694449/posts/default/3166562209038997535'/><link rel='alternate' type='text/html' href='http://lin-ear-th-inking.blogspot.com/2008/10/untangling-rest.html' title='Untangling REST'/><author><name>Dr JTS</name><uri>http://www.blogger.com/profile/02383381220154739793</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2420860529344694449.post-4465851234815545194</id><published>2008-10-07T21:08:00.000-07:00</published><updated>2008-10-13T22:50:15.325-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='algorithms'/><category scheme='http://www.blogger.com/atom/ns#' term='computational geometry'/><category scheme='http://www.blogger.com/atom/ns#' term='jts'/><title type='text'>Improvements to JTS buffering</title><content type='html'>By far the most difficult code in JTS to develop has been the buffer algorithm.   It took a lot of hard graft of thinking, coding and testing to achieve a solid level of robustness and functionality. There have been a couple of iterations of improvements since the first version shipped, but the main features of the algorithm have been pretty stable.&lt;br /&gt;&lt;br /&gt;However, it was always clear that the performance and memory-usage characteristics left something to be desired.  This is particularly evident in cases which involve large buffer distances and/or complex geometry.  These shortcomings are even more apparent in GEOS, which is less efficient at computation involving large amounts of memory allocation.&lt;br /&gt;&lt;br /&gt;I'm pleased to say that after a few years of gestating ideas (really! - at least on and off) about how to improve the buffer algorithm, I've finally been able to implement some enhancements which address these problems.  In fact, they provide&lt;span style="font-style: italic;"&gt; dramatically&lt;/span&gt; better performance in the above situations.  As an example, here are timing comparisons between JTS 1.9 and the new code (the input data is 50 polygons for African countries, in lat-long):&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;Buffer&lt;br /&gt;Distance     JTS 1.9    JTS 1.10&lt;br /&gt;&lt;br /&gt;0.01        359 ms     406 ms&lt;br /&gt;0.1        1094 ms     594 ms&lt;br /&gt;1.0      16.453 s     2484 ms&lt;br /&gt;10.0     217.578 s     3656 ms&lt;br /&gt;100.0     728.297 s      250 ms&lt;br /&gt;1000.0    1661.109 s      313 ms&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Another tester reports that a buffering task which took &lt;span style="font-weight: bold;"&gt;83 sec&lt;/span&gt; with JTS 1.9 now takes &lt;span style="font-weight: bold;"&gt;2 sec&lt;/span&gt; with the new code.&lt;br /&gt;&lt;br /&gt;But wait, there's more!  In addition to the much better performance of the new algorithm, the timings reveal a further benefit - once the buffer distance gets over a certain size (relative to the input), the execution time actually gets &lt;span style="font-style: italic;"&gt;faster&lt;/span&gt;.  (In fact, this is as it should be - as buffer distances get very large, the shape of the input geometry has less and less effect on the shape of the buffer curve.)&lt;br /&gt;&lt;pre&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_q016kExGrVs/SPQxRP9GncI/AAAAAAAAALU/gMdB09AxH_s/s1600-h/country-buffer.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://1.bp.blogspot.com/_q016kExGrVs/SPQxRP9GncI/AAAAAAAAALU/gMdB09AxH_s/s400/country-buffer.png" alt="" id="BLOGGER_PHOTO_ID_5256880837458566594" border="0" /&gt;&lt;/a&gt;&lt;/pre&gt; The algorithm improvements which have made such a difference are:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Improved offset curve geometry&lt;/span&gt; - to avoid some nasty issues arising from arc  discretization, the original buffer code used some fairly conservative heuristics.  These have been fine-tuned to produce a curve which allows more efficent computation, while still maintaining fidelity of the buffer result&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Simplification of input&lt;/span&gt; - for large buffer distances, small concavities in the input geometry don't affect the resulting buffer to a significant degree.  Removing these in a way which preserves buffer distance accuracy (within tolerance) gives a big improvement in performance.&lt;/li&gt;&lt;/ul&gt;A nice side effect of this work is the development of a solid methodology for validating buffers, and a thorough test suite for correctness, robustness, and performance.&lt;br /&gt;&lt;br /&gt;This code will appear in JTS 1.10 Real Soon Now.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2420860529344694449-4465851234815545194?l=lin-ear-th-inking.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lin-ear-th-inking.blogspot.com/feeds/4465851234815545194/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2420860529344694449&amp;postID=4465851234815545194&amp;isPopup=true' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2420860529344694449/posts/default/4465851234815545194'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2420860529344694449/posts/default/4465851234815545194'/><link rel='alternate' type='text/html' href='http://lin-ear-th-inking.blogspot.com/2008/10/improvements-to-jts-buffering.html' title='Improvements to JTS buffering'/><author><name>Dr JTS</name><uri>http://www.blogger.com/profile/02383381220154739793</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_q016kExGrVs/SPQxRP9GncI/AAAAAAAAALU/gMdB09AxH_s/s72-c/country-buffer.png' height='72' width='72'/><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2420860529344694449.post-6950917119941120692</id><published>2008-08-22T15:43:00.000-07:00</published><updated>2008-08-26T08:15:22.881-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='software'/><category scheme='http://www.blogger.com/atom/ns#' term='books'/><title type='text'>Java Power Tools cuts straight and true</title><content type='html'>&lt;div&gt;Part of my summer holiday reading is the book &lt;em&gt;&lt;a href="http://oreilly.com/catalog/9780596527938/"&gt;Java Power Tools&lt;/a&gt;&lt;/em&gt;, by John Ferguson Smart. &lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;/div&gt;&lt;img id="BLOGGER_PHOTO_ID_5238843924790209986" style="DISPLAY: block; MARGIN: 0px auto 10px; CURSOR: hand; TEXT-ALIGN: center" alt="" src="http://3.bp.blogspot.com/_q016kExGrVs/SLQcywLVbcI/AAAAAAAAAJU/8rDDvUEJO4Y/s400/java_power_tools.gif" border="0" /&gt;&lt;br /&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;I count a computer book a good buy if I get one new idea from it; two is stellar; and three or more goes on my "Recommend to Colleagues" list. This one is on the list... Ideas I`ve picked up include:&lt;br /&gt;&lt;/div&gt;&lt;ul&gt;&lt;li&gt;the &lt;a href="http://www.oopsconsultancy.com/software/xmltask/index.html"&gt;XMLTask&lt;/a&gt; extension for Ant, that provides easy and powerful editing of XML files. This should make configuring things like &lt;span style="font-family:courier new;"&gt;web.xml&lt;/span&gt; and &lt;span style="font-family:courier new;"&gt;struts-config.xml&lt;/span&gt; a lot easier. It even provides a way to uncomment blocks of XML markup.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;a href="http://schemaspy.sourceforge.net/"&gt;SchemaSpy&lt;/a&gt;, which generates database documentation (including ER diagrams!) from JDBC metadata.  The tool also also comes with profiles for interpreting some vendor-specific metadata.  It will be interesting to see how it handles spatial datatypes in Oracle and PostGIS...&lt;/li&gt;&lt;br /&gt;&lt;li&gt;using &lt;a href="http://www.doxygen.org/"&gt;Doxygen&lt;/a&gt; to generate documentation for Java source. Doxygen provides more capabilities than Javadoc, including UML diagrams and a variety of output document formats.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;a href="http://www.umlgraph.org/"&gt;UMLGraph&lt;/a&gt; also allows generating UML diagrams from Java source, and embedding them directly in Javadoc.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;For graph visualization, SchemaSpy, Doxygen and UMLGraph all use the &lt;a href="http://www.graphviz.org/"&gt;GraphViz&lt;/a&gt; application. This looks like a great tool in its own right. It provides a &lt;a href="http://en.wikipedia.org/wiki/Domain-specific_programming_language"&gt;DSL&lt;/a&gt; for specifying graph structures and node and edge symbology, along with a layout and rendering engine which outputs to numerous different formats.&lt;/p&gt;&lt;p&gt;JPT of course covers all the better-known tools such as Ant, Maven, CVS, SVN, JUnit, Bugzilla, Trac, and many others. It doesn`t replace the documentation for these tools, but it does give a good comparative overview and enough details to help you decide which ones you`re going to strap around your waist for the next project.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2420860529344694449-6950917119941120692?l=lin-ear-th-inking.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lin-ear-th-inking.blogspot.com/feeds/6950917119941120692/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2420860529344694449&amp;postID=6950917119941120692&amp;isPopup=true' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2420860529344694449/posts/default/6950917119941120692'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2420860529344694449/posts/default/6950917119941120692'/><link rel='alternate' type='text/html' href='http://lin-ear-th-inking.blogspot.com/2008/08/java-power-tools-cuts-straight-and-true.html' title='Java Power Tools cuts straight and true'/><author><name>Dr JTS</name><uri>http://www.blogger.com/profile/02383381220154739793</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_q016kExGrVs/SLQcywLVbcI/AAAAAAAAAJU/8rDDvUEJO4Y/s72-c/java_power_tools.gif' height='72' width='72'/><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2420860529344694449.post-2338391037221791858</id><published>2008-08-15T19:38:00.000-07:00</published><updated>2008-08-15T20:52:28.269-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='geospatial'/><category scheme='http://www.blogger.com/atom/ns#' term='web'/><category scheme='http://www.blogger.com/atom/ns#' term='microsoft'/><title type='text'>Be the most popular tile on your block</title><content type='html'>You might think that the image below is a map of North America population density.  You'd be off by one level of indirection...&lt;br /&gt;&lt;br /&gt;In fact it's a heat map of the access frequency for Virtual Earth map tiles.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_q016kExGrVs/SKY-LHzv8tI/AAAAAAAAAI0/KkznhsxWOso/s1600-h/msve_tile_heatmap.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 482px; height: 259px;" src="http://4.bp.blogspot.com/_q016kExGrVs/SKY-LHzv8tI/AAAAAAAAAI0/KkznhsxWOso/s400/msve_tile_heatmap.png" alt="" id="BLOGGER_PHOTO_ID_5234939977660363474" border="0" /&gt;&lt;/a&gt;So really it's not an image of where people &lt;span style="font-style: italic;"&gt;are&lt;/span&gt;, but where they &lt;span style="font-style: italic;"&gt;want to be&lt;/span&gt;...&lt;br /&gt;&lt;br /&gt;The image comes from a paper out of Microsoft Research: &lt;a href="http://research.microsoft.com/%7Edanyelf/publications/Fisher_Imaging_The_City.pdf"&gt;&lt;span style="font-style: italic;"&gt;How We Watch the City: Popularity and Online Maps&lt;/span&gt;&lt;/a&gt;, by Danyel Fisher.&lt;br /&gt;&lt;br /&gt;Makes me wonder if there are tiles that have &lt;span style="font-style: italic;"&gt;never been accessed&lt;/span&gt;.  Like perhaps this one? (It took a looong time to render....)&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_q016kExGrVs/SKZAQFOM7ZI/AAAAAAAAAI8/aMxQWoQ25tI/s1600-h/ms-nwt-tile.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 471px; height: 341px;" src="http://1.bp.blogspot.com/_q016kExGrVs/SKZAQFOM7ZI/AAAAAAAAAI8/aMxQWoQ25tI/s400/ms-nwt-tile.png" alt="" id="BLOGGER_PHOTO_ID_5234942261888609682" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;And what is the &lt;span style="font-style: italic;"&gt;most-accessed&lt;/span&gt; tile?  This one, perhaps?&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_q016kExGrVs/SKZO2ah4J3I/AAAAAAAAAJE/eL93dGXKzp4/s1600-h/ms-ny-tile.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://2.bp.blogspot.com/_q016kExGrVs/SKZO2ah4J3I/AAAAAAAAAJE/eL93dGXKzp4/s400/ms-ny-tile.png" alt="" id="BLOGGER_PHOTO_ID_5234958313606096754" border="0" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2420860529344694449-2338391037221791858?l=lin-ear-th-inking.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lin-ear-th-inking.blogspot.com/feeds/2338391037221791858/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2420860529344694449&amp;postID=2338391037221791858&amp;isPopup=true' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2420860529344694449/posts/default/2338391037221791858'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2420860529344694449/posts/default/2338391037221791858'/><link rel='alternate' type='text/html' href='http://lin-ear-th-inking.blogspot.com/2008/08/be-most-popular-tile-on-your-block.html' title='Be the most popular tile on your block'/><author><name>Dr JTS</name><uri>http://www.blogger.com/profile/02383381220154739793</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_q016kExGrVs/SKY-LHzv8tI/AAAAAAAAAI0/KkznhsxWOso/s72-c/msve_tile_heatmap.png' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2420860529344694449.post-2559704190916446537</id><published>2008-08-14T22:47:00.000-07:00</published><updated>2008-08-14T23:09:13.173-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='computation'/><category scheme='http://www.blogger.com/atom/ns#' term='hardware'/><title type='text'>Revolution is Happening Now</title><content type='html'>This great graph shows why we're all going to wrassling with parellelization for the rest of our coding lives:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_q016kExGrVs/SKUZXiRHO8I/AAAAAAAAAIs/06ZKsb7IHgE/s1600-h/CPU-metrics.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 440px; height: 440px;" src="http://1.bp.blogspot.com/_q016kExGrVs/SKUZXiRHO8I/AAAAAAAAAIs/06ZKsb7IHgE/s400/CPU-metrics.png" alt="" id="BLOGGER_PHOTO_ID_5234618034014337986" border="0" /&gt;&lt;/a&gt;Source: &lt;a href="http://www.nanohub.org/resource_files/2007/12/03709/2007.11.06-yelick.pdf"&gt;&lt;span style="font-style: italic;"&gt;Challenges and Strategies for High End Computing&lt;/span&gt;&lt;/a&gt;, Kathy Yelick&lt;br /&gt;&lt;br /&gt;Also see &lt;a href="http://crd.lbl.gov/%7Edhbailey/cs267/lecture01_intro_hds08.pdf"&gt;this course outline&lt;/a&gt; for an sobering/inspiring view of where computation is headed.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2420860529344694449-2559704190916446537?l=lin-ear-th-inking.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lin-ear-th-inking.blogspot.com/feeds/2559704190916446537/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2420860529344694449&amp;postID=2559704190916446537&amp;isPopup=true' title='10 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2420860529344694449/posts/default/2559704190916446537'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2420860529344694449/posts/default/2559704190916446537'/><link rel='alternate' type='text/html' href='http://lin-ear-th-inking.blogspot.com/2008/08/revolution-is-happening-now.html' title='Revolution is Happening Now'/><author><name>Dr JTS</name><uri>http://www.blogger.com/profile/02383381220154739793</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_q016kExGrVs/SKUZXiRHO8I/AAAAAAAAAIs/06ZKsb7IHgE/s72-c/CPU-metrics.png' height='72' width='72'/><thr:total>10</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2420860529344694449.post-7449077781848551730</id><published>2008-08-04T16:01:00.000-07:00</published><updated>2008-08-05T08:53:45.122-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='computation'/><category scheme='http://www.blogger.com/atom/ns#' term='software'/><title type='text'>Krusty kurmudgeon Knuth kans kores &amp; kommon kode</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.informit.com/content/authors/k/knuth_donald/knuth_donald_e.jpg"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer;" src="http://www.informit.com/content/authors/k/knuth_donald/knuth_donald_e.jpg" alt="" border="0" /&gt;&lt;/a&gt;&lt;a href="http://binstock.blogspot.com/"&gt;Andrew Binstock&lt;/a&gt; has an &lt;a href="http://www.informit.com/articles/article.aspx?p=1193856"&gt;interesting interview with Don Knuth&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Professor Knuth makes a few surprising comments, including a &lt;span style="font-style: italic; font-weight: bold;"&gt;low opinion&lt;/span&gt; of the current trend towards multicore architectures. Knuth says:&lt;br /&gt;&lt;blockquote style="font-style: italic;"&gt;To me, it looks more or less like the hardware designers have run out of ideas, and that they’re trying to pass the blame for the future demise of Moore’s Law to the software writers...&lt;/blockquote&gt;But then he goes on to admit:&lt;br /&gt;&lt;blockquote style="font-style: italic;"&gt;I haven’t got many bright ideas about what I wish hardware designers would provide instead of multicores...&lt;/blockquote&gt;Which seems to me to make his complaint irrelevant, at best.  (Not that I don't sympathize with his frustration about banging our heads against the ceiling of sequential processing speed.  And as the sage of combinatorial algorithms he must be more aware than most of us about the difficulties of taking advantage of concurrency.)&lt;br /&gt;&lt;br /&gt;Another egregious Knutherly opinion is that he is "&lt;span style="font-style: italic;"&gt;biased against the current fashion for reusable code&lt;/span&gt;".  He prefers what he calls "re-editable code".  My thought is that open source gives you both options, and personally I am quite happy to reuse, say, the Java API rather than rewriting it.  But I guess when most of your code is developed in your own personal machine architecture (Knuth's MIX) then it's a good thing to enjoy rewriting code!&lt;br /&gt;&lt;br /&gt;In the end, however, I have to respect the opinions of a man who has written more lines of code and analyzed more algorithms than most of us have had hot dinners.  And I still place him in the upper levels of the pantheon of computer science, whose books all programmers would like to have seen gracing their shelves  - even if most of us will never read them!&lt;br /&gt;&lt;br /&gt;And yes, this post is mostly an excuse for some korny alliteration - but the interview is still worth a read.  (Binstock's blog is worth scanning too - he has some very useful posts on aspects of Java development.)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2420860529344694449-7449077781848551730?l=lin-ear-th-inking.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lin-ear-th-inking.blogspot.com/feeds/7449077781848551730/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2420860529344694449&amp;postID=7449077781848551730&amp;isPopup=true' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2420860529344694449/posts/default/7449077781848551730'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2420860529344694449/posts/default/7449077781848551730'/><link rel='alternate' type='text/html' href='http://lin-ear-th-inking.blogspot.com/2008/08/krusty-kurmudgeon-knuth-kans-kores.html' title='Krusty kurmudgeon Knuth kans kores &amp; kommon kode'/><author><name>Dr JTS</name><uri>http://www.blogger.com/profile/02383381220154739793</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2420860529344694449.post-1671761791433945540</id><published>2008-07-21T12:09:00.000-07:00</published><updated>2008-07-21T12:12:11.829-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='microsoft'/><title type='text'>Quote of the Day</title><content type='html'>Love him or hate, you have to admit that &lt;a href="http://www.pcmag.com/article2/0,2817,2325778,00.asp?kc=PCRSS03079TX1K0000584"&gt;John Dvorak gives good copy&lt;/a&gt;:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;Vista is essentially the old hooker with a bad facelift and too much makeup. She also can't remember her customers&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2420860529344694449-1671761791433945540?l=lin-ear-th-inking.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lin-ear-th-inking.blogspot.com/feeds/1671761791433945540/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2420860529344694449&amp;postID=1671761791433945540&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2420860529344694449/posts/default/1671761791433945540'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2420860529344694449/posts/default/1671761791433945540'/><link rel='alternate' type='text/html' href='http://lin-ear-th-inking.blogspot.com/2008/07/quote-of-day.html' title='Quote of the Day'/><author><name>Dr JTS</name><uri>http://www.blogger.com/profile/02383381220154739793</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2420860529344694449.post-9038320336562863269</id><published>2008-06-24T10:27:00.000-07:00</published><updated>2008-06-24T17:17:31.161-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='web'/><category scheme='http://www.blogger.com/atom/ns#' term='database'/><title type='text'>Database design tips for massively-scalable apps</title><content type='html'>Here's an &lt;a href="http://highscalability.com/how-i-learned-stop-worrying-and-love-using-lot-disk-space-scale"&gt;interesting post&lt;/a&gt; on design practices for building massively-scalable apps on database infrastructure such as Google BigTable.&lt;br /&gt;&lt;br /&gt;The takeaway: this ain't your granpappy's old relational database system, so throw out everything he taught you.  Denormalize.  Prefer big fluffy things to small granular things.  Don't bother with DB constraints - enforce the model in the application. Prefer small frequent updates to large page updates.&lt;br /&gt;&lt;br /&gt;The good news (or bad, depending on how fed up you are with your local DBA) - don't bother with all this unless you intend to scale to millions of users.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2420860529344694449-9038320336562863269?l=lin-ear-th-inking.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lin-ear-th-inking.blogspot.com/feeds/9038320336562863269/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2420860529344694449&amp;postID=9038320336562863269&amp;isPopup=true' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2420860529344694449/posts/default/9038320336562863269'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2420860529344694449/posts/default/9038320336562863269'/><link rel='alternate' type='text/html' href='http://lin-ear-th-inking.blogspot.com/2008/06/database-design-tips-for-massively.html' title='Database design tips for massively-scalable apps'/><author><name>Dr JTS</name><uri>http://www.blogger.com/profile/02383381220154739793</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2420860529344694449.post-1568661770319268994</id><published>2008-06-23T11:00:00.000-07:00</published><updated>2008-06-23T12:02:05.844-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='geospatial'/><category scheme='http://www.blogger.com/atom/ns#' term='web'/><title type='text'>GeoSVG, anyone?</title><content type='html'>The &lt;a href="http://en.wikipedia.org/wiki/GeoPDF"&gt;GeoPDF&lt;/a&gt; format seems to be gaining traction these days.  I have to admit, when I first heard of this technology I had the &lt;a href="http://feeds.spatiallyadjusted.com/%7Er/SpatiallyAdjusted/%7E3/316248990/"&gt;same reaction as James Fee&lt;/a&gt; - "What's it good for"?   But I'm coming round... A live map with rich information content and a true geospatial coordinate system - what's not to like? &lt;br /&gt;&lt;br /&gt;My excuse for such scepticism is my finely-honed technical bullsh*t reflex, which uses the logic of "If this is such a good, obvious, simple idea then why hasn't it been implemented ages ago?". &lt;br /&gt;&lt;br /&gt;To be fair, there have been lots of SVG mapping demos, which fill the same use case and provide equivalent functionality.  Sadly that concept hasn't really caught fire, though (perhaps due to the ongoing SVG "always a bridesmaid, never a bride" conundrum).&lt;br /&gt;&lt;br /&gt;Of course, an idea this good is really too important to be bottled up in the murky world of proprietary technology.  It seems like this area is ripe for an open standard.  SVG is the obvious candidate for the spatial content (sorry, GeoJSON).  What it needs is some standards around modelling geospatial coordinate systems and encoding layers of features.  It seems like this should be quite doable.  The goal would be to standardize the document format so that viewers could easily be developed (either stand-alone, as modules of existing viewers, or as browser-hosted apps).  Also, the feature data should be easy to extract from the data file, for use in other applications.&lt;br /&gt;&lt;br /&gt;Perhaps there's already an initiative like this out there - if so, I'd love to hear about it.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2420860529344694449-1568661770319268994?l=lin-ear-th-inking.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lin-ear-th-inking.blogspot.com/feeds/1568661770319268994/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2420860529344694449&amp;postID=1568661770319268994&amp;isPopup=true' title='13 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2420860529344694449/posts/default/1568661770319268994'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2420860529344694449/posts/default/1568661770319268994'/><link rel='alternate' type='text/html' href='http://lin-ear-th-inking.blogspot.com/2008/06/geosvg-anyone.html' title='GeoSVG, anyone?'/><author><name>Dr JTS</name><uri>http://www.blogger.com/profile/02383381220154739793</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>13</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2420860529344694449.post-9042036007995701764</id><published>2008-06-02T16:45:00.000-07:00</published><updated>2008-06-02T16:55:05.226-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='google-earth'/><title type='text'>B.C. winter causes frost buckling in Google Earth</title><content type='html'>The Google Earth imagery of Revelstoke Dam in B.C.  (&lt;span style="font-style: italic;"&gt;below&lt;/span&gt;) looks like it was taken in the depths of winter.   Since this is a massive concrete dam, I'm guessing the frost buckling in the image is an artifact of the surface model.  Maybe Google need to add some more antifreeze to their TIN algorithm... or perhaps light a twig fire under their rendering engine?&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_q016kExGrVs/SESH1JNfQQI/AAAAAAAAAHY/KSvF9xjzKOs/s1600-h/Revestoke+Dam+Frost+Buckling.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 600px; height: 380px;" src="http://2.bp.blogspot.com/_q016kExGrVs/SESH1JNfQQI/AAAAAAAAAHY/KSvF9xjzKOs/s400/Revestoke+Dam+Frost+Buckling.png" alt="" id="BLOGGER_PHOTO_ID_5207436416222445826" border="0" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2420860529344694449-9042036007995701764?l=lin-ear-th-inking.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lin-ear-th-inking.blogspot.com/feeds/9042036007995701764/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2420860529344694449&amp;postID=9042036007995701764&amp;isPopup=true' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2420860529344694449/posts/default/9042036007995701764'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2420860529344694449/posts/default/9042036007995701764'/><link rel='alternate' type='text/html' href='http://lin-ear-th-inking.blogspot.com/2008/06/bc-winter-causes-frost-buckling-in.html' title='B.C. winter causes frost buckling in Google Earth'/><author><name>Dr JTS</name><uri>http://www.blogger.com/profile/02383381220154739793</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_q016kExGrVs/SESH1JNfQQI/AAAAAAAAAHY/KSvF9xjzKOs/s72-c/Revestoke+Dam+Frost+Buckling.png' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2420860529344694449.post-3873825022545961875</id><published>2008-05-01T09:09:00.000-07:00</published><updated>2008-05-01T09:20:48.840-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='computation'/><category scheme='http://www.blogger.com/atom/ns#' term='database'/><title type='text'>Database Architecture monograph</title><content type='html'>In the era of &lt;span style="font-weight: bold;"&gt;cloud computing&lt;/span&gt;, &lt;span style="font-weight: bold;"&gt;map/reduce&lt;/span&gt;, &lt;span style="font-weight: bold;"&gt;dynamic languages&lt;/span&gt; and the &lt;span style="font-weight: bold;"&gt;semantic web&lt;/span&gt;, the stalwart &lt;span style="font-weight: bold;"&gt;Relational Database Management System&lt;/span&gt; is looking a bit fusty.  But RDBMSes were perhaps the earliest widely-deployed example of many of the techniques of distributed computing, concurrent programming, and query optimization that are still highly relevant. &lt;br /&gt;&lt;br /&gt;Hellerstein, Stonebraker and Hamilton have published a &lt;a href="http://mvdirona.com/jrh/perspectives/content/binary/ArchitectureOfDatabaseSystem.pdf"&gt;monograph on &lt;span style="font-style: italic;"&gt;Architecture of a Database System&lt;/span&gt;&lt;/a&gt;.  With names like that involved you'd expect high quality and some deep insight, and the article delivers.  It's a good, accesible summary of the state-of-the-art in RDBMS technology.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2420860529344694449-3873825022545961875?l=lin-ear-th-inking.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lin-ear-th-inking.blogspot.com/feeds/3873825022545961875/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2420860529344694449&amp;postID=3873825022545961875&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2420860529344694449/posts/default/3873825022545961875'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2420860529344694449/posts/default/3873825022545961875'/><link rel='alternate' type='text/html' href='http://lin-ear-th-inking.blogspot.com/2008/05/database-architecture-monograph.html' title='Database Architecture monograph'/><author><name>Dr JTS</name><uri>http://www.blogger.com/profile/02383381220154739793</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2420860529344694449.post-5330033257574865939</id><published>2008-05-01T08:48:00.000-07:00</published><updated>2008-05-01T09:04:18.356-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='computation'/><category scheme='http://www.blogger.com/atom/ns#' term='database'/><title type='text'>JAQL pegs the cool technology mashup meter</title><content type='html'>&lt;a href="http://www.jaql.org/"&gt;JAQL&lt;/a&gt; is a query language and engine which has &lt;a style="font-weight: bold;" href="http://www.w3.org/TR/xquery/"&gt;XQuery&lt;/a&gt;&lt;span style="font-weight: bold;"&gt;-like syntax&lt;/span&gt;, &lt;a style="font-weight: bold;" href="http://en.wikipedia.org/wiki/SQL"&gt;SQL&lt;/a&gt;&lt;span style="font-weight: bold;"&gt;-like operators&lt;/span&gt;, &lt;a style="font-weight: bold;" href="http://www.json.org/"&gt;JSON&lt;/a&gt; as a native data format, and runs using the &lt;a style="font-weight: bold;" href="http://hadoop.apache.org/core/"&gt;Hadoop&lt;/a&gt; ma/preduce framework.  (Although not mentioned explicitly, it's probably great for &lt;span style="font-weight: bold;"&gt;social networking&lt;/span&gt; as well...)&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://upload.wikimedia.org/wikipedia/commons/thumb/b/bf/Canis_mesomelas.jpg/250px-Canis_mesomelas.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px;" src="http://upload.wikimedia.org/wikipedia/commons/thumb/b/bf/Canis_mesomelas.jpg/250px-Canis_mesomelas.jpg" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;You might think that JAQL and &lt;a href="http://tsusiatsoftware.net/jeql/main.html"&gt;JEQL&lt;/a&gt; were separated at birth, but they actually have no genetic material in common.  But it's interesting to see the J*QL acronym space being rapidly populated.  The best two vowels are now gone - who's going to be next to pile in?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2420860529344694449-5330033257574865939?l=lin-ear-th-inking.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lin-ear-th-inking.blogspot.com/feeds/5330033257574865939/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2420860529344694449&amp;postID=5330033257574865939&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2420860529344694449/posts/default/5330033257574865939'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2420860529344694449/posts/default/5330033257574865939'/><link rel='alternate' type='text/html' href='http://lin-ear-th-inking.blogspot.com/2008/05/jaql-pegs-cool-technology-mashup-meter.html' title='JAQL pegs the cool technology mashup meter'/><author><name>Dr JTS</name><uri>http://www.blogger.com/profile/02383381220154739793</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2420860529344694449.post-6481928054571669273</id><published>2008-04-30T14:19:00.000-07:00</published><updated>2008-04-30T14:23:53.879-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='computation'/><category scheme='http://www.blogger.com/atom/ns#' term='software'/><title type='text'>Taxonomy of Software Bugs</title><content type='html'>This &lt;a href="http://en.wikipedia.org/wiki/Unusual_software_bug"&gt;software bug taxonomy&lt;/a&gt; is great!  Heisenbugs, Bohr Bugs, and the dreaded &lt;span style="font-weight: bold; font-style: italic;"&gt;Schroedinbugs&lt;/span&gt;....&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.uglybug.org/images07/bug61.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px;" src="http://www.uglybug.org/images07/bug61.jpg" alt="" border="0" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2420860529344694449-6481928054571669273?l=lin-ear-th-inking.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lin-ear-th-inking.blogspot.com/feeds/6481928054571669273/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2420860529344694449&amp;postID=6481928054571669273&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2420860529344694449/posts/default/6481928054571669273'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2420860529344694449/posts/default/6481928054571669273'/><link rel='alternate' type='text/html' href='http://lin-ear-th-inking.blogspot.com/2008/04/taxonomy-of-software-bugs.html' title='Taxonomy of Software Bugs'/><author><name>Dr JTS</name><uri>http://www.blogger.com/profile/02383381220154739793</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2420860529344694449.post-9108111096161199167</id><published>2008-04-29T16:01:00.000-07:00</published><updated>2008-04-29T16:17:08.934-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='computation'/><title type='text'>Ted Nedward  takes on the Tower of Babel</title><content type='html'>Here's another (as usual) fascinating, detailed, doesn't-this-guy-work-for-a-living post from Ted Nedward.  This one starts as a &lt;a href="http://blogs.tedneward.com/2008/04/29/Groovy+Or+JRuby.aspx"&gt;meta-critique of Groovy VS Ruby and morphs into an interesting summary of what the Tower Of Babel IT department is using this year&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Money quote:&lt;br /&gt;&lt;span style="font-style: italic;"&gt;&lt;br /&gt;I wish I could get back to [C++]for a project in the same way that guys fantasize about running into an old high school girlfriend on a business trip.&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;Personally, my reaction to my old C++ girlfriend would be "TG I didn't get hitched to this chick - she's &lt;span style="font-style: italic;"&gt;way &lt;/span&gt;too high-maintenance".  Although Ted says she's changed...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2420860529344694449-9108111096161199167?l=lin-ear-th-inking.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lin-ear-th-inking.blogspot.com/feeds/9108111096161199167/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2420860529344694449&amp;postID=9108111096161199167&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2420860529344694449/posts/default/9108111096161199167'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2420860529344694449/posts/default/9108111096161199167'/><link rel='alternate' type='text/html' href='http://lin-ear-th-inking.blogspot.com/2008/04/ted-nedward-takes-on-tower-of-babel.html' title='Ted Nedward  takes on the Tower of Babel'/><author><name>Dr JTS</name><uri>http://www.blogger.com/profile/02383381220154739793</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2420860529344694449.post-8568514812681442606</id><published>2008-04-20T22:31:00.000-07:00</published><updated>2008-04-20T22:35:37.985-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='microsoft'/><title type='text'>Microsoft's MVP's use...  Google?</title><content type='html'>An article about a &lt;a href="http://blog.seattletimes.nwsource.com/techtracks/2008/04/microsoft_ceo_steve_ballmer_spoke.html"&gt;candid presentation by Steve Ballmer&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;The XP-versus-Vista debacle just reinforces the core value of Open Software.  Current version tested, deployed, and working fine?  Then nobody can force you to upgrade...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2420860529344694449-8568514812681442606?l=lin-ear-th-inking.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lin-ear-th-inking.blogspot.com/feeds/8568514812681442606/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2420860529344694449&amp;postID=8568514812681442606&amp;isPopup=true' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2420860529344694449/posts/default/8568514812681442606'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2420860529344694449/posts/default/8568514812681442606'/><link rel='alternate' type='text/html' href='http://lin-ear-th-inking.blogspot.com/2008/04/microsofts-mvps-use-google.html' title='Microsoft&apos;s MVP&apos;s use...  Google?'/><author><name>Dr JTS</name><uri>http://www.blogger.com/profile/02383381220154739793</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2420860529344694449.post-4842012816462962387</id><published>2008-04-18T22:45:00.000-07:00</published><updated>2008-04-18T22:56:14.644-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='computation'/><title type='text'>Who's conspicuously absent from the PaaS fray?</title><content type='html'>Here's a hint: who was using the slogan "The Network is the Computer" 10 years ago?  And who was the first company to deliver a RIA technology?&lt;br /&gt;&lt;br /&gt;So why have they been MIA in the PaaS goldrush?&lt;br /&gt;&lt;br /&gt;Let's think about this another way.  What database are people most likely to run on their slice -o'Linux-in-the-cloud?  mySQL perhaps?  Which was just bought by...?&lt;br /&gt;&lt;a href="http://www.theregister.co.uk/2008/02/15/caroline_sun_amazon/"&gt;&lt;br /&gt;The Register has an article&lt;/a&gt; about a possible JavaOne announcement about how this situation might change (with a leaked slide presentation!  Fell off the back of an ftp packet, I guess..)&lt;br /&gt;&lt;br /&gt;(The weird thing is is that the presentation talks only about PostgreSQL.  An old file?  Or a different corporate camp?  Didn't get the memo maybe?)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2420860529344694449-4842012816462962387?l=lin-ear-th-inking.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lin-ear-th-inking.blogspot.com/feeds/4842012816462962387/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2420860529344694449&amp;postID=4842012816462962387&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2420860529344694449/posts/default/4842012816462962387'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2420860529344694449/posts/default/4842012816462962387'/><link rel='alternate' type='text/html' href='http://lin-ear-th-inking.blogspot.com/2008/04/whos-conspicuously-absent-from-paas.html' title='Who&apos;s conspicuously absent from the PaaS fray?'/><author><name>Dr JTS</name><uri>http://www.blogger.com/profile/02383381220154739793</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2420860529344694449.post-4482283533732092499</id><published>2008-04-18T11:22:00.000-07:00</published><updated>2008-04-18T14:09:29.096-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='geospatial'/><category scheme='http://www.blogger.com/atom/ns#' term='kml'/><title type='text'>KML Craziness</title><content type='html'>Why oh why did KML choose to specify colour values as &lt;del&gt;AGBR&lt;/del&gt; ABGR rather than RGBA?  Does anyone have a rational explanation for this anomaly?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2420860529344694449-4482283533732092499?l=lin-ear-th-inking.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lin-ear-th-inking.blogspot.com/feeds/4482283533732092499/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2420860529344694449&amp;postID=4482283533732092499&amp;isPopup=true' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2420860529344694449/posts/default/4482283533732092499'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2420860529344694449/posts/default/4482283533732092499'/><link rel='alternate' type='text/html' href='http://lin-ear-th-inking.blogspot.com/2008/04/kml-craziness.html' title='KML Craziness'/><author><name>Dr JTS</name><uri>http://www.blogger.com/profile/02383381220154739793</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2420860529344694449.post-6113141095810435748</id><published>2008-04-15T19:45:00.000-07:00</published><updated>2008-04-15T21:42:11.019-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='computation'/><category scheme='http://www.blogger.com/atom/ns#' term='web'/><title type='text'>Is that cloud on the horizon going to start raining applications?</title><content type='html'>&lt;a href="http://www.oreillynet.com/onjava/blog/2008/04/faster_that_youd_imagine_sales.html"&gt;Timothy O'Brien speculates&lt;/a&gt; that the transition to cloud-based computing is happening sooner than expected.  He's talking about the new integration between Salesforce.com (which is apparently the poster child for SaaS) and Google Apps (the poster child for desktop replacement by the Web).  And he generalizes this to include EC2, SimpleDB, and the "twenty or thirty other companies that are going to join the industry".&lt;br /&gt;&lt;br /&gt;He also warns &lt;a href="http://www.oreillynet.com/onjava/blog/2008/04/preparing_for_the_saaspaas_wav.html"&gt;here&lt;/a&gt; that this transition could transform the model for software development in ways uncomfortable for IT professionals.&lt;br /&gt;&lt;br /&gt;He could be right.  &lt;a href="http://en.wikipedia.org/wiki/Cloud_computing"&gt;Cloud computing&lt;/a&gt; does seem to be poised to finally provide the right platform to suck the juice out of corporate data centres.  The idea of &lt;span style="font-style: italic;"&gt;virtual &lt;span style="font-weight: bold;"&gt;everything&lt;/span&gt;&lt;/span&gt; certainly has an appeal (especially to someone like me who is basically a software guy).&lt;br /&gt;&lt;br /&gt;But questions occur...  Salesforce and Google seem like a perfect match - but what about the other companies that want a piece of this action?  Does it matter that you will have to commit everything to a given cloud platform?  And what happens if that platform goes away?  The more advantage you take of the cloud, the bigger the pain when it disappears.  And what about apps which are a bit more specific than CRM (which in my naive view seems like just a fancy Contacts list - and hence an obvious and easy thing to integrate with an office suite).&lt;br /&gt;&lt;br /&gt;Tim would probably call these kinds of questions "self-interested observations from one with the most to lose".  He mentions a Salesforce meeting where business types applaud a sign showing "Software" with a big red slash through it...  Well, maybe.  Last I noticed no-one has quite managed to automate generating code from requirements documents (let alone automating the generation of implementable requirments documents out of people's heads  8^).  So I would say it's more like "different software" than "no software".&lt;br /&gt;&lt;br /&gt;One thing's for sure.. there's going to be some gigantic platform turf wars going on up there in the stratosphere.&lt;br /&gt;&lt;br /&gt;(One big disappointment - it sounds like the Salesforce platform is based on their proprietary Apex language.  Ugh.  Just what the world needs - one more language to debate over.  At least Google App Engine picked a real language for their launch!)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2420860529344694449-6113141095810435748?l=lin-ear-th-inking.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lin-ear-th-inking.blogspot.com/feeds/6113141095810435748/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2420860529344694449&amp;postID=6113141095810435748&amp;isPopup=true' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2420860529344694449/posts/default/6113141095810435748'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2420860529344694449/posts/default/6113141095810435748'/><link rel='alternate' type='text/html' href='http://lin-ear-th-inking.blogspot.com/2008/04/is-that-cloud-on-horizon-going-to-start.html' title='Is that cloud on the horizon going to start raining applications?'/><author><name>Dr JTS</name><uri>http://www.blogger.com/profile/02383381220154739793</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2420860529344694449.post-1475999181932615785</id><published>2008-04-04T10:56:00.001-07:00</published><updated>2008-04-04T11:07:40.762-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='humour'/><title type='text'>Ontogeny recapitulates Phylogeny in the life of a programmer</title><content type='html'>(C'mon, admit it - you've always wanted to use that as the title of a blog post too...)&lt;br /&gt;&lt;br /&gt;&lt;a href="http://blog.cleverelephant.ca/2008/04/see.html"&gt;Paul's epiphany&lt;/a&gt; seems like the equivalent of &lt;a href="http://en.wikipedia.org/wiki/Recapitulation_theory"&gt;Ontogeny recapitulating Phylogeny&lt;/a&gt; in the evolution of a programmer.   "Hey, C has arrays! Hey, C arrays are really just syntactic sugar for pointer dereferencing!  Hey, I can index to anywhere in memory really easily!  Hey, I can store anywh...."&lt;br /&gt;&lt;br /&gt;SEGFAULT - CORE DUMPED&lt;br /&gt;&lt;br /&gt;Sh*t.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;&lt;several&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;"Hey, there's this new language called Java!  And it has arrays too!  Hey, if I index past the end of an array I get a nice error message telling me exactly where in my code the problem occurred! Hey, I think I can knock off work early and go to the pub!"&lt;br /&gt;&lt;br /&gt;8^)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2420860529344694449-1475999181932615785?l=lin-ear-th-inking.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lin-ear-th-inking.blogspot.com/feeds/1475999181932615785/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2420860529344694449&amp;postID=1475999181932615785&amp;isPopup=true' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2420860529344694449/posts/default/1475999181932615785'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2420860529344694449/posts/default/1475999181932615785'/><link rel='alternate' type='text/html' href='http://lin-ear-th-inking.blogspot.com/2008/04/ontogeny-recapitulates-phylogeny-in.html' title='Ontogeny recapitulates Phylogeny in the life of a programmer'/><author><name>Dr JTS</name><uri>http://www.blogger.com/profile/02383381220154739793</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2420860529344694449.post-8432045222795424715</id><published>2008-03-28T17:29:00.000-07:00</published><updated>2008-03-28T17:49:33.843-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='jts'/><title type='text'>JTS at the sharp end of many arrows</title><content type='html'>Miguel Montesinos and Jorge Sanz from the &lt;a href="http://www.gvsig.gva.es/"&gt;gvSIG&lt;/a&gt; project have made a nice &lt;a href="http://www.osgeo.org/files/tyler/images/siglibre_foss_sig_relacion.png"&gt;diagram showing the relationships between a bunch of GFOSS projects&lt;/a&gt;.   It' s nice to see JTS close to the centre of the diagram - although having so many arrows pointed at it makes me a little nervous!&lt;br /&gt;&lt;br /&gt;They show JTS having a dependency on Batik for some reason - that must be an error, there's no relationship between the two.  Or does Batik use JTS?&lt;br /&gt;&lt;br /&gt;It would have been nice to see a "parent-of" relationship between JTS and GEOS and NTS, since the latter two also form a key component of quite a few projects.  And I'm pretty sure MapGuide OS uses GEOS, as does OGR.&lt;br /&gt;&lt;br /&gt;But it's not surprising there's a few errors and omissions - it's a pretty complicated web of relationships.  And this is over only what - 8 years?  I wonder what the diagram will look like in another 8...&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.osgeo.org/files/tyler/images/siglibre_foss_sig_relacion.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px;" src="http://www.osgeo.org/files/tyler/images/siglibre_foss_sig_relacion.png" alt="" border="0" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2420860529344694449-8432045222795424715?l=lin-ear-th-inking.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lin-ear-th-inking.blogspot.com/feeds/8432045222795424715/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2420860529344694449&amp;postID=8432045222795424715&amp;isPopup=true' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2420860529344694449/posts/default/8432045222795424715'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2420860529344694449/posts/default/8432045222795424715'/><link rel='alternate' type='text/html' href='http://lin-ear-th-inking.blogspot.com/2008/03/jts-at-sharp-end-of-many-arrows.html' title='JTS at the sharp end of many arrows'/><author><name>Dr JTS</name><uri>http://www.blogger.com/profile/02383381220154739793</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2420860529344694449.post-1106782683539716999</id><published>2008-03-24T08:58:00.000-07:00</published><updated>2008-03-24T09:05:50.949-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='jts'/><category scheme='http://www.blogger.com/atom/ns#' term='geospatial'/><title type='text'>Time for JSTS?</title><content type='html'>Like a lot of stuff,  spatial functionality is moving out into the browser.  Signs of the times:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://docs.codehaus.org/display/MAP/Proj4js"&gt;proj4js&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://wiki.geojson.org/Main_Page"&gt;GeoJSON&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://viswaug.wordpress.com/2008/03/22/esri-dev-summit-2008-the-real-skinny/"&gt;This comment&lt;/a&gt;:  "&lt;span style="font-style: italic;"&gt;The DOJO client-side libraries provide support for performing some simple spatial operations like ‘intersection’ on the client-side.&lt;/span&gt;"  (Although I haven't been able to find this functionality in a quick browse of Dojo - can anyone confirm this?)&lt;/li&gt;&lt;/ul&gt;Seems like maybe the time is ripe for a port of &lt;a href="http://tsusiatsoftware.net/jts/main.html"&gt;JTS&lt;/a&gt; to JSTS - the Javascript Topology Suite. &lt;br /&gt;&lt;br /&gt;Take it away, someone - I'm too busy!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2420860529344694449-1106782683539716999?l=lin-ear-th-inking.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lin-ear-th-inking.blogspot.com/feeds/1106782683539716999/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2420860529344694449&amp;postID=1106782683539716999&amp;isPopup=true' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2420860529344694449/posts/default/1106782683539716999'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2420860529344694449/posts/default/1106782683539716999'/><link rel='alternate' type='text/html' href='http://lin-ear-th-inking.blogspot.com/2008/03/time-for-jsts.html' title='Time for JSTS?'/><author><name>Dr JTS</name><uri>http://www.blogger.com/profile/02383381220154739793</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2420860529344694449.post-6065443080727774557</id><published>2008-03-22T21:25:00.000-07:00</published><updated>2008-03-22T21:28:27.347-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='humour'/><title type='text'>Swimming taught by telephone</title><content type='html'>Ok, this is like popcorn...  you can't have just one.&lt;br /&gt;&lt;br /&gt;Just think - they had no idea that one day you would be able to simply download a learn-to-swim podcast and listen to it on your waterproof MP3 player...&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_q016kExGrVs/R-XcLXYyHuI/AAAAAAAAAG4/J_0I2vpnUZw/s1600-h/med_telephone_swimming.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 289px; height: 442px;" src="http://3.bp.blogspot.com/_q016kExGrVs/R-XcLXYyHuI/AAAAAAAAAG4/J_0I2vpnUZw/s400/med_telephone_swimming.jpg" alt="" id="BLOGGER_PHOTO_ID_5180789034174258914" border="0" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2420860529344694449-6065443080727774557?l=lin-ear-th-inking.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lin-ear-th-inking.blogspot.com/feeds/6065443080727774557/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2420860529344694449&amp;postID=6065443080727774557&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2420860529344694449/posts/default/6065443080727774557'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2420860529344694449/posts/default/6065443080727774557'/><link rel='alternate' type='text/html' href='http://lin-ear-th-inking.blogspot.com/2008/03/swimming-taught-by-telephone.html' title='Swimming taught by telephone'/><author><name>Dr JTS</name><uri>http://www.blogger.com/profile/02383381220154739793</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_q016kExGrVs/R-XcLXYyHuI/AAAAAAAAAG4/J_0I2vpnUZw/s72-c/med_telephone_swimming.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2420860529344694449.post-724395951328766097</id><published>2008-03-22T21:16:00.000-07:00</published><updated>2008-03-22T21:25:27.095-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='humour'/><category scheme='http://www.blogger.com/atom/ns#' term='computation'/><title type='text'>Has Automation affected YOUR job?</title><content type='html'>Can't resist posting this (from &lt;a href="http://blog.modernmechanix.com/"&gt;Modern Mechanix&lt;/a&gt;).&lt;br /&gt;&lt;br /&gt;I'm definitely enjoying not having grimy hands, but what happened to the shorter work week and more leisure time?&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_q016kExGrVs/R-Xav3YyHtI/AAAAAAAAAGw/78o3vobZ1uY/s1600-h/automation_affect_job.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 477px; height: 707px;" src="http://1.bp.blogspot.com/_q016kExGrVs/R-Xav3YyHtI/AAAAAAAAAGw/78o3vobZ1uY/s400/automation_affect_job.png" alt="" id="BLOGGER_PHOTO_ID_5180787462216228562" border="0" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2420860529344694449-724395951328766097?l=lin-ear-th-inking.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lin-ear-th-inking.blogspot.com/feeds/724395951328766097/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2420860529344694449&amp;postID=724395951328766097&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2420860529344694449/posts/default/724395951328766097'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2420860529344694449/posts/default/724395951328766097'/><link rel='alternate' type='text/html' href='http://lin-ear-th-inking.blogspot.com/2008/03/has-automation-affected-your-job.html' title='Has Automation affected YOUR job?'/><author><name>Dr JTS</name><uri>http://www.blogger.com/profile/02383381220154739793</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_q016kExGrVs/R-Xav3YyHtI/AAAAAAAAAGw/78o3vobZ1uY/s72-c/automation_affect_job.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2420860529344694449.post-3107474058800524199</id><published>2008-03-18T23:01:00.000-07:00</published><updated>2008-03-18T23:02:55.790-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='geospatial'/><title type='text'>World Population Cartograms</title><content type='html'>The Daily Green has some &lt;a href="http://www.thedailygreen.com/environmental-news/latest/world-population-cartograms-47012201"&gt;cartograms &lt;/a&gt;showing the change in distribution of world population since 1900.&lt;br /&gt;&lt;br /&gt;But there's another aspect to this that the original images don't show - the increase in the &lt;span style="font-weight: bold;"&gt;absolute number&lt;/span&gt; of people in the world.  So here's the images with that factor applied:&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_q016kExGrVs/R-CqYQ4wOZI/AAAAAAAAAGQ/P2ZX9y2Jm8Y/s1600-h/pop1900.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://4.bp.blogspot.com/_q016kExGrVs/R-CqYQ4wOZI/AAAAAAAAAGQ/P2ZX9y2Jm8Y/s400/pop1900.png" alt="" id="BLOGGER_PHOTO_ID_5179326905302661522" border="0" /&gt;&lt;/a&gt;&lt;span style="font-weight: bold;"&gt;1900 - 1.65 B&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_q016kExGrVs/R-Cqdg4wOaI/AAAAAAAAAGY/cL2QqIxswU0/s1600-h/pop2007.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 490px; height: 241px;" src="http://1.bp.blogspot.com/_q016kExGrVs/R-Cqdg4wOaI/AAAAAAAAAGY/cL2QqIxswU0/s400/pop2007.png" alt="" id="BLOGGER_PHOTO_ID_5179326995496974754" border="0" /&gt;&lt;/a&gt;&lt;span style="font-weight: bold;"&gt;2007 - 6.64 B&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_q016kExGrVs/R-Cqig4wObI/AAAAAAAAAGg/ki_iGovosKA/s1600-h/pop2050.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 642px; height: 315px;" src="http://1.bp.blogspot.com/_q016kExGrVs/R-Cqig4wObI/AAAAAAAAAGg/ki_iGovosKA/s400/pop2050.png" alt="" id="BLOGGER_PHOTO_ID_5179327081396320690" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;span style="font-weight: bold;"&gt;2050 - ~ 9 B&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2420860529344694449-3107474058800524199?l=lin-ear-th-inking.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lin-ear-th-inking.blogspot.com/feeds/3107474058800524199/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2420860529344694449&amp;postID=3107474058800524199&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2420860529344694449/posts/default/3107474058800524199'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2420860529344694449/posts/default/3107474058800524199'/><link rel='alternate' type='text/html' href='http://lin-ear-th-inking.blogspot.com/2008/03/world-population-cartograms.html' title='World Population Cartograms'/><author><name>Dr JTS</name><uri>http://www.blogger.com/profile/02383381220154739793</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_q016kExGrVs/R-CqYQ4wOZI/AAAAAAAAAGQ/P2ZX9y2Jm8Y/s72-c/pop1900.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2420860529344694449.post-1168094996498550498</id><published>2008-03-18T15:49:00.000-07:00</published><updated>2008-03-18T17:46:25.111-07:00</updated><title type='text'>A good kick in the pants for the GeoWeb?</title><content type='html'>Reading the &lt;a href="http://feeds.spatiallyadjusted.com/%7Er/SpatiallyAdjusted/%7E3/253702437/"&gt;blog&lt;/a&gt; &lt;a href="http://blog.davebouwman.net/2008/03/18/JumpingIntoTheKoolaidDevSummitPlenaryNotes.aspx"&gt;posts&lt;/a&gt; &lt;a href="http://myesri.blogspot.com/2008/03/dev-summit-plenary-part-2.html"&gt;that&lt;/a&gt; &lt;a href="http://feeds.spatiallyadjusted.com/%7Er/SpatiallyAdjusted/%7E3/253885286/"&gt;are&lt;/a&gt; starting to come out about the ESRI Dev Summit, I'm struck by a few things:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;REST! KML! JSON! AJAX! Dojo!  I haven't seen this many tech buzzwords out of ESRI since ArcGIS on Windows was released with COM! VBA! DLLs!  Hopefully some of these have more legs&lt;/li&gt;&lt;li&gt;Clearly ESRI is embracing the GeoWeb concept with a vengeance.  It will be very interesting to see how these new modes of access to GIS functionality plays out.  To what extent will the marriage of web services and GIS processing be an effective model?&lt;/li&gt;&lt;li&gt;They also seem to be accepting Google Maps/Earth and MS VE as valid spatial delivery platforms.  It sounds like there is some pretty full-featured capabilities to deliver data to these platforms.  It's going to be interesting to see the uptake on these capabilities, and whether ESRI's heart is really in making these platforms perform to their full capability.  No doubt there will be some fascinating business implications as well that get played out over time...&lt;/li&gt;&lt;li&gt;I'll be interested to see whether ESRI's "legitimizing" spatial-via-web-service will have any effect on the OGC W*S world.  It seems to me that while OGC was early out of the gate with a web service suite, they seem to be wallowing in the doldrums as far as making the specs effective for real-world use.  The OGC W*S suite was quickly adopted by the OSS world, and for good reason - open source tends to be very faithful to open standards, since a design goal is usually to have a high degree of interoperability.  Not to mention that it's easier to code to a standard which has already done a lot of the hard thinking.  But - the cool kids are losing interest in the crusty old W*S interfaces, since they're not keeping up with the rapid emergence of exciting new web paradigms.&lt;/li&gt;&lt;li&gt;Ultimately ESRI's trailblazing will be a good thing for OSS technologies.  Nothing like having a working system to inspect, copy, and improve.  And the more open, standard technologies that system uses, the easier it is to steal - um, learn from.  Also, as the GIS stack gets more open interface technologies accepted, it becomes easier to plug in heterogeneous components into that stack.&lt;/li&gt;&lt;/ul&gt;Now to start looking into that ArcGIS Server REST API...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2420860529344694449-1168094996498550498?l=lin-ear-th-inking.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lin-ear-th-inking.blogspot.com/feeds/1168094996498550498/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2420860529344694449&amp;postID=1168094996498550498&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2420860529344694449/posts/default/1168094996498550498'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2420860529344694449/posts/default/1168094996498550498'/><link rel='alternate' type='text/html' href='http://lin-ear-th-inking.blogspot.com/2008/03/good-kick-in-pants-for-geoweb.html' title='A good kick in the pants for the GeoWeb?'/><author><name>Dr JTS</name><uri>http://www.blogger.com/profile/02383381220154739793</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2420860529344694449.post-2699562010322089029</id><published>2008-03-17T09:59:00.001-07:00</published><updated>2008-03-17T10:45:25.125-07:00</updated><title type='text'>Tired of those boring old conformal map projections? Make your own!</title><content type='html'>&lt;a href="http://www.flexprojector.com/"&gt;Flex Projector&lt;/a&gt; is an interesting tool that allows you to make a custom map projection by adjusting the location and shape of meridians and parallels.&lt;br /&gt;&lt;br /&gt;Here's a nice projection I defined to maximise the area of tropical vacation spots  8^)&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_q016kExGrVs/R96tIw4wOYI/AAAAAAAAAGI/6jb8qwBazIQ/s1600-h/Projection-tropical-vacation.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://4.bp.blogspot.com/_q016kExGrVs/R96tIw4wOYI/AAAAAAAAAGI/6jb8qwBazIQ/s400/Projection-tropical-vacation.png" alt="" id="BLOGGER_PHOTO_ID_5178766987596151170" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;The downside of this app is that as far as I can tell, there's no way to export a projection once it's defined.   Instead, you have to use the Flex Projector application to reproject datasets.   So it doesn't look like you can make your own custom projection for use in say, PostGIS or OGR.&lt;br /&gt;&lt;br /&gt;I guess it might be asking a little much for the app to spit out some custom Proj4 C code with an associated EPSG code and CRS WKT...  But hey, it's an open source app, so come on someone - how about it?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2420860529344694449-2699562010322089029?l=lin-ear-th-inking.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lin-ear-th-inking.blogspot.com/feeds/2699562010322089029/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2420860529344694449&amp;postID=2699562010322089029&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2420860529344694449/posts/default/2699562010322089029'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2420860529344694449/posts/default/2699562010322089029'/><link rel='alternate' type='text/html' href='http://lin-ear-th-inking.blogspot.com/2008/03/tired-of-those-boring-old-conformal-map.html' title='Tired of those boring old conformal map projections? Make your own!'/><author><name>Dr JTS</name><uri>http://www.blogger.com/profile/02383381220154739793</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_q016kExGrVs/R96tIw4wOYI/AAAAAAAAAGI/6jb8qwBazIQ/s72-c/Projection-tropical-vacation.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2420860529344694449.post-3947467152393216529</id><published>2008-03-14T08:55:00.000-07:00</published><updated>2008-03-14T08:59:55.154-07:00</updated><title type='text'>Quote of the (Pi) Day</title><content type='html'>&lt;span style="font-style: italic;"&gt; Sir, I send a rhyme excelling&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt; In sacred truth and rigid spelling&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt; Numerical sprites elucidate&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt; For me the lexicon's full weight&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Maybe not the greatest lyric poem - but list the number of letters in each word.  (If you prefer a shortcut &lt;a href="http://www.joyofpi.com/pi.html"&gt;this site&lt;/a&gt; has them already listed - along with 9, 979 more)&lt;br /&gt;&lt;br /&gt;And notice the value of the date as MM.DD...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2420860529344694449-3947467152393216529?l=lin-ear-th-inking.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lin-ear-th-inking.blogspot.com/feeds/3947467152393216529/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2420860529344694449&amp;postID=3947467152393216529&amp;isPopup=true' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2420860529344694449/posts/default/3947467152393216529'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2420860529344694449/posts/default/3947467152393216529'/><link rel='alternate' type='text/html' href='http://lin-ear-th-inking.blogspot.com/2008/03/quote-of-pi-day.html' title='Quote of the (Pi) Day'/><author><name>Dr JTS</name><uri>http://www.blogger.com/profile/02383381220154739793</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2420860529344694449.post-6476000055655276358</id><published>2008-03-03T21:26:00.000-08:00</published><updated>2008-03-03T21:43:35.648-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='postgis'/><category scheme='http://www.blogger.com/atom/ns#' term='computational geometry'/><category scheme='http://www.blogger.com/atom/ns#' term='geospatial'/><title type='text'>Branch-and-Bound algorithms for Nearest Neighbour queries</title><content type='html'>&lt;a href="http://citeseer.ist.psu.edu/roussopoulos95nearest.html"&gt;This paper by Roussopoulos et al&lt;/a&gt; is a fine expositions of how to use a &lt;a href="http://en.wikipedia.org/wiki/Branch_and_bound"&gt;Branch-and-Bound algorithm&lt;/a&gt; in conjunction with an &lt;a href="http://en.wikipedia.org/wiki/R-tree"&gt;R-tree index&lt;/a&gt; to efficiently perform &lt;a href="http://en.wikipedia.org/wiki/Nearest_neighbor_search"&gt;Nearest-Neighbour queries&lt;/a&gt; on a spatial database.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_q016kExGrVs/R8zhQoARyrI/AAAAAAAAAGA/LPXK3vqIQIE/s1600-h/branch-and-bound-NN.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://2.bp.blogspot.com/_q016kExGrVs/R8zhQoARyrI/AAAAAAAAAGA/LPXK3vqIQIE/s400/branch-and-bound-NN.png" alt="" id="BLOGGER_PHOTO_ID_5173757747674598066" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Nearest-neighbour is a pretty standard query for spatial database.  Oracle Spatial offers this capability natively.  It would be great if PostGIS did too.  If the GIST index API offers appropriate access methods, it seems like it might not be too hard to implement the Roussopoulos algorithm.  (&lt;span style="font-style: italic;"&gt;How about it, Paul, now that you're dedicating your life to becoming a PostGIS coding wizard...&lt;/span&gt;)&lt;br /&gt;&lt;br /&gt;I'm also thinking that this approach might produce an efficient algorithm for computing distance between Geometrys for JTS.  It's always bugged me that the JTS distance algorithm is just plain ol' O(N^2) brute-force.  It seems like there has to be a better way, but as usual there seems to be precious little prior art out there in web-land.  This should also work well in the "Prepared" paradigm, which means that it will provide an efficient implementation for PostGIS as well.  Soon, hopefully...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2420860529344694449-6476000055655276358?l=lin-ear-th-inking.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lin-ear-th-inking.blogspot.com/feeds/6476000055655276358/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2420860529344694449&amp;postID=6476000055655276358&amp;isPopup=true' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2420860529344694449/posts/default/6476000055655276358'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2420860529344694449/posts/default/6476000055655276358'/><link rel='alternate' type='text/html' href='http://lin-ear-th-inking.blogspot.com/2008/03/branch-and-bound-algorithms-for-nearest.html' title='Branch-and-Bound algorithms for Nearest Neighbour queries'/><author><name>Dr JTS</name><uri>http://www.blogger.com/profile/02383381220154739793</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_q016kExGrVs/R8zhQoARyrI/AAAAAAAAAGA/LPXK3vqIQIE/s72-c/branch-and-bound-NN.png' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2420860529344694449.post-7577759031412377640</id><published>2008-02-17T08:35:00.000-08:00</published><updated>2008-02-17T08:52:31.296-08:00</updated><title type='text'>The Four Programmers</title><content type='html'>Here's an &lt;a href="http://undefined.com/ia/2006/11/07/the-four-programmers"&gt;amusing adaptation&lt;/a&gt; of Monty Python's Four Yorkshiremen sketch...&lt;br /&gt;&lt;br /&gt;I feel increasingly like this myself (more so now that I'm in a company where I am the oldest employee)...&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;When I started coding we had to type out our programs on  punchcards.  If you made one typo you had to retype the entire card, so to avoid mistakes we wrote out our code on paper pads with 80-column grids.  You had to stand in line to submit your card stack to the guy running the card reader, and then pick up your output once it had been separated and filed by some other guy.  And if you had a syntax error - back to the cardpunch to do it all over again!&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;We thought we'd died and gone to heaven when we got online accounts and were allowed to use a hardcopy DecWriter terminal.  It even had an APL character set (don't forget to change the charset when you switched back to FORTRAN).  This was better - we could "erase" (actually just strikeout) and change mistakes on the line.  But forget about printing out your entire program - at 300 baud this could take many minutes, which was all chewing up your connect time allocation.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;But we had it lucky..  I worked with a guy who started out coding accounting routines for a magnetic drum-based system in the early 60's.  A big chunk of their time was spent reordering the individual instructions around the drum to reduce read latency.  Fun stuff!&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;And he was lucky compared to Don Booth, who was at the oceanographic research centre where I worked during my undergrad days.  He was one of the pioneers of computing in Britain.  All they had for storage was a 1000-word mercury delay tube...  and no doubt they spent their coding time plugging wires and changing tubes.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;But you try and tell kids with their touch-sensitive palmtops that these days, and they won't believe you...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2420860529344694449-7577759031412377640?l=lin-ear-th-inking.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lin-ear-th-inking.blogspot.com/feeds/7577759031412377640/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2420860529344694449&amp;postID=7577759031412377640&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2420860529344694449/posts/default/7577759031412377640'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2420860529344694449/posts/default/7577759031412377640'/><link rel='alternate' type='text/html' href='http://lin-ear-th-inking.blogspot.com/2008/02/four-programmers.html' title='The Four Programmers'/><author><name>Dr JTS</name><uri>http://www.blogger.com/profile/02383381220154739793</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2420860529344694449.post-7416491851635372952</id><published>2008-01-30T19:59:00.000-08:00</published><updated>2008-01-30T20:14:50.793-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='computation'/><category scheme='http://www.blogger.com/atom/ns#' term='database'/><title type='text'>The End of an Architectural Era?</title><content type='html'>Stonebraker et al have an &lt;a href="http://www.mit.edu/%7Edna/vldb07hstore.pdf"&gt;interesting paper&lt;/a&gt; pointing out the &lt;span style="font-weight: bold;"&gt;antiquity &lt;/span&gt;and consequent &lt;span style="font-weight: bold;"&gt;limitations&lt;/span&gt; of the classic relational database architecture in today's world of massive disk/cycles/core.&lt;br /&gt;&lt;br /&gt;If they are correct (and in spite of the recent &lt;a href="http://bitworking.org/news/288/Stonebraker-on-MapReduce"&gt;MapReduce blunder&lt;/a&gt; Stonebraker has made a lot of &lt;a href="http://www.postgresql.org/"&gt;great calls&lt;/a&gt; in the DB world), the world of data management is going to get &lt;span style="font-weight: bold;"&gt;awfully interesting&lt;/span&gt; in the coming years.  The DBA's &amp;amp; DA's of this world have been living a relatively comfortable existence  compared to those who are wandering across the stormy badlands of the middle tier.  But Stonebraker postulates at least 5 radically variant database architectures to address specific use cases of data management.  This would seem to lead to a much more complex world for data architects.  But maybe a windfall for the consultants who find their niche?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2420860529344694449-7416491851635372952?l=lin-ear-th-inking.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lin-ear-th-inking.blogspot.com/feeds/7416491851635372952/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2420860529344694449&amp;postID=7416491851635372952&amp;isPopup=true' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2420860529344694449/posts/default/7416491851635372952'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2420860529344694449/posts/default/7416491851635372952'/><link rel='alternate' type='text/html' href='http://lin-ear-th-inking.blogspot.com/2008/01/end-of-architectural-era.html' title='The End of an Architectural Era?'/><author><name>Dr JTS</name><uri>http://www.blogger.com/profile/02383381220154739793</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2420860529344694449.post-1506039633778889077</id><published>2008-01-20T21:48:00.000-08:00</published><updated>2008-01-20T22:42:35.496-08:00</updated><title type='text'>Quote of the Day</title><content type='html'>&lt;a href="http://the.modelprogrammer.com/?n=Main.RandomOpinions"&gt;Java - learn once, write anywhere&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;p style="font-style: italic;"&gt;&lt;/p&gt;&lt;span style="font-style: italic;"&gt;"From my personal experience, that is quite true. I started programming in Java in 1997, and since then I have built web applications, database applications, mobile applications for Palm and Pocket PC, an application server for CTI applications, CORBA-based distributed applications, network management applications, server-side business components for application servers, fat-client business applications, an IDE, a Rich Client Platform, a modeling tool among other kinds of software. All that across different operating systems and using similar products by different vendors. &lt;br /&gt;&lt;br /&gt;Of course I had to learn something new for each kind of "application style", but the programming language and core class library were always there for me. That is a huge thing. Before Java, it was really hard to move from one domain to another, or even move from vendor to vendor. Sun has my eternal gratitude for bringing some sanity to the software development industry." &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;- Rafael Chavez&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2420860529344694449-1506039633778889077?l=lin-ear-th-inking.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lin-ear-th-inking.blogspot.com/feeds/1506039633778889077/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2420860529344694449&amp;postID=1506039633778889077&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2420860529344694449/posts/default/1506039633778889077'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2420860529344694449/posts/default/1506039633778889077'/><link rel='alternate' type='text/html' href='http://lin-ear-th-inking.blogspot.com/2008/01/quote-of-day.html' title='Quote of the Day'/><author><name>Dr JTS</name><uri>http://www.blogger.com/profile/02383381220154739793</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2420860529344694449.post-1715851994326150392</id><published>2008-01-20T21:00:00.000-08:00</published><updated>2008-01-20T21:25:23.959-08:00</updated><title type='text'>The Paradoxically Poor Power of Visual Programming</title><content type='html'>I've just been reading about &lt;a href="http://abstratt.com/blog/category/textuml-toolkit/"&gt;TextUML&lt;/a&gt;, which is a language and IDE for textually defining UML diagrams by a start-up company called &lt;a href="http://abstratt.com/"&gt;abstratttechnologies&lt;/a&gt;. &lt;br /&gt;&lt;br /&gt;This seems like both a stroke of brilliance and painfully obvious.  It makes me wonder why UML isn't already defined in terms of a serializable language.  The big advantage of this I think would be the ability to have a clearly defined semantics.  In the past when reading about UML I've been quite frustrated  by an apparent lack of rigour in the definition of the various UML concepts and diagrams.  It's always seemed to me that a metalanguage like UML  is &lt;span style="font-style: italic;"&gt;more &lt;/span&gt;in need of fully-defined semantics than application languages.  Most (all?) application languages after all are executable, which gives provides a final authority for the meaning of a program written in them - run it and see what happens.  AFAIK UML isn't really (or not conveniently) executable in the same way. &lt;br /&gt;&lt;br /&gt;Which brings me to the paradox promised in the title of this post.  One of the claims for TextUML is that it is easier to write and express complex models in than a purely diagram-based UML tool.  I can easily believe this - developing a complex model by diagrams seems cumbersome and limited compared to writing a textual description.  And I think this generalizes to the concept of visual programming in general.  We've had easy access to powerful graphics capabilities for over 20 years now, culminating in today's basically unlimited in graphical capabilities.  In spite of this, text-base programming still rules the roost when it comes to expressiveness, flexibility and speed. &lt;br /&gt;&lt;br /&gt;So the paradox is: why is a 1-dimensional representation more powerful than a 2-dimensional representation?  To put this another way, why does a 1D representation seem less "flat" than a 2D representation?&lt;br /&gt;&lt;br /&gt;For further study: would the same apply to a 3D representation?  Or would a move to 3D jump out of some sort of planar well, and end up being more expressive than 1D? &lt;br /&gt;&lt;br /&gt;By the way, abstratt is right here in l'il ol' Victoria, and the lead designer (and CEO) &lt;a href="http://the.modelprogrammer.com/"&gt;Rafael Chavez&lt;/a&gt; is giving a talk at &lt;a href="http://www.mosabuam.com/modules.php?op=modload&amp;amp;name=News&amp;amp;file=index&amp;amp;catid=&amp;amp;topic=9"&gt;VicJUG&lt;/a&gt; in March.  I'm definitely going to attend - I suspect he may have an interesting take on this issue.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2420860529344694449-1715851994326150392?l=lin-ear-th-inking.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lin-ear-th-inking.blogspot.com/feeds/1715851994326150392/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2420860529344694449&amp;postID=1715851994326150392&amp;isPopup=true' title='7 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2420860529344694449/posts/default/1715851994326150392'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2420860529344694449/posts/default/1715851994326150392'/><link rel='alternate' type='text/html' href='http://lin-ear-th-inking.blogspot.com/2008/01/paradoxically-poor-power-of-visual.html' title='The Paradoxically Poor Power of Visual Programming'/><author><name>Dr JTS</name><uri>http://www.blogger.com/profile/02383381220154739793</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>7</thr:total></entry></feed>
