<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss xmlns:atom="http://www.w3.org/2005/Atom" xmlns:openSearch="http://a9.com/-/spec/opensearch/1.1/" xmlns:georss="http://www.georss.org/georss" xmlns:gd="http://schemas.google.com/g/2005" xmlns:thr="http://purl.org/syndication/thread/1.0" xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0"><channel><atom:id>tag:blogger.com,1999:blog-6195961493286457645</atom:id><lastBuildDate>Sat, 03 Dec 2011 05:26:54 +0000</lastBuildDate><category>GIS</category><category>Safe FME</category><category>Land Information New Zealand</category><category>Mapping</category><category>SQL</category><category>Encom Technology</category><category>MID</category><category>WLD</category><category>MapBasic</category><category>Exponare</category><category>Christams</category><category>WKT</category><category>MapInfo</category><category>ArcSDE</category><category>SpatialWare</category><category>open source</category><category>measure</category><category>mbCoder</category><category>R-Tree</category><category>Web</category><category>DXF</category><category>PB MapInfo</category><category>FME</category><category>OLE</category><category>Delphi</category><category>NZ</category><category>Corporate GIS Consultants</category><category>OpenLayers</category><category>Autodesk</category><category>NZGO</category><category>Pitney Bowes</category><category>CubeWerx</category><category>QGIS</category><category>CAD</category><category>MS SQL Server</category><category>PHPEdit</category><category>Christmas</category><category>World Files</category><category>DLL</category><category>policy</category><category>Tips</category><category>Shape Files</category><category>MapCatalog</category><category>DGN</category><category>GeoPDF</category><category>Encom</category><category>IDC</category><category>Competition</category><category>Safe Software</category><category>Accela AMS</category><category>Firefox</category><category>PostgreSQL</category><category>Shape</category><category>LINZ</category><category>Eclipse</category><category>Bentley Map</category><category>Location Intelligence</category><category>MicroStation</category><category>statistics</category><category>PBBI</category><category>LI</category><category>JavaScript</category><category>MapInfo SpatialWare</category><category>MapInfo Professional</category><category>CRS</category><category>DBMS</category><category>.NET</category><category>Bentley Water</category><category>Aptana Studio</category><category>shp2sdo</category><category>Google Maps</category><category>Microsoft</category><category>support</category><category>NZTopo50</category><category>SSSI</category><category>New Year</category><category>SQL Server</category><category>New Zealand</category><category>E00</category><category>Oracle</category><category>Business Intelligence</category><category>ESRI</category><category>Translator</category><category>OGC</category><category>Government</category><category>sp_spatial_query</category><category>GRASS</category><category>GeoTIFF</category><category>Ian Tidy</category><category>Index</category><category>TFW</category><category>MS4W</category><category>Conference</category><category>MapData Sciences</category><category>Accela Automation</category><category>MapServer</category><category>Notepad++</category><category>Core Record System</category><category>canvas</category><category>Universal</category><category>ST_Spatial</category><category>UMN MapServer</category><category>ESRI ArcGIS</category><category>Windows 7</category><category>Geospatial Office</category><category>OSGEO</category><category>PostGIS</category><category>Feature Nodes</category><category>GITA</category><category>SQL Server 2008</category><category>listgeo</category><category>MIF</category><category>TerraGo</category><category>Accela AA</category><category>FOSS4G</category><category>Map 3D</category><category>UltraEdit</category><category>Google</category><category>demographics</category><category>C#</category><category>PHP</category><category>Well Known Text</category><category>Sun</category><category>Universal Translator</category><category>TAB</category><category>Bentley Systems</category><category>BI</category><category>EasyLoader</category><category>MapInfo Exponare</category><category>ODBC</category><category>Katmai</category><category>Ubuntu</category><category>Mash-up</category><category>Bentley</category><title>Ramblings of Ian Tidy</title><description>Ian Tidy is a spatial analyst and developer. Ian has experience with proprietry solutions from PB MapInfo, ESRI, and Bentley Systems and open-source solutions from UMN MapServer, Quantum GIS, and GRASS.  Along with the spatial software, Ian also supports both proprietry and opensource database management systems (DBMS) including Microsoft SQL Server, PostgreSQL, and MySQL.</description><link>http://iantidy.blogspot.com/</link><managingEditor>noreply@blogger.com (Ian Tidy)</managingEditor><generator>Blogger</generator><openSearch:totalResults>53</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://feeds.feedburner.com/iantidy" /><feedburner:info uri="iantidy" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><geo:lat>-39.51009</geo:lat><geo:long>176.91057</geo:long><feedburner:emailServiceId>iantidy</feedburner:emailServiceId><feedburner:feedburnerHostname>http://feedburner.google.com</feedburner:feedburnerHostname><item><guid isPermaLink="false">tag:blogger.com,1999:blog-6195961493286457645.post-1625131064915936836</guid><pubDate>Sat, 03 Dec 2011 04:45:00 +0000</pubDate><atom:updated>2011-12-03T18:17:04.105+13:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Accela AA</category><category domain="http://www.blogger.com/atom/ns#">Oracle</category><category domain="http://www.blogger.com/atom/ns#">Feature Nodes</category><category domain="http://www.blogger.com/atom/ns#">Bentley Water</category><category domain="http://www.blogger.com/atom/ns#">Accela Automation</category><category domain="http://www.blogger.com/atom/ns#">Accela AMS</category><title>Oracle Start and End Nodes</title><description>Over the last few months, I have been working on an implementation which integrates Accela Automation (Asset Management Module) with Bentley Water and uses an Oracle database at the backend.&amp;nbsp; Bentley Water is used to maintain the data within Accela.&lt;br /&gt;
As part of this process, I needed to find a method of converting our existing water network data to fit the Bentley schema.&amp;nbsp; As part of this process, I had to find the start and end nodes of each feature and find which other features connected at the same point.&amp;nbsp; And this all needed to happen at the Oracle database level.&lt;br /&gt;
The first thing I needed to find was the start and end nodes of a feature, this was straight forward enough with the following SQL Statement.
&lt;br /&gt;
&lt;pre style="background: none repeat scroll 0% 0% rgb(240, 240, 240); border: 1px dashed rgb(204, 204, 204); color: black; font-family: arial; font-size: 12px; height: auto; line-height: 20px; overflow: auto; padding: 0px; text-align: left; width: 99%;"&gt;&lt;code style="color: black; word-wrap: normal;"&gt;
SELECT ROUND(t.X, 3), ROUND(t.Y, 3), a.xfm_id, t.id from w_main a, TABLE(SDO_UTIL.GETVERTICES(a.ogc_geometry)) t WHERE (a.ogc_geometry IS NOT NULL) AND ((t.id = 1) OR (t.id = SDO_UTIL.GETNUMVERTICES(a.ogc_geometry))) ORDER BY a.xfm_id, t.id;
&lt;/code&gt;&lt;/pre&gt;
&lt;br /&gt;
This lead me to build a script which allowed me to build a table of unique nodes, assign an ID to them and then update the pipe feature with the ID.&lt;br /&gt;
&lt;br /&gt;
&lt;pre style="background: none repeat scroll 0% 0% rgb(240, 240, 240); border: 1px dashed rgb(204, 204, 204); color: black; font-family: arial; font-size: 12px; height: auto; line-height: 20px; overflow: auto; padding: 0px; text-align: left; width: 99%;"&gt;&lt;code style="color: black; word-wrap: normal;"&gt;
-- Build Node Table
DROP TABLE buis.w_main_nodes CASCADE CONSTRAINTS;
COMMIT;

CREATE TABLE w_main_nodes (
  ptsX number(18,6),
  ptsY number(18,6),
  xfm_id varchar2(36),
  net_id varchar2(36),
  pipe_count number,
  point_table varchar2(36),
  ogc_geometry mdsys.sdo_geometry
  );
COMMIT;

ALTER TABLE w_main_nodes ADD CONSTRAINT PK_W_MAIN_NODES PRIMARY KEY (xfm_id);
COMMIT;

-- Update SDO_GEOM_METADATA
DELETE FROM user_sdo_geom_metadata WHERE table_name = 'W_MAIN_NODES';
COMMIT;

INSERT INTO user_sdo_geom_metadata (table_name, column_name, diminfo, srid)
  values ('W_MAIN_NODES', 'OGC_GEOMETRY', MDSYS.SDO_DIM_ARRAY(MDSYS.SDO_DIM_ELEMENT('X',420965.412293313,420965.412293313,5E-8),MDSYS.SDO_DIM_ELEMENT('Y',821001.912941908,821001.912941908,5E-8)), 2108);
COMMIT;  

-- Build Spatial Index
CREATE INDEX buis.w_main_nodes_sidx ON buis.w_main_nodes(OGC_GEOMETRY) INDEXTYPE IS mdsys.spatial_index PARAMETERS ('layer_gtype=point');
COMMIT;

-- Process Main Start Nodes
select to_char(sysdate, 'Dy DD-Mon-YYYY HH24:MI:SS') as "Water Start Node Processing" from dual;
select pipe_count, count(xfm_id) from w_main_nodes group by pipe_count order by pipe_count;

SET serveroutput ON;
DECLARE
  ipipe number;
  fX number(18,6);
  fY number(18,6);
  sXFM varchar2(36);
  sNET varchar2(36);
  sMainID varchar2(36);
  vsql varchar2(4000);
  iFnd number;
  iCmt number;
  iNd number;
  ifCnt number;
  ifTot number;
  geoMainNode mdsys.sdo_geometry;

  CURSOR cMain IS
    SELECT ROUND(t.X, 3), ROUND(t.Y, 3), a.xfm_id, t.id from w_main a, TABLE(SDO_UTIL.GETVERTICES(a.ogc_geometry)) t WHERE (a.ogc_geometry IS NOT NULL) AND ((t.id = 1) OR (t.id = SDO_UTIL.GETNUMVERTICES(a.ogc_geometry))) ORDER BY a.xfm_id, t.id;

  CURSOR cNode IS
    SELECT /*+ ORDERED */ pipe_count, net_id FROM w_main_nodes WHERE sdo_geom.relate(ogc_geometry, 'ANYINTERACT', geoMainNode, 0.100) = 'TRUE';

BEGIN
  -- Setup Commit Counter
  iCmt := 0;
  ifCnt := 0;
  SELECT COUNT(xfm_id) INTO ifTot FROM buis.w_main;

  -- Open Main Loop
  OPEN cMain;
  LOOP
    FETCH cMain INTO fX, fY, sMainID, iNd;
    EXIT WHEN cMain%NOTFOUND;
    geoMainNode := MDSYS.SDO_GEOMETRY(2001, 2108, MDSYS.SDO_POINT_TYPE(fX, fY, null), null, null);

    -- Open Node Lookup
    iFnd := 0;
    OPEN cNode;
    LOOP
      FETCH cNode INTO ipipe, sNET;
      EXIT WHEN cNode%NOTFOUND;
      iFnd := 1;
      ipipe := ipipe + 1;
      -- Update Source with Net ID
      -- DBMS_OUTPUT.PUT_LINE('Update Source Feature :' || sMainID);

      -- Update Water ID
      IF iNd = 1 THEN
        vsql := 'UPDATE w_main SET water_startid = ''' || sNET || ''' WHERE (xfm_id = ''' || sMainID || ''')';
      ELSE
        vsql := 'UPDATE w_main SET water_endid = ''' || sNET || ''' WHERE (xfm_id = ''' || sMainID || ''')';
      END IF;
      EXECUTE IMMEDIATE vsql;

      -- Update Node Pipe Count
      vsql := 'UPDATE w_main_nodes SET pipe_count = ' || ipipe || ' WHERE (net_id = ''' || sNET || ''')';
      EXECUTE IMMEDIATE vsql;

    END LOOP;
    CLOSE cNode;

    -- If nothing found
    vsql := null;
    IF iFnd = 0 THEN
      -- Add Feature to Node Table
      -- DBMS_OUTPUT.PUT_LINE('Adding Point to Node Table for Main :' || sMainID);
      sXFM := sys_guid();
      sNET := sys_guid();
      sXFM := lower(sXFM);
      sNET := upper(sNET);

      -- Insert Node
      vsql := 'INSERT INTO w_main_nodes (ptsX, ptsY, xfm_id, net_id, pipe_count, ogc_geometry) VALUES ( ' || fX || ', ' || fY || ', ''' || sXFM || ''', ''' || sNET || ''', 1, MDSYS.SDO_GEOMETRY(2001, 2108, MDSYS.SDO_POINT_TYPE(' || fX || ', ' || fY || ', null), null, null))';
      -- DBMS_OUTPUT.PUT_LINE(vsql);
      EXECUTE IMMEDIATE vsql;
   
      -- Update Water ID
      IF iNd = 1 THEN
        vsql := 'UPDATE w_main SET water_startid = ''' || sNET || ''' WHERE (xfm_id = ''' || sMainID || ''')';
      ELSE
        vsql := 'UPDATE w_main SET water_endid = ''' || sNET || ''' WHERE (xfm_id = ''' || sMainID || ''')';
      END IF;
      EXECUTE IMMEDIATE vsql;

    END IF;

    -- Periodic Commit
    ifCnt := ifCnt + 1;
    IF iCmt &amp;gt; 99 THEN
       COMMIT;
       iCmt := 0;
       -- vsql := to_char(sysdate, 'Dy DD-Mon-YYYY HH24:MI:SS') || ' ' || round((((ifCnt / 2) / ifTot) * 100),0) || '% Complete';
       -- DBMS_OUTPUT.PUT_LINE(vsql); 
    ELSE
       iCmt := iCmt + 1;
    END IF;
  END LOOP;
  CLOSE cMain;

  -- Commit Anything Remaining
  COMMIT;

END;
/

-- Water Main Node Complete
select to_char(sysdate, 'Dy DD-Mon-YYYY HH24:MI:SS') as "Water Main Node Completed" from dual;
select pipe_count, count(xfm_id) from w_main_nodes group by pipe_count order by pipe_count;
&lt;/code&gt;&lt;/pre&gt;
&lt;br /&gt;
As you can see, its pretty simple and works really well.&amp;nbsp; The point table is then used to track what point features are assigned to which nodes.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6195961493286457645-1625131064915936836?l=iantidy.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/WNB6tN5mA-_kGpXRhsIFGX9jPxY/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/WNB6tN5mA-_kGpXRhsIFGX9jPxY/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/WNB6tN5mA-_kGpXRhsIFGX9jPxY/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/WNB6tN5mA-_kGpXRhsIFGX9jPxY/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/iantidy?a=--pzEpOl5xM:WBxGHo6mBAE:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/iantidy?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/iantidy?a=--pzEpOl5xM:WBxGHo6mBAE:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/iantidy?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/iantidy/~4/--pzEpOl5xM" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/iantidy/~3/--pzEpOl5xM/oracle-start-and-end-nodes.html</link><author>noreply@blogger.com (Ian Tidy)</author><thr:total>0</thr:total><feedburner:origLink>http://iantidy.blogspot.com/2011/12/oracle-start-and-end-nodes.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-6195961493286457645.post-7414659884604113209</guid><pubDate>Thu, 01 Dec 2011 10:32:00 +0000</pubDate><atom:updated>2011-12-01T23:41:13.196+13:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">SSSI</category><category domain="http://www.blogger.com/atom/ns#">Conference</category><title>Survey and Spatial Sciences Institute 2011 Conference</title><description>The SSSI 2011 Conference (&lt;a href="http://www.sssc2011.com/"&gt;http://www.sssc2011.com/&lt;/a&gt;) was held from the 23rd November through to the 25th November.&amp;nbsp;&amp;nbsp; This was a really good conference with key note speakers including Mike Goodchild (&lt;a href="http://www.geog.ucsb.edu/%7Egood/"&gt;http://www.geog.ucsb.edu/~good/&lt;/a&gt;), Andy Coote (&lt;a href="http://www.consultingwhere.com/AndyCoote.html"&gt;http://www.consultingwhere.com/AndyCoote.html&lt;/a&gt;), Manfred Ehlers (&lt;a href="http://www.crcsi.com.au/News/Welcome-Manfred-Ehlers"&gt;http://www.crcsi.com.au/News/Welcome-Manfred-Ehlers&lt;/a&gt;), Tony Smale (&lt;a href="http://www.forte-management.co.nz/default/team.aspx"&gt;http://www.forte-management.co.nz/default/team.aspx&lt;/a&gt;), and Adrian Tout from Google.&amp;nbsp; It was held in Wellington at the Wellington Town Hall and Michael Fowler Centre.&lt;br /&gt;
&lt;br /&gt;
It was interesting to see what happens to a cloud based presentation 
(Google Docs), when your Internet connection fails.&amp;nbsp; This didn’t happen 
to me, but one of the keynote speakers.&lt;br /&gt;
&lt;br /&gt;
The conference was a good chance to catch-up with old friends and colleagues.&amp;nbsp; The included some really interesting topics, and was interesting to hear about the direction of the LINZ Data Service (&lt;a href="http://data.linz.govt.nz/"&gt;http://data.linz.govt.nz/&lt;/a&gt;), SDIs and Open Geo.&amp;nbsp; Also updates about what was happening in Christchurch, and how organisations were able to help support the recovery efforts.&lt;br /&gt;
&lt;br /&gt;
I had been asked by the guys at e-Spatial (&lt;a href="http://www.e-spatial.co.nz/"&gt;http://www.e-spatial.co.nz/&lt;/a&gt;) to give a presentation about the work we have been working on for the last few years.&amp;nbsp; The presentation was about the work I have been doing to replace our GIS, Asset Management System, and backend database as one project, the advantages and improvements we were able to achieve by creating a CAD, Survey, GIS, and data maintenance process based on applications from Bentley Systems (&lt;a href="http://www.bentley.com/"&gt;http://www.bentley.com/&lt;/a&gt;). &lt;br /&gt;
&lt;br /&gt;
It was interesting to see the vendor user group meetings held by ESRI (Eagle Technology) and MapInfo (Critchlows).&amp;nbsp; I didn't attend either, but I did notice that the ESRI meeting was full, while the MapInfo meeting was empty.&amp;nbsp; This is a really saddening state for Pitney Bowes MapInfo in New Zealand, hopefully it just means that their users weren't able to make it to the conference.&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/6195961493286457645-7414659884604113209?l=iantidy.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/AFJDWkMyGVbt3i5Un1x1khu0Cas/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/AFJDWkMyGVbt3i5Un1x1khu0Cas/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/AFJDWkMyGVbt3i5Un1x1khu0Cas/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/AFJDWkMyGVbt3i5Un1x1khu0Cas/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/iantidy?a=3VQuNhgcWF8:RG17qWUF9nE:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/iantidy?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/iantidy?a=3VQuNhgcWF8:RG17qWUF9nE:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/iantidy?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/iantidy/~4/3VQuNhgcWF8" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/iantidy/~3/3VQuNhgcWF8/survey-and-spatial-sciences-institute.html</link><author>noreply@blogger.com (Ian Tidy)</author><thr:total>0</thr:total><feedburner:origLink>http://iantidy.blogspot.com/2011/12/survey-and-spatial-sciences-institute.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-6195961493286457645.post-3632990079370715063</guid><pubDate>Mon, 18 Apr 2011 02:41:00 +0000</pubDate><atom:updated>2011-04-18T14:54:20.390+12:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">EasyLoader</category><category domain="http://www.blogger.com/atom/ns#">MapInfo</category><category domain="http://www.blogger.com/atom/ns#">shp2sdo</category><category domain="http://www.blogger.com/atom/ns#">Oracle</category><category domain="http://www.blogger.com/atom/ns#">Shape Files</category><title>Loading Data into Oralce</title><description>&lt;div&gt;&lt;div&gt;Over the last few months life has been very busy, but I have been thinking about posting some useful tips and information about some tools that I have been using to load data into Oracle.  For more information about the Oracle SDO_GEOMETRY have a look at http://download.oracle.com/docs/cd/B19306_01/appdev.102/b14255/sdo_objrelschema.htm.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I mainly use three (3) tools to load data into Oracle, these are MapInfo EasyLoader, shp2sdo, and dgn2sdo (from Bentley Systems).  In this post I won't talk much about the dgn2sdo tool, mainly because it is not available as a seperate download from Bentley Systems.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;MapInfo EasyLoader is the simplest of these tools to use.  It will load MapInfo TAB files (and possibly ESRI Shape Files, with a TAB header file) into Oracle, MS SQL Server (with SpatialWare), and PostgreSQL.  I have never tried loading Shape Files into Oracle with EasyLoader, but I have used it with both MS SQL Server and Oracle.  The tool is very easy to use with it's simple user interface (the only one the these tools to have a GUI).&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;One thing to remember about EasyLoader is that is must have a MAPINFO database user and MAPINFO_MAPCATALOG table.  This table contain metadata information for MapInfo products about bounds, co-ordinate system, pen, brush, and file styles and a few other things.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The script to create the MapInfo user and MAPINFO_MAPCATALOG table is:&lt;/div&gt;&lt;pre&gt;&lt;div&gt;-- Create MapInfo User - This is used only for the MapInfo Map Catalog&lt;/div&gt;&lt;div&gt;CREATE USER "MAPINFO" PROFILE "DEFAULT" IDENTIFIED BY MAPINFO DEFAULT TABLESPACE "USERS" TEMPORARY TABLESPACE "TEMP" ACCOUNT UNLOCK;&lt;/div&gt;&lt;div&gt;GRANT UNLIMITED TABLESPACE TO "MAPINFO";&lt;/div&gt;&lt;div&gt;GRANT "CONNECT" TO "MAPINFO";&lt;/div&gt;&lt;div&gt;GRANT "RESOURCE" TO "MAPINFO";&lt;/div&gt;&lt;div&gt;GRANT "WM_ADMIN_ROLE" TO "MAPINFO";&lt;/div&gt;&lt;div&gt;COMMIT;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;-- Create MapInfo MapCatalog&lt;/div&gt;&lt;div&gt;CREATE TABLE MAPINFO.MAPINFO_MAPCATALOG (&lt;/div&gt;&lt;div&gt;      SPATIALTYPE NUMBER,&lt;/div&gt;&lt;div&gt;      TABLENAME VARCHAR2(32),&lt;/div&gt;&lt;div&gt;      OWNERNAME VARCHAR2(32),&lt;/div&gt;&lt;div&gt;      SPATIALCOLUMN VARCHAR2(32),&lt;/div&gt;&lt;div&gt;      DB_X_LL NUMBER,&lt;/div&gt;&lt;div&gt;      DB_Y_LL NUMBER,&lt;/div&gt;&lt;div&gt;      DB_X_UR NUMBER,&lt;/div&gt;&lt;div&gt;      DB_Y_UR NUMBER,&lt;/div&gt;&lt;div&gt;      COORDINATESYSTEM VARCHAR2(254),&lt;/div&gt;&lt;div&gt;      SYMBOL VARCHAR2(254),&lt;/div&gt;&lt;div&gt;      XCOLUMNNAME VARCHAR2(32),&lt;/div&gt;&lt;div&gt;      YCOLUMNNAME VARCHAR2(32),&lt;/div&gt;&lt;div&gt;      RENDITIONTYPE NUMBER,&lt;/div&gt;&lt;div&gt;      RENDITIONCOLUMN VARCHAR2(32),&lt;/div&gt;&lt;div&gt;      RENDITIONTABLE VARCHAR2(32));&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;GRANT SELECT, UPDATE, INSERT ON MAPINFO.MAPINFO_MAPCATALOG TO PUBLIC;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;CREATE UNIQUE INDEX MAPINFO_MAPCATALOG_INDEX ON MAPINFO.MAPINFO_MAPCATALOG(TABLENAME,OWNERNAME);&lt;/div&gt;&lt;div&gt;COMMIT;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;/pre&gt;&lt;div&gt;The biggest problem with EasyLoader is that it doesn't set the projection properly in the USER_SDO_GEOM_METADATA table or in the SDO_GEOMETRY column itself.  This is simple enough to fix with a few SQL statements.&lt;/div&gt;&lt;pre&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;-- Fix USER SDO GEOMETRY METADATA - Set to NZMG&lt;/div&gt;&lt;div&gt;UPDATE USER_SDO_GEOM_METADATA SET SRID = 27200 WHERE TABLE_NAME = 'XXXXX';&lt;/div&gt;&lt;div&gt;COMMIT;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;-- Drop Spatial Index&lt;/div&gt;&lt;div&gt;DROP INDEX XXXXX_SX;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;-- Fix SDO_SRID With Geometry for PARCEL table&lt;/div&gt;&lt;div&gt;UPDATE XXXXX a SET a.GEOLOC.SDO_SRID = 27200 WHERE a.GEOLOC is not null;&lt;/div&gt;&lt;div&gt;COMMIT;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;-- Recreate Spatial Index&lt;/div&gt;&lt;div&gt;CREATE INDEX XXXXX_SX ON XXXXX(GEOLOC) INDEXTYPE IS MDSYS.SPATIAL_INDEX;&lt;/div&gt;&lt;div&gt;COMMIT;&lt;/div&gt;&lt;/pre&gt;&lt;div&gt;MapInfo EasyLoader can be run as a command line interface, see the PDF included in the download (http://www.pbinsight.com/support/product-downloads/item/easyloader-v10.0).  EasyLoader will load the tables into whichever schema you connect to the Oracle server using.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;SHP2SDO is a command line tool from Oracle Corporation which uploads ESRI Shape Files into Oracle.  This tool doesn't have the same issues with the USER_SDO_GEOM_METADATA table, or the SDO_GEOMETRY column as EasyLoader.  But it doesn't have a GUI or maintain the MAPINFO_MAPCATALOG table /9this is beyond the scope of this post, since it is only a MapInfo issue).&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Unlike EasyLoader, SHP2SDO doesn't actually load data into Oracle, it simply creates a few SQL files that other Oracle tools use to create the table, and load any data.  The nice thing about this is that you can just create the table and not load any data (if you want).&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The tool is easy enough to use the basic syntax is 'shp2sdo.exe shapefile tablename -s SRID'.  I normally add a '-g OGC_GEOMETRY' and '-d' options.  The -g option will specify the geometry column name that I want to use, and the -d option put the data in the control file (.ctl).  The -s option is important, the is the co-ordinate system that will be used, so replace the SRID with the co-ordinate system you want.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;And example of the SHP2SDO tool is:&lt;/div&gt;&lt;pre&gt;&lt;div&gt;shp2sdo parcel parcel -s 27200 -g GEOLOC&lt;/div&gt;&lt;/pre&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;This will create a .sql, .ldr, and .ctl files.  The .sql file is for SQLPlus and the .ldr and .ctl files are for the SQLLoader tool.  So to load this table and data into Oracle is as simple as running the .sql file as the schema owner, and loading the data.  This again can be run from the command line as follows:&lt;/div&gt;&lt;pre&gt;&lt;div&gt;sqlplus tableowner/password @parcel.sql (when the script completes, type exit)&lt;/div&gt;&lt;div&gt;sqlldr tableowner/password parcel&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;/pre&gt;&lt;div&gt;And all going well your data will be in Oracle.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Another little trick that caught me recently is to fix up any SDO_GTYPE errors that can occur mainly with polygon tables.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Simply login to Oracle as the tableowner and run “&lt;pre&gt;EXECUTE SDO_MIGRATE.TO_CURRENT('tablename','geometrycolumn');&lt;/pre&gt;”, it is that simple.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;SHP2SDO can be downloaded from http://www.oracle.com/technetwork/database/options/spatial/index-093371.html.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Have fun...&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/6195961493286457645-3632990079370715063?l=iantidy.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/6Ep0fSL66jaDHJUYjzj8QgBOSzQ/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/6Ep0fSL66jaDHJUYjzj8QgBOSzQ/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/6Ep0fSL66jaDHJUYjzj8QgBOSzQ/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/6Ep0fSL66jaDHJUYjzj8QgBOSzQ/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/iantidy?a=9wrnPZnIPMM:rBnzaRvDhPk:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/iantidy?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/iantidy?a=9wrnPZnIPMM:rBnzaRvDhPk:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/iantidy?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/iantidy/~4/9wrnPZnIPMM" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/iantidy/~3/9wrnPZnIPMM/loading-data-into-oralce.html</link><author>noreply@blogger.com (Ian Tidy)</author><thr:total>2</thr:total><feedburner:origLink>http://iantidy.blogspot.com/2011/04/loading-data-into-oralce.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-6195961493286457645.post-8614843787135454615</guid><pubDate>Wed, 08 Sep 2010 05:31:00 +0000</pubDate><atom:updated>2010-09-09T20:38:42.865+12:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">JavaScript</category><category domain="http://www.blogger.com/atom/ns#">measure</category><title>MapServer Measure Tool (the complete picture)</title><description>Following on from the previous post on a JavaScript measure tool.  Originally this post was simply a cut-down html page that uses the tool.  The JavaScript in previous posts is contained in the "map_tools.js" file and the "excanvas.js" is from the Google Code site.  But after a bit of work I decided to post the entire HTML and JavaScript in the one page.&lt;br /&gt;&lt;br /&gt;So the HTML looks like this:&lt;br /&gt;&lt;br /&gt;&lt;pre style="font-family: arial; font-size: 12px; border: 1px dashed rgb(204, 204, 204); width: 99%; height: auto; overflow: auto; background: none repeat scroll 0% 0% rgb(240, 240, 240); padding: 0px; color: rgb(0, 0, 0); text-align: left; line-height: 20px;"&gt;&lt;code style="color: rgb(0, 0, 0); word-wrap: normal;"&gt;&lt;br /&gt;&amp;lt;!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"&amp;gt;&lt;br /&gt;&amp;lt;html xmlns="http://www.w3.org/1999/xhtml"&amp;gt;&lt;br /&gt;&amp;lt;head&amp;gt;&lt;br /&gt;&amp;lt;title&amp;gt;Measure Tool Demo&amp;lt;/title&amp;gt;&lt;br /&gt;&amp;lt;script type="text/javascript" src="script/polygon.js"&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;&amp;lt;script type="text/javascript" src="script/excanvas.js"&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;&amp;lt;script type="text/javascript" src="script/map_tools.js"&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;&amp;lt;/head&amp;gt;&lt;br /&gt;&amp;lt;body style="background-color: #f0f0f0;"&amp;gt;&lt;br /&gt;&amp;lt;form id="form1" method="post" name="myform"&amp;gt;&lt;br /&gt;&amp;lt;div&amp;gt;&lt;br /&gt;  &amp;lt;div id="viewportwrapper" style="position: relative; width: 800px; height: 600px;&lt;br /&gt;    overflow: hidden;" align="left"&amp;gt;&lt;br /&gt;    &amp;lt;div id="viewport" style="position: absolute; clip: rect(0px, 800px, 600px, 0px);"&amp;gt;&lt;br /&gt;      &amp;lt;div id="main_map_div"&amp;gt;&lt;br /&gt;                &amp;lt;canvas id="map_canvas" width="800" height="600" name="map_canvas" style = "position: absolute; visibility: hidden; display: none;"&amp;gt;&amp;lt;/canvas&amp;gt;&lt;br /&gt;        &amp;lt;img src="image_name.png" width="800px" height="600px" id="main_map" name="main_map"&amp;gt;&lt;br /&gt;      &amp;lt;/div&amp;gt;&lt;br /&gt;    &amp;lt;/div&amp;gt;&lt;br /&gt;    &amp;lt;!-- View Port Close --&amp;gt;&lt;br /&gt;  &amp;lt;/div&amp;gt;&lt;br /&gt;  &amp;lt;div id="rubberband" style="position: absolute; z-index: 23"&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;                &amp;lt;div id="queryBox" style="visibility: hidden; display: none; position: absolute; z-index: 25; border-width: 1px; border-style: solid; border- background-"&amp;gt;&lt;br /&gt;                     &amp;lt;table id="queryTable" bgcolor="#ffffff" cellpadding="0px" cellspacing="0px"&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;&amp;lt;span id="queryTableData"&amp;gt;&amp;lt;/span&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;lt;/table&amp;gt;&lt;br /&gt;                &amp;lt;/div&amp;gt;&lt;br /&gt;  &amp;lt;input type="HIDDEN" name="MINX_JS" id="minx" value="2840822.1131712"&amp;gt;&lt;br /&gt;  &amp;lt;input type="HIDDEN" name="MINY_JS" id="miny" value="6178435.79036"&amp;gt;&lt;br /&gt;  &amp;lt;input type="HIDDEN" name="MAXX_JS" id="maxx" value="2850231.1791488"&amp;gt;&lt;br /&gt;  &amp;lt;input type="HIDDEN" name="MAXY_JS" id="maxy" value="6185489.64583"&amp;gt;&lt;br /&gt;  &amp;lt;input type="HIDDEN" name="IMG_W_JS" id="imgw" value="800"&amp;gt;&lt;br /&gt;  &amp;lt;input type="HIDDEN" name="IMG_H_JS" id="imgh" value="600"&amp;gt;&lt;br /&gt;  &amp;lt;input type="HIDDEN" name="SCALE_JS" id="scale" value="33380.954352653"&amp;gt;&lt;br /&gt;  &amp;lt;input type="hidden" name="js" id="js" value="0"&amp;gt;&lt;br /&gt;  &amp;lt;input type="hidden" name="jsbox" id="jsbox" value="0"&amp;gt;&lt;br /&gt;  &amp;lt;input type="hidden" name="jstool" id="jstool" value="zoomin"&amp;gt;&lt;br /&gt;  &amp;lt;!-- Co-Ordinate Display Start --&amp;gt;&lt;br /&gt;  &amp;lt;table cellpadding="2" cellspacing="0" align="center"&amp;gt;&lt;br /&gt;    &amp;lt;tr&amp;gt;&lt;br /&gt;      &amp;lt;td&amp;gt;&lt;br /&gt;        &amp;lt;img src="/Images/bg.jpeg" width="1" height="5"&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;    &amp;lt;/tr&amp;gt;&lt;br /&gt;    &amp;lt;tr&amp;gt;&lt;br /&gt;      &amp;lt;td align="center" &amp;gt;&lt;br /&gt;        NZMG Co-ordinates&amp;lt;/td&amp;gt;&lt;br /&gt;    &amp;lt;/tr&amp;gt;&lt;br /&gt;    &amp;lt;tr&amp;gt;&lt;br /&gt;      &amp;lt;td align="center"&amp;gt;&lt;br /&gt;        &amp;lt;span id="coord_x"&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;        &amp;lt;br&amp;gt;&lt;br /&gt;        &amp;lt;span id="coord_y"&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;      &amp;lt;/td&amp;gt;&lt;br /&gt;    &amp;lt;/tr&amp;gt;&lt;br /&gt;    &amp;lt;tr&amp;gt;&lt;br /&gt;      &amp;lt;td align="center" &amp;gt;&lt;br /&gt;        &amp;lt;span id="coords"&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;      &amp;lt;/td&amp;gt;&lt;br /&gt;    &amp;lt;/tr&amp;gt;&lt;br /&gt;    &amp;lt;tr&amp;gt;&lt;br /&gt;      &amp;lt;td align="center"&amp;gt;&lt;br /&gt;        &amp;lt;span id="dist"&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;        &amp;lt;br&amp;gt;&lt;br /&gt;        &amp;lt;span id="seg_dist"&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;      &amp;lt;/td&amp;gt;&lt;br /&gt;    &amp;lt;/tr&amp;gt;&lt;br /&gt;    &amp;lt;tr&amp;gt;&lt;br /&gt;      &amp;lt;td&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;    &amp;lt;/tr&amp;gt;&lt;br /&gt;  &amp;lt;/table&amp;gt;&lt;br /&gt;&amp;lt;/div&amp;gt;&lt;br /&gt;&amp;lt;!-- Global Hidden Variables --&amp;gt;&lt;br /&gt;&amp;lt;input type="hidden" id="extent" name="extent" value="2840822.1131712 6178435.79036 2850231.1791488 6185489.64583"&amp;gt;&lt;br /&gt;&amp;lt;input type="hidden" id="layerstatus" name="layerstatus" value=""&amp;gt;&lt;br /&gt;&amp;lt;input type="hidden" id="mapfile" name="mapfile" value=""&amp;gt;&lt;br /&gt;&amp;lt;input type="hidden" id="savequery" name="savequery" value=""&amp;gt;&lt;br /&gt;&amp;lt;input type="hidden" id="queryfile" name="queryfile" value=""&amp;gt;&lt;br /&gt;&amp;lt;input type="hidden" name="js_pan_ex" id="js_pan_ex" value="0"&amp;gt;&lt;br /&gt;&amp;lt;input type="hidden" name="js_pan_ey" id="js_pan_ey" value="0"&amp;gt;&lt;br /&gt;&amp;lt;input type="hidden" name="js_pan_submit" id="js_pan_submit" value="False"&amp;gt;&lt;br /&gt;&amp;lt;input type="hidden" name="set_tm" id="set_tm" value="0"&amp;gt;&lt;br /&gt;&amp;lt;input type="hidden" name="valuation" id="valuation" value="0"&amp;gt;&lt;br /&gt;&amp;lt;input type="hidden" name="streetURL" id="streetURL" value="0"&amp;gt;&lt;br /&gt;&amp;lt;input type="hidden" name="photoURL" id="photoURL" value="0"&amp;gt;&lt;br /&gt;&amp;lt;input type="HIDDEN" name="URL_EXTENT" value="0"&amp;gt;&lt;br /&gt;&amp;lt;input type="hidden" name="jsSrchProj" id="jsSrchProj" value="27200"&amp;gt;&lt;br /&gt;&amp;lt;input type="hidden" name="jsSrchX" id="jsSrchX" value="0"&amp;gt;&lt;br /&gt;&amp;lt;input type="hidden" name="jsSrchY" id="jsSrchY" value="0"&amp;gt;&lt;br /&gt;&amp;lt;input type="hidden" name="jsSrchProjFlag" id="jsSrchProjFlag" value="0"&amp;gt;&lt;br /&gt;&amp;lt;/form&amp;gt;&lt;br /&gt;&amp;lt;/body&amp;gt;&lt;br /&gt;&amp;lt;script language="JavaScript" type="Text/JavaScript"&amp;gt;&lt;br /&gt;// Set Default Tool&lt;br /&gt;set_tm = document.getElementById('set_tm').value * 1;&lt;br /&gt;function stopRKey(evt){&lt;br /&gt;var evt = (evt) ? evt : ((event) ? event : null);&lt;br /&gt;var node = (evt.target) ? evt.target : ((evt.srcElement) ? evt.srcElement : null);&lt;br /&gt;if ((evt.keyCode == 13) &amp;amp;&amp;amp; (node.type == "text")) {return false;}&lt;br /&gt;}&lt;br /&gt;// Set-up to use getMouseXY function onMouseMove&lt;br /&gt;document.onmousemove = mapOver;&lt;br /&gt;document.onmousedown = mousedown;&lt;br /&gt;document.onmouseup = mouseup;&lt;br /&gt;// Set-up ENTER key Trap&lt;br /&gt;document.onkeypress = stopRKey;&lt;br /&gt;// Set tool to Measure&lt;br /&gt;map_tools('measure');&lt;br /&gt;&amp;lt;/script&amp;gt;&lt;br /&gt;&amp;lt;/html&amp;gt;&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;This page includes some extra bits that are useful, like a viewport for containing the map image while it is being dragged (for panning).  You do require an extra tools called polygon.js, I'm not sure where I got this from, but the code for it is:&lt;br /&gt;&lt;br /&gt;&lt;pre style="font-family: arial; font-size: 12px; border: 1px dashed rgb(204, 204, 204); width: 99%; height: auto; overflow: auto; background: none repeat scroll 0% 0% rgb(240, 240, 240); padding: 0px; color: rgb(0, 0, 0); text-align: left; line-height: 20px;"&gt;&lt;code style="color: rgb(0, 0, 0); word-wrap: normal;"&gt; /*&lt;br /&gt;City of Saint Paul Open Source License&lt;br /&gt;LICENSE&lt;br /&gt;Copyright © 2006 City of Saint Paul, Minnesota.&lt;br /&gt;Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following terms and conditions:&lt;br /&gt;1.The above copyright notice and this permission notice shall be included in all copies of this Software or works derived from this Software.&lt;br /&gt;2.Whenever a Recipient distributes or redistributes the Software, a copy of this agreement must be included with each copy of the Software&lt;br /&gt;3.If Recipient distributes or redistributes the Software in any form other than source code, Recipient must also make the source code freely available, and must provide with each copy of the Software information on how to obtain the source code in a reasonable manner on or through a medium customarily used for software exchange&lt;br /&gt;4.A Recipient may not make any representation in the Software or in any promotional, advertising or other material that may be construed as an endorsement by the City of Saint Paul of any product or service provided by Recipient, or that may seek to obtain commercial advantage by the fact of the City of Saint Paul’s participation in this Agreement.&lt;br /&gt;DISCLAIMER OF WARRANTIES AND LIABILITIES; WAIVER AND INDEMNIFICATION&lt;br /&gt;No Warranty: The Software is provided “as is” without any warranty of any kind, either expressed, implied, or statutory, including, but not limited to, any warranty that the Software will conform to specifications, any implied warranties of merchantability, fitness for a particular purpose, or freedom from infringement, any warranty that the Software will be error free, or any warranty that documentation, if provided, will conform to the Software. This agreement does not, in any manner, constitute an endorsement by the City of Saint Paul or any prior recipient of any results, resulting designs, hardware, software products or any other applications resulting from use of the Software. Further, the City of Saint Paul disclaims all warranties and liabilities regarding third-party software, if present in the original Software, and distributes it “as is.”&lt;br /&gt;Waiver and Indemnity: Recipient agrees to waive any and all claims against the City of Saint Paul, its contractors and subcontractors, as well as any prior recipient. If recipient's use of the Software results in any liabilities, demands, damages, expenses or losses arising from such use, including any damages from products based on, or resulting from, recipient's use of the Software, recipient shall indemnify and hold harmless the City of Saint Paul, it’s contractors and subcontractors, as well as any prior recipient, to the extent permitted by law. Recipient's sole remedy for any such matter shall be the immediate, unilateral termination of this agreement.&lt;br /&gt;SUPPORT STATEMENT&lt;br /&gt;The Software is freely provided by the City of Saint Paul as a public service. The recipient is herby notified that the provision and distribution of the Software should in no way be construed to mean that the City of Saint Paul is obligated to provide any level of support for the Software, now or in the future. Support in this context shall be construed to mean providing coordination, technical assistance, responding to questions, releasing bug fixes, providing future releases, or otherwise obligating the City of Saint Paul to commit resources to maintain this Software or assist in its implementation by any person or entity. The City of Saint Paul may, at it’s sole option, and without notice or obligation to the recipients, provide varying levels of support for the Software or terminate the agreement. Provision of such support shall not alter the condition that the Software is provided without support as stated above.&lt;br /&gt;*/&lt;br /&gt;function Point(x, y) {&lt;br /&gt; this.x = x;&lt;br /&gt; this.y = y;&lt;br /&gt; this.type = 'point';&lt;br /&gt; this.fromString = function(str,delim) {&lt;br /&gt;      var arr = str.split(delim);&lt;br /&gt;      this.x = parseFloat(arr[0]);&lt;br /&gt;      this.y = parseFloat(arr[1]);&lt;br /&gt; }&lt;br /&gt; this.toString = function(delim) {&lt;br /&gt;      return this.x+delim+this.y;&lt;br /&gt; }&lt;br /&gt; this.equals = function(otherPoint) {&lt;br /&gt;      return(this.x == otherPoint.x &amp;amp;&amp;amp; this.y == otherPoint.y);&lt;br /&gt; }&lt;br /&gt; this.scale = function(s) {&lt;br /&gt;      this.x = this.x * s;&lt;br /&gt;      this.y = this.y * s;&lt;br /&gt; }&lt;br /&gt; this.clean = function() {&lt;br /&gt;      this.x = parseFloat(this.x);&lt;br /&gt;      this.y = parseFloat(this.y);&lt;br /&gt; }&lt;br /&gt; this.buffer = function(rad) {&lt;br /&gt;      var newCirc = new Circle();&lt;br /&gt;      newCirc.Center = new Point(this.x, this.y);&lt;br /&gt;      newCirc.Radius = rad;&lt;br /&gt;      return newCirc;&lt;br /&gt; }&lt;br /&gt; this.minX = function() {&lt;br /&gt;      return x;&lt;br /&gt; }&lt;br /&gt; this.maxX = function() {&lt;br /&gt;      return x;&lt;br /&gt; }&lt;br /&gt; this.minY = function() {&lt;br /&gt;      return y;&lt;br /&gt; }&lt;br /&gt; this.maxY = function() {&lt;br /&gt;      return y;&lt;br /&gt; }&lt;br /&gt;}&lt;br /&gt;function LineSegment(PointA, PointB) {&lt;br /&gt; this.pointA = PointA;&lt;br /&gt; this.pointB = PointB;&lt;br /&gt; this.type = 'line';&lt;br /&gt; this.slope = function() {&lt;br /&gt;      return ((this.pointA.y - this.pointB.y) / (this.pointA.x - this.pointB.x));&lt;br /&gt; }&lt;br /&gt; this.eval = function(x) {&lt;br /&gt;      if((x - this.pointA.x) == 0) { return this.pointA.y; }&lt;br /&gt;      if((x - this.pointB.x) == 0) { return this.pointB.y; }&lt;br /&gt;      return (this.slope() * (x - this.pointA.x) + this.pointA.y);&lt;br /&gt; }&lt;br /&gt; this.evalA = function () {&lt;br /&gt;      return this.eval(this.pointA.x);&lt;br /&gt; }&lt;br /&gt; this.evalB = function () {&lt;br /&gt;      return this.eval(this.pointB.x);&lt;br /&gt; }&lt;br /&gt; function returnGreater(A, B) {&lt;br /&gt;      if(A &amp;gt; B) return A;&lt;br /&gt;      return B;&lt;br /&gt; }&lt;br /&gt; function returnLesser(A, B) {&lt;br /&gt;      if(A &amp;lt; B) return A;&lt;br /&gt;      return B;&lt;br /&gt; }&lt;br /&gt; this.normalize = function() {&lt;br /&gt;      if(this.pointA.x &amp;gt; this.pointB.x) {&lt;br /&gt;           var t = this.pointA.x;&lt;br /&gt;           this.pointA.x = this.pointB.x;&lt;br /&gt;           this.pointB.x = t;&lt;br /&gt;      }&lt;br /&gt;      if(this.pointA.y &amp;gt; this.pointB.y) {&lt;br /&gt;           var t = this.pointA.y;&lt;br /&gt;           this.pointA.y = this.pointB.y;&lt;br /&gt;           this.pointB.y = t;&lt;br /&gt;      }&lt;br /&gt; }&lt;br /&gt; this.getLength = function() {&lt;br /&gt;      if((this.pointA.x - this.pointB.x) == 0) { return this.maxY() - this.minY(); }&lt;br /&gt;      if((this.pointA.y - this.pointB.y) == 0) { return this.maxX() - this.minX(); }&lt;br /&gt;      return (Math.sqrt(Math.pow(this.getWidth(),2) + Math.pow(this.getHeight(),2)));&lt;br /&gt; }&lt;br /&gt; this.length = this.getLength;&lt;br /&gt; this.minX = function () {&lt;br /&gt;      return returnLesser(this.pointA.x, this.pointB.x);&lt;br /&gt; }&lt;br /&gt; this.maxX = function () {&lt;br /&gt;      return returnGreater(this.pointA.x, this.pointB.x);       &lt;br /&gt; }&lt;br /&gt; this.minY = function () {&lt;br /&gt;      return returnLesser(this.pointA.y, this.pointB.y);&lt;br /&gt; }&lt;br /&gt; this.maxY = function () {&lt;br /&gt;      return returnGreater(this.pointA.y, this.pointB.y);       &lt;br /&gt; }&lt;br /&gt; this.getWidth = function() {&lt;br /&gt;      return this.maxX() - this.minX();&lt;br /&gt; }&lt;br /&gt; this.getHeight = function() {&lt;br /&gt;      return this.maxY() - this.minY();&lt;br /&gt; }&lt;br /&gt; this.shift = function(x,y) {&lt;br /&gt;      this.pointA.x = parseInt(this.pointA.x);&lt;br /&gt;      this.pointA.y = parseInt(this.pointA.y);&lt;br /&gt;      this.pointB.x = parseInt(this.pointB.x);&lt;br /&gt;      this.pointB.y = parseInt(this.pointB.y);&lt;br /&gt;      this.pointA.x += x;&lt;br /&gt;      this.pointB.x += x;&lt;br /&gt;      this.pointA.y += y;&lt;br /&gt;      this.pointB.y += y;&lt;br /&gt; }&lt;br /&gt; this.scale = function(x, y) {&lt;br /&gt;      this.pointA.x = this.pointA.x * x;&lt;br /&gt;      this.pointA.y = this.pointA.y * y;&lt;br /&gt;      this.pointB.x = this.pointB.x * x;&lt;br /&gt;      this.pointB.y = this.pointB.y * y;&lt;br /&gt; }&lt;br /&gt; this.getMidPoint = function() {&lt;br /&gt;      var oldMidX = (this.pointA.x + this.pointB.x) / 2;&lt;br /&gt;      var oldMidY = this.eval(oldMidX);&lt;br /&gt;      return new Point(oldMidX, oldMidY);&lt;br /&gt; }&lt;br /&gt; this.shiftMidPoint = function(newMidPoint) {&lt;br /&gt;      var oldMidPoint = this.getMidPoint();&lt;br /&gt;      this.shift(oldMidPoint.x-newMidPoint.x, oldMidPoint.y-newMidPoint.y);&lt;br /&gt; }&lt;br /&gt; this.getScaledPoint = function(fromLine, fromPoint) {&lt;br /&gt;      var scaledPoint = new Point();&lt;br /&gt;      scaledPoint.x = fromLine.getWidth() / (fromPoint.x - fromLine.minX());&lt;br /&gt;      scaledPoint.x = (this.getWidth() / scaledPoint.x) + this.minX();&lt;br /&gt;      scaledPoint.y = fromLine.getHeight() / (fromPoint.y - fromLine.minY());&lt;br /&gt;      scaledPoint.y = (this.getHeight() / scaledPoint.y) + this.minY();&lt;br /&gt;      return scaledPoint;&lt;br /&gt; }&lt;br /&gt; this.scaleAboutMidPoint = function(scale) {&lt;br /&gt;      var oldMidPoint = this.getMidPoint();  &lt;br /&gt;      this.scale(scale,scale);&lt;br /&gt;      var newMidPoint = this.getMidPoint();&lt;br /&gt;      this.shift((oldMidPoint.x-newMidPoint.x), oldMidPoint.y-newMidPoint.y);&lt;br /&gt; }&lt;br /&gt; this.toString = function(delim) {&lt;br /&gt;      var retString = this.pointA.x+delim+this.pointA.y+delim+this.pointB.x+delim+this.pointB.y;&lt;br /&gt;      return retString;&lt;br /&gt; }&lt;br /&gt; this.fromString = function(str, delim) {&lt;br /&gt;      var coords = str.split(delim);&lt;br /&gt;      for(var i = 0; i &amp;lt; coords.length; i++) {&lt;br /&gt;           coords[i] = parseFloat(coords[i]);&lt;br /&gt;      }&lt;br /&gt;      this.pointA = new Point(coords[0], coords[1]);&lt;br /&gt;      this.pointB = new Point(coords[2], coords[3]);&lt;br /&gt; }&lt;br /&gt; this.intersectEndPoint = function() {&lt;br /&gt; }&lt;br /&gt;/*&lt;br /&gt;this.intersects = function(testLine) {&lt;br /&gt;      var minX = this.minX();&lt;br /&gt;      var maxX = this.maxX();&lt;br /&gt;      var testMinX = testLine.minX();&lt;br /&gt;      var testMaxX = testLine.maxX();&lt;br /&gt;      var minY = this.minY();&lt;br /&gt;      var maxY = this.maxY();&lt;br /&gt;      var testMinY = testLine.minY();&lt;br /&gt;      var testMaxY = testLine.maxY();&lt;br /&gt;      // This saves some time if the lines don't share a domain&lt;br /&gt;      if(testMinX &amp;gt; maxX || testMaxX &amp;lt; minX) {&lt;br /&gt;           return false;&lt;br /&gt;      }&lt;br /&gt;      // If the line is striaght up and down, it needs to be handled&lt;br /&gt;      // In a special fashion, checking both the X and Y domain&lt;br /&gt;      // using the end points.&lt;br /&gt;      if((this.pointA.x - this.pointB.x) == 0) {&lt;br /&gt;           var testLineY = testLine.eval(this.pointA.x);&lt;br /&gt;           return (testLineY &amp;gt;= minY &amp;amp;&amp;amp; testLineY &amp;lt;= maxY);&lt;br /&gt;      }&lt;br /&gt;      if(testMinX - testMaxX == 0) {&lt;br /&gt;           return(testMinX &amp;gt;= minX &amp;amp;&amp;amp; testMinX &amp;lt;= maxX);&lt;br /&gt;      }&lt;br /&gt;      // Do some domain normalization, narrows the test domain&lt;br /&gt;      // to the smaller line segment.&lt;br /&gt;      minX = returnGreater(testMinX, minX);&lt;br /&gt;      maxX = returnLesser(testMaxX, maxX);&lt;br /&gt;      return (&lt;br /&gt;           (this.eval(minX) &amp;lt; testLine.eval(minX)) &amp;amp;&amp;amp; (testLine.eval(maxX) &amp;lt;= this.eval(maxX))&lt;br /&gt;           ||&lt;br /&gt;           (this.eval(minX) &amp;gt; testLine.eval(minX)) &amp;amp;&amp;amp; (testLine.eval(maxX) &amp;gt;= this.eval(maxX))&lt;br /&gt;      );&lt;br /&gt; }&lt;br /&gt;*/&lt;br /&gt; this.intersects = function(testLine) {&lt;br /&gt;      var X1 = this.pointA.x;&lt;br /&gt;      var Y1 = this.pointA.y;&lt;br /&gt;      var X2 = this.pointB.x;&lt;br /&gt;      var Y2 = this.pointB.y;&lt;br /&gt;      var X3 = testLine.pointA.x;&lt;br /&gt;      var Y3 = testLine.pointA.y;&lt;br /&gt;      var X4 = testLine.pointB.x;&lt;br /&gt;      var Y4 = testLine.pointB.y;&lt;br /&gt;      var dDenom = (((X2 - X1) * (Y4 - Y3)) - ((Y2 - Y1) * (X4 - X3)));&lt;br /&gt;      if(dDenom == 0) {&lt;br /&gt;           return false; // Line Segments are Parallel&lt;br /&gt;      }&lt;br /&gt;      var dSnum = (((Y1 - Y3) * (X4 - X3)) - ((X1 - X3) * (Y4 - Y3)));&lt;br /&gt;      var dTnum = (((Y1 - Y3) * (X2 - X1)) - ((X1 - X3) * (Y2 - Y1)));&lt;br /&gt;      var S = dSnum / dDenom;&lt;br /&gt;      var T = dTnum / dDenom;&lt;br /&gt;      var testS = (0 &amp;lt;= S &amp;amp;&amp;amp; S &amp;lt;= 1);&lt;br /&gt;      var testT = (0 &amp;lt;= T &amp;amp;&amp;amp; T &amp;lt;= 1);&lt;br /&gt;      return(testS &amp;amp;&amp;amp; testT)&lt;br /&gt; }&lt;br /&gt; this.buffer = function(rad) {&lt;br /&gt;      var slope = this.slope();&lt;br /&gt;      var inverse_slope = -1 / slope;&lt;br /&gt;      var x_shift = 0, y_shift = 0;&lt;br /&gt;      if(!isFinite(slope)) {&lt;br /&gt;           x_shift = rad;&lt;br /&gt;      } else if(slope == 0) {&lt;br /&gt;           y_shift = rad;&lt;br /&gt;      } else {&lt;br /&gt;           var theta = Math.atan(inverse_slope);&lt;br /&gt;           x_shift = Math.round(Math.cos(theta) * rad);&lt;br /&gt;           y_shift = Math.round(Math.sin(theta) * rad);&lt;br /&gt;      }&lt;br /&gt;      var newPoints = new Array();&lt;br /&gt;      newPoints[0] = new Point(this.pointA.x + x_shift, this.pointA.y + y_shift);&lt;br /&gt;      newPoints[1] = new Point(this.pointB.x + x_shift, this.pointB.y + y_shift);&lt;br /&gt;      newPoints[2] = new Point(this.pointB.x - x_shift, this.pointB.y - y_shift);&lt;br /&gt;      newPoints[3] = new Point(this.pointA.x - x_shift, this.pointA.y - y_shift);&lt;br /&gt;      var pointsString = '';&lt;br /&gt;      for(var i = 0; i &amp;lt; newPoints.length; i++) {&lt;br /&gt;           pointsString += newPoints[i].toString(',')+' ';&lt;br /&gt;      }&lt;br /&gt;      var newLines = new Array();&lt;br /&gt;      newLines[0] = new LineSegment(newPoints[0], newPoints[1]);&lt;br /&gt;      newLines[1] = new LineSegment(newPoints[1], newPoints[2]);&lt;br /&gt;      newLines[2] = new LineSegment(newPoints[2], newPoints[3]);&lt;br /&gt;      newLines[3] = new LineSegment(newPoints[3], newPoints[0]);&lt;br /&gt;      //logDebugMessage('Buffered Segment', true, pointsString);&lt;br /&gt;      var newPoly = new Polygon();&lt;br /&gt;      for(var i = 0; i &amp;lt; newLines.length; i++) {&lt;br /&gt;           newPoly.addLine(newLines[i]);&lt;br /&gt;      }&lt;br /&gt;      //logDebugMessage('Buffered Segment', true, 'Lines: '+newPoly.toString(','));&lt;br /&gt;      return newPoly;&lt;br /&gt; }&lt;br /&gt;}&lt;br /&gt;function Polygon() {&lt;br /&gt; this.Lines = new Array();&lt;br /&gt; this.origin = new Point(0,0);&lt;br /&gt; this.type = 'polygon';&lt;br /&gt; var MinX = 1000000, MaxX = -1, MinY = 1000000, MaxY = -1;&lt;br /&gt; this.addLine = function(line) {&lt;br /&gt;      if(line.minX() &amp;lt; MinX) { MinX = line.minX(); }&lt;br /&gt;      if(line.maxX() &amp;gt; MaxX) { MaxX = line.maxX(); }&lt;br /&gt;      if(line.minY() &amp;lt; MinY) { MinY = line.minY(); }&lt;br /&gt;      if(line.maxY() &amp;gt; MaxY) { MaxY = line.maxY(); }&lt;br /&gt;      this.Lines[this.Lines.length] = line;&lt;br /&gt; }&lt;br /&gt; this.minX = function() {&lt;br /&gt;      return MinX;&lt;br /&gt; }&lt;br /&gt; this.maxX = function() {&lt;br /&gt;      return MaxX;&lt;br /&gt; }&lt;br /&gt; this.minY = function() {&lt;br /&gt;      return MinY;&lt;br /&gt; }&lt;br /&gt; this.maxY = function() {&lt;br /&gt;      return MaxY;&lt;br /&gt; }&lt;br /&gt; this.clearLines = function () {&lt;br /&gt;      this.Lines = new Array();&lt;br /&gt; }&lt;br /&gt; this.countLines = function() {&lt;br /&gt;      return this.Lines.length;&lt;br /&gt; }&lt;br /&gt; this.countIntersections = function(testLine) {&lt;br /&gt;      var c = 0;&lt;br /&gt;      for(var i = 0; i &amp;lt; this.Lines.length; i++) {&lt;br /&gt;           if(this.Lines[i].intersects(testLine)) {&lt;br /&gt;                c++;&lt;br /&gt;           }&lt;br /&gt;      }&lt;br /&gt;      return c;&lt;br /&gt; }&lt;br /&gt; this.isMemberPoint = function(pointA) {&lt;br /&gt;      if(pointA.x &amp;lt; MinX || pointA.x &amp;gt; MaxX) { return false; }&lt;br /&gt;      if(pointA.y &amp;lt; MinY || pointA.y &amp;gt; MaxY) { return false; }&lt;br /&gt;      var intersections = this.countIntersections(new LineSegment(new Point(0,pointA.y), pointA));&lt;br /&gt;      var intersections2 = this.countIntersections(new LineSegment(new Point(0,0), pointA));&lt;br /&gt;//          return((intersections % 2) == 1 || (intersections2 % 2) == 1);&lt;br /&gt;//          return (intersections % 2 == 1);&lt;br /&gt;      return((intersections % 2) == 1 &amp;amp;&amp;amp; (intersections2 % 2) == 1);&lt;br /&gt; }&lt;br /&gt; this.intersectsPoly = function(poly) {&lt;br /&gt;      var nIntersections = 0;&lt;br /&gt;      var allLines = poly.Lines;&lt;br /&gt;      for(var i = 0; i &amp;lt; allLines.length; i++) {&lt;br /&gt;           nIntersections+=this.countIntersections(allLines[i]);&lt;br /&gt;      }&lt;br /&gt;      return nIntersections;&lt;br /&gt; }&lt;br /&gt; this.isMember = function(shape) {&lt;br /&gt;      if(shape.type.match(/point/i)) {&lt;br /&gt;           return this.isMemberPoint(shape);&lt;br /&gt;      } else if(shape.type.match(/polygon/i)) {&lt;br /&gt;           var points = shape.getPoints();&lt;br /&gt;           for(var p = 0; p &amp;lt; points.length; p++) {&lt;br /&gt;                if(this.isMemberPoint(points[p])) {&lt;br /&gt;                     return true;&lt;br /&gt;                }&lt;br /&gt;           }&lt;br /&gt;           if(this.intersectsPoly(shape) &amp;gt; 0) {&lt;br /&gt;                return true;&lt;br /&gt;           } else {&lt;br /&gt;                //logDebugMessage('Poly Test', true, 'Not Intersect');&lt;br /&gt;           }&lt;br /&gt;           return false;&lt;br /&gt;      } else if(shape.type.match(/line/i)) {&lt;br /&gt;           return(this.countIntersections(shape) &amp;gt; 0);&lt;br /&gt;      }&lt;br /&gt; }&lt;br /&gt; this.buildFromPoints = function(pointsArray) {&lt;br /&gt;      this.Lines = new Array();&lt;br /&gt;      var lenLimit = (pointsArray.length % 2) + 1;&lt;br /&gt;      for(var i = 0; i &amp;lt; pointsArray.length - 1; i++) {&lt;br /&gt;           var newLineSeg = new LineSegment(pointsArray[i], pointsArray[i+1]);&lt;br /&gt;           this.addLine(newLineSeg);&lt;br /&gt;      }&lt;br /&gt;      // Now Close the polygon&lt;br /&gt;      var newLineSeg = new LineSegment(pointsArray[pointsArray.length-1], pointsArray[0]);&lt;br /&gt;      this.addLine(newLineSeg);&lt;br /&gt; }&lt;br /&gt; this.toString = function(delim, short) {&lt;br /&gt;      var myStr = '';&lt;br /&gt;      for(var i = 0; i &amp;lt; this.Lines.length; i++) {&lt;br /&gt;           myStr += this.Lines[i].pointA.toString(delim) + delim;&lt;br /&gt;      }&lt;br /&gt;      if(!short) {&lt;br /&gt;           myStr += this.Lines[this.Lines.length-1].pointB.toString(delim);&lt;br /&gt;      } else {&lt;br /&gt;           myStr = myStr.substring(0,myStr.length - 1);&lt;br /&gt;      }&lt;br /&gt;      return myStr;&lt;br /&gt; }&lt;br /&gt; this.area = function() {&lt;br /&gt;      var myPoints = this.getPoints();&lt;br /&gt;      myPoints[myPoints.length ] = myPoints[0];&lt;br /&gt;      var sum = 0;&lt;br /&gt;      for(var i = 0; i &amp;lt; myPoints.length - 1; i++) {&lt;br /&gt;           myPoints[i].clean(); myPoints[i+1].clean();&lt;br /&gt;           sum += (myPoints[i].x*myPoints[i+1].y - myPoints[i+1].x*myPoints[i].y);&lt;br /&gt;           //sum += ((myPoints[i].x - myPoints[i+1].x) * (myPoints[i].y + myPoints[i+1].y)) / 2;&lt;br /&gt;      }&lt;br /&gt;      sum *= .5;&lt;br /&gt;      return sum;&lt;br /&gt; }&lt;br /&gt; this.centroid = function() {&lt;br /&gt;      var myPoints = this.getPoints();&lt;br /&gt;      myPoints[myPoints.length ] = myPoints[0];&lt;br /&gt;      var area = 1 / (6 * this.area());&lt;br /&gt;      var x = 0;&lt;br /&gt;      var y = 0;&lt;br /&gt;      for(var i = 0; i &amp;lt; myPoints.length -1; i++) {&lt;br /&gt;           myPoints[i].clean(); myPoints[i+1].clean();&lt;br /&gt;           var f = (myPoints[i].x*myPoints[i+1].y - myPoints[i+1].x*myPoints[i].y);&lt;br /&gt;           x += ((myPoints[i].x + myPoints[i+1].x)*f);&lt;br /&gt;           y += ((myPoints[i].y + myPoints[i+1].y)*f);&lt;br /&gt;      }&lt;br /&gt;      return new Point(x*area,y*area);&lt;br /&gt; }&lt;br /&gt; this.getPoints = function() {&lt;br /&gt;      var retArr = new Array();&lt;br /&gt;      for(var i = 0; i &amp;lt; this.Lines.length; i++) {&lt;br /&gt;           retArr[retArr.length] = this.Lines[i].pointA;&lt;br /&gt;      }&lt;br /&gt;      return retArr;&lt;br /&gt; }&lt;br /&gt; this.buffer = function(rad) {&lt;br /&gt;      var center = this.centroid();&lt;br /&gt;      var bufferedPoints = new Array();&lt;br /&gt;      var myPoints = this.getPoints();&lt;br /&gt;      myPoints[myPoints.length] = myPoints[0];&lt;br /&gt;      var elimBuffers = new Array();&lt;br /&gt;      elimBuffers[0] = this;&lt;br /&gt;      for(var i = 0; i &amp;lt; myPoints.length -1; i++) {&lt;br /&gt;           var line = new LineSegment(myPoints[i], myPoints[i+1]);&lt;br /&gt;           elimBuffers[elimBuffers.length] = line.buffer(rad);&lt;br /&gt;           var circ = new Circle();&lt;br /&gt;           circ.Center = myPoints[i];&lt;br /&gt;           circ.Radius = rad;&lt;br /&gt;           elimBuffers[elimBuffers.length] = circ;&lt;br /&gt;      }&lt;br /&gt;      return elimBuffers;&lt;br /&gt; }&lt;br /&gt;}&lt;br /&gt;function Circle(cCenter, cRadius) {&lt;br /&gt; this.Center = cCenter;&lt;br /&gt; this.Radius = cRadius;&lt;br /&gt; this.type = 'circle';&lt;br /&gt; this.isMemberPoint = function(P) {&lt;br /&gt;      var line = new LineSegment(this.Center, P);&lt;br /&gt;      var len = line.getLength();&lt;br /&gt;      return(len &amp;lt; this.Radius);&lt;br /&gt; }&lt;br /&gt; function square(x) {&lt;br /&gt;      return (x*x);&lt;br /&gt; }&lt;br /&gt; this.minX = function() {&lt;br /&gt;      return (this.Center.x - this.Radius);&lt;br /&gt; }&lt;br /&gt; this.maxX = function() {&lt;br /&gt;      return(this.Center.x + this.Radius);&lt;br /&gt; }&lt;br /&gt; this.minY = function() {&lt;br /&gt;      return (this.Center.y - this.Radius);&lt;br /&gt; }&lt;br /&gt; this.maxY = function() {&lt;br /&gt;      return (this.Center.y + this.Radius);&lt;br /&gt; }&lt;br /&gt; this.isMember = function(Poly) {&lt;br /&gt;      if(Poly.type.match(/point/i)) {&lt;br /&gt;           return this.isMemberPoint(Poly);&lt;br /&gt;      } else if(Poly.type.match(/circle/i)) {&lt;br /&gt;           var testLine = new LineSegment(this.Center, Poly.Center);&lt;br /&gt;           var totalLength = this.Radius + Poly.Radius;&lt;br /&gt;           return(testLine.getLength() &amp;lt;= totalLength);&lt;br /&gt;      } else if(Poly.type.match(/line/i)) {&lt;br /&gt;           var x1 = Poly.pointA.x;&lt;br /&gt;           var y1 = Poly.pointA.y;&lt;br /&gt;           var x2 = Poly.pointB.x;&lt;br /&gt;           var y2 = Poly.pointB.y;&lt;br /&gt;           var x3 = this.Center.x;&lt;br /&gt;           var y3 = this.Center.y;&lt;br /&gt;           var r = parseFloat(this.Radius);&lt;br /&gt;           var diffX = x2-x1;&lt;br /&gt;           var diffY = y2-y1;&lt;br /&gt;           var diffXSquared = square(diffX);&lt;br /&gt;           var diffYSquared = square(diffY);&lt;br /&gt;           var a = diffXSquared + diffYSquared;&lt;br /&gt;           var b = 2* (diffX*(x1 - x3) + diffY*(y1 - y3));&lt;br /&gt;           var c = square(x3) + square(y3) + square(x1) + square(y1) - 2* ( x3*x1 + y3*y1 ) - square(r);&lt;br /&gt;           var det = b * b - 4 * a * c;&lt;br /&gt;           if(det &amp;lt;= 0) { return false; }&lt;br /&gt;           b = (x3 - x1)*(x2 - x1) + (y3 - y1)*(y2 - y1);&lt;br /&gt;           //b = (x2 - x1)*(x2 - x1) + (y2 - y1)*(y2 - y1);&lt;br /&gt;           var u= b/a;&lt;br /&gt;           //logDebugMessage('Determinate', false, u);&lt;br /&gt;           return(0 &amp;lt;= u &amp;amp;&amp;amp; u &amp;lt;= 1);&lt;br /&gt;      } else if(Poly.type.match(/poly/i)) {&lt;br /&gt;           var points = Poly.getPoints();&lt;br /&gt;           var member = false;&lt;br /&gt;           for(var i = 0; i &amp;lt; points.length &amp;amp;&amp;amp; !member; i++) {&lt;br /&gt;                if(this.isMemberPoint(points[i])) {&lt;br /&gt;                     return true;&lt;br /&gt;                }&lt;br /&gt;           }&lt;br /&gt;           var theLines = Poly.Lines;&lt;br /&gt;           for(var i = 0; i &amp;lt; theLines.length &amp;amp;&amp;amp; !member; i++) {&lt;br /&gt;                if(this.isMember(theLines[i])) {&lt;br /&gt;                     return true;&lt;br /&gt;                }&lt;br /&gt;           }&lt;br /&gt;           return false;&lt;br /&gt;      }&lt;br /&gt;      return false;&lt;br /&gt; }&lt;br /&gt; this.toString = function(delim) {&lt;br /&gt;      var PointA = new Point(this.Center.x - this.Radius, this.Center.y - this.Radius);&lt;br /&gt;      var PointB = new Point(this.Center.x + this.Radius, this.Center.y + this.Radius);&lt;br /&gt;      return(PointA.toString(delim)+delim+PointB.toString(delim));&lt;br /&gt; }&lt;br /&gt; this.buffer = function(rad) {&lt;br /&gt;      var newCirc = new Circle();&lt;br /&gt;      newCirc.Center = this.Center;&lt;br /&gt;      newCirc.Radius = this.Radius + rad;&lt;br /&gt;      return newCirc;&lt;br /&gt; }&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;Please do not remove the copyright notice at the top of the JavaScript.  This file does not belong to me (I just can't remember where I found it).&lt;br /&gt;&lt;br /&gt;And here is the complete map_tools.js file:&lt;br /&gt;&lt;pre style="font-family: arial; font-size: 12px; border: 1px dashed rgb(204, 204, 204); width: 99%; height: auto; overflow: auto; background: none repeat scroll 0% 0% rgb(240, 240, 240); padding: 0px; color: rgb(0, 0, 0); text-align: left; line-height: 20px;"&gt;&lt;code style="color: rgb(0, 0, 0); word-wrap: normal;"&gt; var cur_tool = ''; &lt;br /&gt;var cur_tab = ''; &lt;br /&gt;var map_id = 'main_map'; &lt;br /&gt;var drag_id = 'rubberband'; &lt;br /&gt;var myDrag = ''; &lt;br /&gt;var set_tm = 0; &lt;br /&gt;// Variables from PHP Page &lt;br /&gt;var php_drag_box = 'jsbox'; &lt;br /&gt;var php_tool_id = 'jstool'; &lt;br /&gt;var php_tab_page = 'js_tab'; &lt;br /&gt;var php_savefile = 'savequery'; &lt;br /&gt;var php_queryfile = 'queryfile'; &lt;br /&gt;// Map Location &lt;br /&gt;var mouseX = 0; &lt;br /&gt;var mouseY = 0; &lt;br /&gt;var imgX = 0; &lt;br /&gt;var imgY = 0; &lt;br /&gt;var hspc = -1; &lt;br /&gt;var vspc = -1; &lt;br /&gt;var iWidth = 0; &lt;br /&gt;var iHeight = 0; &lt;br /&gt;// Mouse &lt;br /&gt;var bTracking = false; &lt;br /&gt;var firstx = 0; &lt;br /&gt;var firsty = 0; &lt;br /&gt;var secondx = 0; &lt;br /&gt;var secondy = 0; &lt;br /&gt;var sep = '_'; &lt;br /&gt;var bSelect = false; &lt;br /&gt;var zleft = 0; &lt;br /&gt;var zright = 0; &lt;br /&gt;var ztop = 0; &lt;br /&gt;var zbottom = 0; &lt;br /&gt;var x1=0; &lt;br /&gt;var y1=0; &lt;br /&gt;var x2=0; &lt;br /&gt;var y2=0; &lt;br /&gt;// Box Co-ordinates &lt;br /&gt;var coordx1 = 0; &lt;br /&gt;var coordx2 = 0; &lt;br /&gt;var coordy1 = 0; &lt;br /&gt;var coordy2 = 0; &lt;br /&gt;// Address Lookup &lt;br /&gt;var xmlHttp; &lt;br /&gt;var lastKeyPress; &lt;br /&gt;var intval; &lt;br /&gt;// Query Tool &lt;br /&gt;var lastMouseMove; &lt;br /&gt;var MouseInt; &lt;br /&gt;var qryHttp; &lt;br /&gt;var srchX = 0; &lt;br /&gt;var srchY = 0; &lt;br /&gt;var mX = 0; &lt;br /&gt;var mY = 0; &lt;br /&gt;var curDist = 0; &lt;br /&gt;var mouseDist = 0; &lt;br /&gt;// Drawing Canvas Control &lt;br /&gt;var canvas_id = 'map_canvas'; &lt;br /&gt;var pointerX = 0; &lt;br /&gt;var pointerY = 0; &lt;br /&gt;var points = new Array(); &lt;br /&gt;function map_tools(seltool){ &lt;br /&gt;     // Show or Hide Drawing Canvas &lt;br /&gt;     if (seltool == 'measure') { &lt;br /&gt;          document.getElementById(canvas_id).style.zindex = 22; &lt;br /&gt;          document.getElementById(canvas_id).style.visibility = 'visible'; &lt;br /&gt;          document.getElementById(canvas_id).style.display = 'block'; &lt;br /&gt;          clearDrawingArea(); &lt;br /&gt;          mouseDist = 0; &lt;br /&gt;          curDist = 0; &lt;br /&gt;     } else { &lt;br /&gt;          document.getElementById(canvas_id).style.zindex = 0; &lt;br /&gt;          document.getElementById(canvas_id).style.visibility = 'hidden'; &lt;br /&gt;          document.getElementById(canvas_id).style.display = 'none'; &lt;br /&gt;          document.getElementById("dist").innerHTML = ''; &lt;br /&gt;          document.getElementById("seg_dist").innerHTML = ''; &lt;br /&gt;     } &lt;br /&gt;     // set the current tool      &lt;br /&gt;     cur_tool = seltool; &lt;br /&gt;     return true; &lt;br /&gt;} &lt;br /&gt;function mapOver(e) { &lt;br /&gt;     getImageXY(e); &lt;br /&gt;     var minx = document.getElementById("minx").value * 1; &lt;br /&gt;     var miny = document.getElementById("miny").value * 1; &lt;br /&gt;     var maxx = document.getElementById("maxx").value * 1; &lt;br /&gt;     var maxy = document.getElementById("maxy").value * 1; &lt;br /&gt;     iWidth = document.getElementById("imgw").value * 1; &lt;br /&gt;     iHeight = document.getElementById("imgh").value * 1; &lt;br /&gt;     var scale = document.getElementById("scale").value * 1; &lt;br /&gt;     var geoWidth = (maxx - minx) / iWidth; &lt;br /&gt;     var geoHeight = (maxy - miny) / iHeight; &lt;br /&gt;     var coord_x = minx + (imgX * geoWidth); &lt;br /&gt;     var coord_y = maxy - (imgY * geoWidth); &lt;br /&gt;     var showQB = false; &lt;br /&gt;     if (bTracking) { &lt;br /&gt;       x2 = mouseX = Math.min(Math.max(mouseX, hspc), iWidth + hspc); &lt;br /&gt;       y2 = mouseY = Math.min(Math.max(mouseY, vspc), iHeight + vspc); &lt;br /&gt;       setClip(); &lt;br /&gt;          coordx2 = minx + (imgX * geoWidth); &lt;br /&gt;       coordy2 = maxy - (imgY * geoWidth); &lt;br /&gt;       document.getElementById("coords").innerHTML = "Dragging: (" + Math.round(coordx1) + "," + Math.round(coordy1) + ")&amp;lt;br&amp;gt;(" + Math.round(coordx2) + ", " + Math.round(coordy2) + ")"; &lt;br /&gt;  } &lt;br /&gt;     if (insideMap()) { &lt;br /&gt;          document.getElementById("coord_x").innerHTML = "East: " + Math.round(coord_x) + " m"; &lt;br /&gt;          document.getElementById("coord_y").innerHTML = "North: " + Math.round(coord_y) + " m"; &lt;br /&gt;          // Draw Line to Mouse &lt;br /&gt;          if (cur_tool == 'measure' &amp;amp;&amp;amp; points.length &amp;gt;= 1) { &lt;br /&gt;               //drawToMouse(points[points.length - 1]); &lt;br /&gt;               calcDistToMouse(); &lt;br /&gt;               showQB = true; &lt;br /&gt;          } &lt;br /&gt;          // Move Query Box &lt;br /&gt;          if (cur_tool == 'query') { &lt;br /&gt;               srchX = coord_x; &lt;br /&gt;               srchY = coord_y; &lt;br /&gt;               // Stop Mouse sensitivity problems &lt;br /&gt;               var mS = 5; &lt;br /&gt;               if (mouseX &amp;gt; (mX + mS) || mouseX &amp;lt; (mX - mS) || mouseY &amp;gt; (mY + mS) || mouseY &amp;lt; (mY - mS)) { &lt;br /&gt;                    mX = mouseX; &lt;br /&gt;                    mY = mouseY; &lt;br /&gt;                    MouseWait(); &lt;br /&gt;               } &lt;br /&gt;               showQB = true &lt;br /&gt;          } else { &lt;br /&gt;               if (!showQB) { &lt;br /&gt;                    document.getElementById('queryBox').style.visibility = 'hidden'; &lt;br /&gt;                    document.getElementById('queryBox').style.display = 'none'; &lt;br /&gt;               } &lt;br /&gt;          } &lt;br /&gt;     } else { &lt;br /&gt;          document.getElementById('queryBox').style.visibility = 'hidden'; &lt;br /&gt;          document.getElementById('queryBox').style.display = 'none'; &lt;br /&gt;     } &lt;br /&gt;     return false; &lt;br /&gt;} &lt;br /&gt;function getImageXY(e) { &lt;br /&gt; var i = document.getElementById(map_id); &lt;br /&gt; var scrX = 0; &lt;br /&gt; var scrY = 0; &lt;br /&gt; hspc = findPosX(i); &lt;br /&gt; vspc = findPosY(i); &lt;br /&gt; // Setup Window Event if Needed &lt;br /&gt; if (!e) var e = window.event; &lt;br /&gt; // Get Position &lt;br /&gt; //if (e.pageX || e.pageY) { &lt;br /&gt; // mouseX = e.pageX - i.style.pixelLeft; &lt;br /&gt; // mouseY = e.pageY - i.style.pixelRight; &lt;br /&gt; //} else { &lt;br /&gt; if( typeof( window.pageYOffset ) == 'number' ) { &lt;br /&gt;  //Netscape compliant &lt;br /&gt;  scrY = window.pageYOffset; &lt;br /&gt;  scrX = window.pageXOffset; &lt;br /&gt; } else if( document.body &amp;amp;&amp;amp; ( document.body.scrollLeft || document.body.scrollTop ) ) { &lt;br /&gt;  //DOM compliant &lt;br /&gt;  scrY = document.body.scrollTop; &lt;br /&gt;  scrX = document.body.scrollLeft; &lt;br /&gt; } else if( document.documentElement &amp;amp;&amp;amp; ( document.documentElement.scrollLeft || document.documentElement.scrollTop ) ) { &lt;br /&gt;  //IE6 standards compliant mode &lt;br /&gt;  scrY = document.documentElement.scrollTop; &lt;br /&gt;  scrX = document.documentElement.scrollLeft; &lt;br /&gt; } &lt;br /&gt; mouseX = e.clientX + scrX; &lt;br /&gt; mouseY = e.clientY + scrY; &lt;br /&gt; //} &lt;br /&gt; pointerX = mouseX - hspc; &lt;br /&gt; pointerY = mouseY - vspc; &lt;br /&gt;} &lt;br /&gt;function findPosX(obj) { &lt;br /&gt; var curleft = 0; &lt;br /&gt; if (obj.offsetParent) { &lt;br /&gt; while (obj.offsetParent) { &lt;br /&gt;  curleft += obj.offsetLeft &lt;br /&gt;  obj = obj.offsetParent; &lt;br /&gt; } &lt;br /&gt; } else if (obj.x) &lt;br /&gt; curleft += obj.x; &lt;br /&gt; return curleft; &lt;br /&gt;} &lt;br /&gt;function findPosY(obj) { &lt;br /&gt; var curtop = 0; &lt;br /&gt; if (obj.offsetParent) { &lt;br /&gt; while (obj.offsetParent) { &lt;br /&gt;  curtop += obj.offsetTop &lt;br /&gt;  obj = obj.offsetParent; &lt;br /&gt; } &lt;br /&gt; } else if (obj.y) &lt;br /&gt; curtop += obj.y; &lt;br /&gt; return curtop; &lt;br /&gt;} &lt;br /&gt;function insideMap() { &lt;br /&gt; imgX = mouseX - hspc; &lt;br /&gt; imgY = mouseY - vspc; &lt;br /&gt; return ((imgX &amp;gt;= 0) &amp;amp;&amp;amp; (imgX &amp;lt; iWidth) &amp;amp;&amp;amp; (imgY &amp;gt;= 0) &amp;amp;&amp;amp; (imgY &amp;lt; iHeight)); &lt;br /&gt;} &lt;br /&gt;function setClip() { &lt;br /&gt; zright = Math.max(x1, x2); &lt;br /&gt; zleft  = Math.min(x1, x2); &lt;br /&gt; zbottom = Math.max(y1, y2); &lt;br /&gt; ztop  = Math.min(y1, y2); &lt;br /&gt; if ((x1 != x2) &amp;amp;&amp;amp; (y1 != y2)) { &lt;br /&gt;  var r = document.getElementById(drag_id); &lt;br /&gt;  r.style.left = zleft + 'px'; &lt;br /&gt;  r.style.top = ztop + 'px'; &lt;br /&gt;  r.style.width = zright - zleft + 'px'; &lt;br /&gt;  r.style.height = zbottom - ztop + 'px'; &lt;br /&gt; } &lt;br /&gt;} &lt;br /&gt;function mousedown(e){ &lt;br /&gt; // Exit if Pan Tool &lt;br /&gt; if (cur_tool == 'map_pan') { &lt;br /&gt;      Element.setOpacity('main_map', 0.5); &lt;br /&gt;      return true; &lt;br /&gt; } &lt;br /&gt; if (!e) var e = window.event; &lt;br /&gt; var t = (e.target) ? e.target : e.srcElement; &lt;br /&gt; if (!(t.id == map_id || t.id == drag_id)) { &lt;br /&gt;  return true; &lt;br /&gt; } &lt;br /&gt; // Test for Right Mouse Button &lt;br /&gt; if (RightMouseButton(e)) { &lt;br /&gt;      return false; &lt;br /&gt; } &lt;br /&gt; // Check Tool &lt;br /&gt; var current_tool = cur_tool; &lt;br /&gt; // Setup scaling stuff &lt;br /&gt; var minx = document.getElementById("minx").value * 1; &lt;br /&gt; var miny = document.getElementById("miny").value * 1; &lt;br /&gt; var maxx = document.getElementById("maxx").value * 1; &lt;br /&gt; var maxy = document.getElementById("maxy").value * 1; &lt;br /&gt; iWidth = document.getElementById("imgw").value * 1; &lt;br /&gt; iHeight = document.getElementById("imgh").value * 1; &lt;br /&gt; var scale = document.getElementById("scale").value * 1; &lt;br /&gt; var geoWidth = (maxx - minx) / iWidth; &lt;br /&gt; var geoHeight = (maxy - miny) / iHeight; &lt;br /&gt; switch(current_tool) { &lt;br /&gt;  case 'zoomin': &lt;br /&gt;  case 'zoomout': &lt;br /&gt;  case 'query': &lt;br /&gt;      getImageXY(e); &lt;br /&gt;      if (!bTracking &amp;amp;&amp;amp; insideMap()) { &lt;br /&gt;       x1 = mouseX = Math.min(Math.max(mouseX, hspc), iWidth + hspc); &lt;br /&gt;       y1 = mouseY = Math.min(Math.max(mouseY, vspc), iHeight + vspc); &lt;br /&gt;          coordx1 = minx + (imgX * geoWidth); &lt;br /&gt;       coordy1 = maxy - (imgY * geoWidth); &lt;br /&gt;       startRubber(e); &lt;br /&gt;       return false; &lt;br /&gt;      } else if (bTracking) { &lt;br /&gt;       mapOver(e); &lt;br /&gt;       stopRubber(e); &lt;br /&gt;       } &lt;br /&gt;       break; &lt;br /&gt;      default: &lt;br /&gt;       document.getElementById(php_tool_id).value = cur_tool; &lt;br /&gt; } &lt;br /&gt; return false; &lt;br /&gt;} &lt;br /&gt;function mouseup(e) { &lt;br /&gt; // Exit if Pan Tool &lt;br /&gt; if (cur_tool == 'map_pan') { &lt;br /&gt;      Element.setOpacity('main_map', 1); &lt;br /&gt;      return true; &lt;br /&gt; } &lt;br /&gt; var end_line = 0; &lt;br /&gt; // Test for Right Mouse Button &lt;br /&gt; if (RightMouseButton(e)) { &lt;br /&gt;      return false; &lt;br /&gt; } &lt;br /&gt; // Submit if inside Map Area &lt;br /&gt; if (insideMap()) { &lt;br /&gt;      if (cur_tool == 'measure') { &lt;br /&gt;          clearDrawingArea(); &lt;br /&gt;          // Check if New Point is the Same as the last (within 10 pixels) &lt;br /&gt;          if (points.length != 0 &amp;amp;&amp;amp; &lt;br /&gt;               points[points.length - 1].x &amp;gt;= pointerX - 2 &amp;amp;&amp;amp; &lt;br /&gt;               points[points.length - 1].x &amp;lt;= pointerX + 2 &amp;amp;&amp;amp; &lt;br /&gt;               points[points.length - 1].y &amp;gt;= pointerY - 2 &amp;amp;&amp;amp; &lt;br /&gt;               points[points.length - 1].y &amp;lt;= pointerY + 2 ) { &lt;br /&gt;               end_line = 1; &lt;br /&gt;          } else { &lt;br /&gt;               // Add point to Array &lt;br /&gt;               points[points.length] = new Point(pointerX, pointerY); &lt;br /&gt;          } &lt;br /&gt;          drawLines(points); &lt;br /&gt;          drawAllPoints(points); &lt;br /&gt;          calcDistance(); &lt;br /&gt;          if (end_line == 1) { &lt;br /&gt;               points = new Array(); &lt;br /&gt;          } &lt;br /&gt;      } &lt;br /&gt; } &lt;br /&gt;} &lt;br /&gt;// Function Right Mouse Button &lt;br /&gt;function RightMouseButton(e){ &lt;br /&gt;     if (navigator.appName == 'Netscape' &amp;amp;&amp;amp; e.which == 3) { &lt;br /&gt;   //alert("no right click please") &lt;br /&gt;   return true; &lt;br /&gt;     } else { &lt;br /&gt;          if (navigator.appName == 'Microsoft Internet Explorer' &amp;amp;&amp;amp; event.button == 2) { &lt;br /&gt;          //alert("no right click please") &lt;br /&gt;          return true; &lt;br /&gt;    } &lt;br /&gt;  } &lt;br /&gt;} &lt;br /&gt;/** &lt;br /&gt; * The following block is for the measure tool and drawing on the canvas. &lt;br /&gt; **/ &lt;br /&gt;// Function to clear the drawing Canvas &lt;br /&gt;function clearDrawingArea(){ &lt;br /&gt;     refreshCanvas(); &lt;br /&gt;     var ctx = document.getElementById(canvas_id).getContext("2d"); &lt;br /&gt;     ctx.clearRect(0 , 0, iWidth, iHeight); &lt;br /&gt;} &lt;br /&gt;// Function to Refresh the drawing Canvas &lt;br /&gt;function refreshCanvas() { &lt;br /&gt;     document.getElementById(canvas_id).style.zIndex = 20; &lt;br /&gt;     document.getElementById(canvas_id).style.position = 'absolute'; &lt;br /&gt;     document.getElementById(canvas_id).style.visibility = 'visible'; &lt;br /&gt;     document.getElementById(canvas_id).style.display = 'block'; &lt;br /&gt;} &lt;br /&gt;// Function to draw a point on the canvas &lt;br /&gt;function drawPoint(x, y){ &lt;br /&gt;     var ctx = document.getElementById(canvas_id).getContext("2d"); &lt;br /&gt;     ctx.save(); &lt;br /&gt;     ctx.strokeStyle = "red"; &lt;br /&gt;     ctx.fillStyle = "red"; &lt;br /&gt;     ctx.beginPath(); &lt;br /&gt;     //ctx.arc(ZoomPoint.x, ZoomPoint.y, 3, 0, Math.PI * 2, true); &lt;br /&gt;     //ctx.arc(DrawnPoints[i].x, DrawnPoints[i].y, 3, 0, Math.PI * 2, true); &lt;br /&gt;     ctx.arc(x, y, 3, 0, Math.PI * 2, true); &lt;br /&gt;     ctx.fill(); &lt;br /&gt;     ctx.closePath(); &lt;br /&gt;     ctx.restore(); &lt;br /&gt;} &lt;br /&gt;// Function to draw all points in an array &lt;br /&gt;function drawAllPoints(pts){ &lt;br /&gt;     for (i = 0; i &amp;lt; pts.length; i++ ) { &lt;br /&gt;          drawPoint(pts[i].x, pts[i].y); &lt;br /&gt;     } &lt;br /&gt;} &lt;br /&gt;// Function to draw red lines &lt;br /&gt;function drawLines(pts){ &lt;br /&gt;     // Do nothing if less than 2 points &lt;br /&gt;     if (pts.length &amp;lt;= 1 ) { &lt;br /&gt;          return false; &lt;br /&gt;     } &lt;br /&gt;      // Start Drawing &lt;br /&gt;     var ctx = document.getElementById(canvas_id).getContext("2d"); &lt;br /&gt;     ctx.save(); &lt;br /&gt;     ctx.strokeStyle = "red"; &lt;br /&gt;     ctx.beginPath(); &lt;br /&gt;     ctx.moveTo(pts[0].x, pts[0].y); &lt;br /&gt;     for (var i = 1; i &amp;lt; pts.length; i++) { &lt;br /&gt;          ctx.lineTo(pts[i].x,pts[i].y); &lt;br /&gt;     } &lt;br /&gt;     //ctx.closePath(); &lt;br /&gt;     ctx.stroke(); &lt;br /&gt;     ctx.restore(); &lt;br /&gt;} &lt;br /&gt;// Function to draw red lines &lt;br /&gt;function drawToMouse(pt){ &lt;br /&gt;      // Start Drawing &lt;br /&gt;     var ctx = document.getElementById(canvas_id).getContext("2d"); &lt;br /&gt;     ctx.save(); &lt;br /&gt;     ctx.strokeStyle = "blue"; &lt;br /&gt;     ctx.beginPath(); &lt;br /&gt;     ctx.moveTo(pt.x, pt.y); &lt;br /&gt;     ctx.lineTo(pointerX, pointerY); &lt;br /&gt;     //ctx.closePath(); &lt;br /&gt;     ctx.stroke(); &lt;br /&gt;     ctx.restore(); &lt;br /&gt;} &lt;br /&gt;/** &lt;br /&gt; * Function to calculate the distance and display it. &lt;br /&gt; * @access public &lt;br /&gt; * @return void &lt;br /&gt; **/ &lt;br /&gt;function calcDistance(){ &lt;br /&gt;     // Check for more than 1 point &lt;br /&gt;     if (points.length &amp;lt;= 1) { &lt;br /&gt;          curDist = 0; &lt;br /&gt;          return false; &lt;br /&gt;     } &lt;br /&gt;     var minx = document.getElementById("minx").value * 1; &lt;br /&gt;     var miny = document.getElementById("miny").value * 1; &lt;br /&gt;     var maxx = document.getElementById("maxx").value * 1; &lt;br /&gt;     var maxy = document.getElementById("maxy").value * 1; &lt;br /&gt;     iWidth = document.getElementById("imgw").value * 1; &lt;br /&gt;     iHeight = document.getElementById("imgh").value * 1; &lt;br /&gt;     var scale = document.getElementById("scale").value * 1; &lt;br /&gt;     var geoWidth = (maxx - minx) / iWidth; &lt;br /&gt;     var geoHeight = (maxy - miny) / iHeight; &lt;br /&gt;     var geoPts = new Array(); &lt;br /&gt;     var dist = 0; &lt;br /&gt;     // Convert Points to Geographic Co-ordinates &lt;br /&gt;     for (var i = 0; i &amp;lt; points.length; i++) { &lt;br /&gt;          var val_x = minx + (points[i].x * geoWidth); &lt;br /&gt;          var val_y = maxy - (points[i].y * geoWidth); &lt;br /&gt;          geoPts[i] = new Point(val_x, val_y); &lt;br /&gt;     } &lt;br /&gt;     // Create Line Segments &lt;br /&gt;     for (var i = 1; i &amp;lt; geoPts.length; i++) { &lt;br /&gt;          var il = i - 1; &lt;br /&gt;          var geoLine = new LineSegment(geoPts[il], geoPts[i]); &lt;br /&gt;          dist = dist + geoLine.getLength(); &lt;br /&gt;     } &lt;br /&gt;     // Output to Screen &lt;br /&gt;     document.getElementById("dist").innerHTML = "Distance: " + Math.round(dist * 100) / 100 + " metres"; &lt;br /&gt;     curDist = Math.round(dist * 100) / 100; &lt;br /&gt;} &lt;br /&gt;/** &lt;br /&gt; * Function to calculate the distance and display it. &lt;br /&gt; * @access public &lt;br /&gt; * @return void &lt;br /&gt; **/ &lt;br /&gt;function calcDistToMouse(){ &lt;br /&gt;     // Check for more than 1 point &lt;br /&gt;     if (points.length &amp;lt; 1) { &lt;br /&gt;          return false; &lt;br /&gt;     } &lt;br /&gt;     var minx = document.getElementById("minx").value * 1; &lt;br /&gt;     var miny = document.getElementById("miny").value * 1; &lt;br /&gt;     var maxx = document.getElementById("maxx").value * 1; &lt;br /&gt;     var maxy = document.getElementById("maxy").value * 1; &lt;br /&gt;     iWidth = document.getElementById("imgw").value * 1; &lt;br /&gt;     iHeight = document.getElementById("imgh").value * 1; &lt;br /&gt;     var scale = document.getElementById("scale").value * 1; &lt;br /&gt;     var geoWidth = (maxx - minx) / iWidth; &lt;br /&gt;     var geoHeight = (maxy - miny) / iHeight; &lt;br /&gt;     var geoPts = new Array(); &lt;br /&gt;     // Convert Last Point to Geographic Co-ordinates &lt;br /&gt;     var val_x = minx + (points[points.length - 1].x * geoWidth); &lt;br /&gt;     var val_y = maxy - (points[points.length - 1].y * geoWidth); &lt;br /&gt;     geoPts[0] = new Point(val_x, val_y); &lt;br /&gt;     // Convert Mouse Pointer &lt;br /&gt;     val_x = minx + (pointerX * geoWidth); &lt;br /&gt;     val_y = maxy - (pointerY * geoWidth); &lt;br /&gt;     geoPts[1] = new Point(val_x, val_y); &lt;br /&gt;     // Create Line Segment &lt;br /&gt;     var geoLine = new LineSegment(geoPts[0], geoPts[1]); &lt;br /&gt;     // Output to Screen &lt;br /&gt;     document.getElementById("seg_dist").innerHTML = "Distance to mouse: " + Math.round(geoLine.getLength() * 100) / 100 + " metres"; &lt;br /&gt;     mouseDist = Math.round(geoLine.getLength() * 100) / 100; &lt;br /&gt;     showDistance(); &lt;br /&gt;} &lt;br /&gt;/** &lt;br /&gt; * Shows the distance to the mouse &lt;br /&gt; * @access public &lt;br /&gt; * @return void &lt;br /&gt; **/ &lt;br /&gt;function showDistance(){ &lt;br /&gt;          // Set Box X Position &lt;br /&gt;          document.getElementById('queryBox').style.left = (mouseX + 10) + 'px'; &lt;br /&gt;          document.getElementById('queryBox').style.top = (mouseY - 10) + 'px'; &lt;br /&gt;          document.getElementById('queryBox').style.visibility = 'visible'; &lt;br /&gt;          document.getElementById('queryBox').style.display = 'block'; &lt;br /&gt;          // Element.setOpacity('queryBox', 0.8); &lt;br /&gt;          var dist = Math.round((curDist + mouseDist) * 100) / 100; &lt;br /&gt;          var htmldata = '&amp;lt;table&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;' + dist + 'm&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;lt;/table&amp;gt;'; &lt;br /&gt;          document.getElementById('queryTableData').innerHTML = htmldata; &lt;br /&gt;} &lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;I have actually tested this, and it works.   Special thanks to Venkat for helping me sort through this code and getting a sample page that works.&lt;br /&gt;&lt;br /&gt;Have fun...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6195961493286457645-8614843787135454615?l=iantidy.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/nc5CDWvNZ-kc9E_IPm2n6wqZCjM/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/nc5CDWvNZ-kc9E_IPm2n6wqZCjM/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/nc5CDWvNZ-kc9E_IPm2n6wqZCjM/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/nc5CDWvNZ-kc9E_IPm2n6wqZCjM/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/iantidy?a=fihw4eWT7x0:yBKGhVozx5E:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/iantidy?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/iantidy?a=fihw4eWT7x0:yBKGhVozx5E:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/iantidy?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/iantidy/~4/fihw4eWT7x0" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/iantidy/~3/fihw4eWT7x0/html-sample-for-mapserver-measure-tool.html</link><author>noreply@blogger.com (Ian Tidy)</author><thr:total>1</thr:total><feedburner:origLink>http://iantidy.blogspot.com/2010/09/html-sample-for-mapserver-measure-tool.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-6195961493286457645.post-1248391051921624498</guid><pubDate>Fri, 06 Aug 2010 09:02:00 +0000</pubDate><atom:updated>2010-08-06T22:02:42.887+12:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">JavaScript</category><category domain="http://www.blogger.com/atom/ns#">UMN MapServer</category><title>JavaScript Measure Tool - Part 2</title><description>Some time ago I wrote a post with code for a JavaScript based measure tool (see &lt;a href="http://iantidy.blogspot.com/2008/01/javascript-measure-tool-for-umn.html"&gt;http://iantidy.blogspot.com/2008/01/javascript-measure-tool-for-umn.html&lt;/a&gt;) that I use with UMN MapServer.  A few people have asked for additional code and help with implementing this piece of JavaScript.&lt;br /&gt;&lt;br /&gt;So I have finally spent some time to write additional notes and extract the additional code.&lt;br /&gt;&lt;br /&gt;First of all, if you are running Internet Explorer then you may need Explorer Canvas (&lt;a href="http://code.google.com/p/explorercanvas/"&gt;http://code.google.com/p/explorercanvas/&lt;/a&gt;), also it useful to have a JavaScript debugging tool.  I use either eclpise (&lt;a href="http://eclipse.org/"&gt;http://eclipse.org/&lt;/a&gt;) or Mozilla FireFox (&lt;a href="http://www.mozilla.com/"&gt;http://www.mozilla.com/&lt;/a&gt;) and FireBug (&lt;a href="http://getfirebug.com/"&gt;http://getfirebug.com/&lt;/a&gt;).&lt;br /&gt;&lt;br /&gt;At the end of the index.php page inside the JavaScript Section, these functions are applied globally to the page to update what the mouse is doing.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;font-size:85%;"&gt;// Set-up to use getMouseXY function onMouseMove&lt;/span&gt;&lt;span style="font-size:85%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:courier new;font-size:85%;"&gt;document.onmousemove = mapOver;   // &lt;-- Track where the mouse is &lt;/span&gt;&lt;span style="font-size:85%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:courier new;font-size:85%;"&gt;document.onmousedown = mousedown; // &lt;-- When the mouse button is pressed document.onmouseup = mouseup;   // &lt;-- When the mouse button is release  &lt;/span&gt;&lt;span style="font-size:85%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;The 'mapOver' function tracks the mouse, while the 'mousedown' and 'mouseup' functions are used to detect things like dragging.  You only need to know the element ID of the Map Image.  You need this to check if the mouse is over the map or not.  In my interface I use other DIV tags  to clip the image as it is dragged.  I also include a few hidden input fields in my html for the javascript.  These include the size of the image (see below):&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;font-size:85%;"&gt;id="minx" value="$map-&gt;extent-&gt;minx"&lt;/span&gt;&lt;span style="font-size:85%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:courier new;font-size:85%;"&gt;id="miny" value="$map-&gt;extent-&gt;miny"&lt;/span&gt;&lt;span style="font-size:85%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:courier new;font-size:85%;"&gt;id="maxx" value="$map-&gt;extent-&gt;maxx"&lt;/span&gt;&lt;span style="font-size:85%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:courier new;font-size:85%;"&gt;id="maxy" value="$map-&gt;extent-&gt;maxy"&lt;/span&gt;&lt;span style="font-size:85%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:courier new;font-size:85%;"&gt;id="imgw" value="$map-&gt;width"&lt;/span&gt;&lt;span style="font-size:85%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:courier new;font-size:85%;"&gt;id="imgh" value="$map-&gt;height"&lt;/span&gt;&lt;span style="font-size:85%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;Here are a couple of functions that I missed on the other post.  The first simply refreshes the canvas, it doesn't redraw any elements on the canvas.  The other function clears the canvas area.&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:courier new;font-size:85%;"&gt;// Function to Refresh the drawing Canvas&lt;/span&gt;&lt;span style="font-size:85%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:courier new;font-size:85%;"&gt;function refreshCanvas() {&lt;/span&gt;&lt;span style="font-size:85%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:courier new;font-size:85%;"&gt; document.getElementById(canvas_id).style.zIndex = 20;&lt;/span&gt;&lt;span style="font-size:85%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:courier new;font-size:85%;"&gt; document.getElementById(canvas_id).style.position = 'absolute';&lt;/span&gt;&lt;span style="font-size:85%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:courier new;font-size:85%;"&gt; document.getElementById(canvas_id).style.visibility = 'visible';&lt;/span&gt;&lt;span style="font-size:85%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:courier new;font-size:85%;"&gt; document.getElementById(canvas_id).style.display = 'block';&lt;/span&gt;&lt;span style="font-size:85%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:courier new;font-size:85%;"&gt;}&lt;/span&gt;&lt;span style="font-size:85%;"&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:courier new;font-size:85%;"&gt;// Function to clear the drawing Canvas&lt;/span&gt;&lt;span style="font-size:85%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:courier new;font-size:85%;"&gt;function clearDrawingArea(){&lt;/span&gt;&lt;span style="font-size:85%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:courier new;font-size:85%;"&gt; refreshCanvas();&lt;/span&gt;&lt;span style="font-size:85%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:courier new;font-size:85%;"&gt; var ctx = document.getElementById(canvas_id).getContext("2d");&lt;/span&gt;&lt;span style="font-size:85%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:courier new;font-size:85%;"&gt; ctx.clearRect(0 , 0, iWidth, iHeight);&lt;/span&gt;&lt;span style="font-size:85%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:courier new;font-size:85%;"&gt;}&lt;/span&gt;&lt;span style="font-size:85%;"&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:courier new;font-size:85%;"&gt;// Global Variables&lt;/span&gt;&lt;span style="font-size:85%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:courier new;font-size:85%;"&gt;var map_id = 'main_map';&lt;/span&gt;&lt;span style="font-size:85%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:courier new;font-size:85%;"&gt;var drag_id = 'rubberband';&lt;/span&gt;&lt;span style="font-size:85%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:courier new;font-size:85%;"&gt;var myDrag = '';&lt;/span&gt;&lt;span style="font-size:85%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:courier new;font-size:85%;"&gt;var set_tm = 0;&lt;/span&gt;&lt;span style="font-size:85%;"&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:courier new;font-size:85%;"&gt;// Variables from PHP Page&lt;/span&gt;&lt;span style="font-size:85%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:courier new;font-size:85%;"&gt;var php_drag_box = 'jsbox';&lt;/span&gt;&lt;span style="font-size:85%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:courier new;font-size:85%;"&gt;var php_tool_id = 'jstool';&lt;/span&gt;&lt;span style="font-size:85%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:courier new;font-size:85%;"&gt;var php_tab_page = 'js_tab';&lt;/span&gt;&lt;span style="font-size:85%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:courier new;font-size:85%;"&gt;var php_savefile = 'savequery';&lt;/span&gt;&lt;span style="font-size:85%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:courier new;font-size:85%;"&gt;var php_queryfile = 'queryfile';&lt;/span&gt;&lt;span style="font-size:85%;"&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:courier new;font-size:85%;"&gt;// Map Location&lt;/span&gt;&lt;span style="font-size:85%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:courier new;font-size:85%;"&gt;var mouseX = 0;&lt;/span&gt;&lt;span style="font-size:85%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:courier new;font-size:85%;"&gt;var mouseY = 0;&lt;/span&gt;&lt;span style="font-size:85%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:courier new;font-size:85%;"&gt;var imgX = 0;&lt;/span&gt;&lt;span style="font-size:85%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:courier new;font-size:85%;"&gt;var imgY = 0;&lt;/span&gt;&lt;span style="font-size:85%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:courier new;font-size:85%;"&gt;var hspc = -1;&lt;/span&gt;&lt;span style="font-size:85%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:courier new;font-size:85%;"&gt;var vspc = -1;&lt;/span&gt;&lt;span style="font-size:85%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:courier new;font-size:85%;"&gt;var iWidth = 0;&lt;/span&gt;&lt;span style="font-size:85%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:courier new;font-size:85%;"&gt;var iHeight = 0;&lt;/span&gt;&lt;span style="font-size:85%;"&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:courier new;font-size:85%;"&gt;// Mouse&lt;/span&gt;&lt;span style="font-size:85%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:courier new;font-size:85%;"&gt;var bTracking = false;&lt;/span&gt;&lt;span style="font-size:85%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:courier new;font-size:85%;"&gt;var firstx = 0;&lt;/span&gt;&lt;span style="font-size:85%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:courier new;font-size:85%;"&gt;var firsty = 0;&lt;/span&gt;&lt;span style="font-size:85%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:courier new;font-size:85%;"&gt;var secondx = 0;&lt;/span&gt;&lt;span style="font-size:85%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:courier new;font-size:85%;"&gt;var secondy = 0;&lt;/span&gt;&lt;span style="font-size:85%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:courier new;font-size:85%;"&gt;var sep = '_';&lt;/span&gt;&lt;span style="font-size:85%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:courier new;font-size:85%;"&gt;var bSelect = false;&lt;/span&gt;&lt;span style="font-size:85%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:courier new;font-size:85%;"&gt;var zleft = 0;&lt;/span&gt;&lt;span style="font-size:85%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:courier new;font-size:85%;"&gt;var zright = 0;&lt;/span&gt;&lt;span style="font-size:85%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:courier new;font-size:85%;"&gt;var ztop = 0;&lt;/span&gt;&lt;span style="font-size:85%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:courier new;font-size:85%;"&gt;var zbottom = 0;&lt;/span&gt;&lt;span style="font-size:85%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:courier new;font-size:85%;"&gt;var x1=0;&lt;/span&gt;&lt;span style="font-size:85%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:courier new;font-size:85%;"&gt;var y1=0;&lt;/span&gt;&lt;span style="font-size:85%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:courier new;font-size:85%;"&gt;var x2=0;&lt;/span&gt;&lt;span style="font-size:85%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:courier new;font-size:85%;"&gt;var y2=0;&lt;/span&gt;&lt;span style="font-size:85%;"&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:courier new;font-size:85%;"&gt;// Box Co-ordinates&lt;/span&gt;&lt;span style="font-size:85%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:courier new;font-size:85%;"&gt;var coordx1 = 0;&lt;/span&gt;&lt;span style="font-size:85%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:courier new;font-size:85%;"&gt;var coordx2 = 0;&lt;/span&gt;&lt;span style="font-size:85%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:courier new;font-size:85%;"&gt;var coordy1 = 0;&lt;/span&gt;&lt;span style="font-size:85%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:courier new;font-size:85%;"&gt;var coordy2 = 0;&lt;/span&gt;&lt;span style="font-size:85%;"&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:courier new;font-size:85%;"&gt;// Address Lookup&lt;/span&gt;&lt;span style="font-size:85%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:courier new;font-size:85%;"&gt;var xmlHttp;&lt;/span&gt;&lt;span style="font-size:85%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:courier new;font-size:85%;"&gt;var lastKeyPress;&lt;/span&gt;&lt;span style="font-size:85%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:courier new;font-size:85%;"&gt;var intval;&lt;/span&gt;&lt;span style="font-size:85%;"&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:courier new;font-size:85%;"&gt;// Query Tool&lt;/span&gt;&lt;span style="font-size:85%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:courier new;font-size:85%;"&gt;var lastMouseMove;&lt;/span&gt;&lt;span style="font-size:85%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:courier new;font-size:85%;"&gt;var MouseInt;&lt;/span&gt;&lt;span style="font-size:85%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:courier new;font-size:85%;"&gt;var qryHttp;&lt;/span&gt;&lt;span style="font-size:85%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:courier new;font-size:85%;"&gt;var srchX = 0;&lt;/span&gt;&lt;span style="font-size:85%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:courier new;font-size:85%;"&gt;var srchY = 0;&lt;/span&gt;&lt;span style="font-size:85%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:courier new;font-size:85%;"&gt;var mX = 0;&lt;/span&gt;&lt;span style="font-size:85%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:courier new;font-size:85%;"&gt;var mY = 0;&lt;/span&gt;&lt;span style="font-size:85%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:courier new;font-size:85%;"&gt;var curDist = 0;&lt;/span&gt;&lt;span style="font-size:85%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:courier new;font-size:85%;"&gt;var mouseDist = 0;&lt;/span&gt;&lt;span style="font-size:85%;"&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:courier new;font-size:85%;"&gt;// Drawing Canvas Control&lt;/span&gt;&lt;span style="font-size:85%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:courier new;font-size:85%;"&gt;var canvas_id = 'map_canvas';&lt;/span&gt;&lt;span style="font-size:85%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:courier new;font-size:85%;"&gt;var pointerX = 0;&lt;/span&gt;&lt;span style="font-size:85%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:courier new;font-size:85%;"&gt;var pointerY = 0;&lt;/span&gt;&lt;span style="font-size:85%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:courier new;font-size:85%;"&gt;var points = new Array();&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;And that is about it, I think.  If you use these notes with the other post, you should be able to happily implement my measure tool.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6195961493286457645-1248391051921624498?l=iantidy.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/h85KCqZprEkGazqt-gPtUm7RUqg/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/h85KCqZprEkGazqt-gPtUm7RUqg/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/h85KCqZprEkGazqt-gPtUm7RUqg/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/h85KCqZprEkGazqt-gPtUm7RUqg/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/iantidy?a=OyqEbBsPIE8:ayA-VB9FnRo:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/iantidy?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/iantidy?a=OyqEbBsPIE8:ayA-VB9FnRo:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/iantidy?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/iantidy/~4/OyqEbBsPIE8" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/iantidy/~3/OyqEbBsPIE8/javascript-measure-tool-part-2.html</link><author>noreply@blogger.com (Ian Tidy)</author><thr:total>2</thr:total><feedburner:origLink>http://iantidy.blogspot.com/2010/08/javascript-measure-tool-part-2.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-6195961493286457645.post-429869969380377508</guid><pubDate>Tue, 09 Feb 2010 21:02:00 +0000</pubDate><atom:updated>2010-02-10T10:09:27.990+13:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">MapInfo SpatialWare</category><category domain="http://www.blogger.com/atom/ns#">Windows 7</category><category domain="http://www.blogger.com/atom/ns#">MapInfo Professional</category><title>SpatialWare got me...</title><description>The other day I decided to rebuild me development PC and install MS Windows 7 on it.  But instead of just upgrading the OS, I decided to delete everything and re-install it.  Everything was going well, I re-installed all my software, MS SQL Server and SpatialWare.  Now one thing to know is that I installed MS SQL Server 2005 32bit and MapInfo SpatialWare 32bit, my PC is running Windows 7 Enterprise 64bit Edition.  So when it prompted me for the path the the SQL server instance, I just clicked 'NEXT' and it all looked good until I tried to use the spatial functions.  SQL Server was installed under 'C:\Program Files (x86)\...' and so was SpatialWare, but when it prompted me for the SQL Server path, the dialog defaulted to 'C:\Program Files\...' and therefore put the DLL files in the wrong place.  I did take me a while to discover this.  Simply un-installing and re-installing SpatialWare fixed the problem.  So the lesson from all this is to read the dialog boxes and paths carefully when installing applications on 64bit machines.&lt;br /&gt;&lt;br /&gt;Another gotcha to watch for is the user password and security (specifically the 'Enforce password policy' option) settings for the 'MAPINFO' user the scripts create.&lt;br /&gt;&lt;br /&gt;Something useful to know when running MapInfo Professional 7.8 and 8.5 on Windows 7, if you want to get rid of the black background when dragging dialog boxes, simply find the MAPINFOW.EXE (typically 'C:\Program Files\MapInfo\Professional\'), right click the EXE and select 'Properties', choose the 'Compatibility' tab, tick the 'Disable desktop composition' option, click 'Apply' and 'OK'. All going well when you next restart MapInfo Professional, you will be able to drag menu bars and dialogs without the black trails.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6195961493286457645-429869969380377508?l=iantidy.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/FE6uLAVU3UbNj8GYrhKR5vFCVjw/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/FE6uLAVU3UbNj8GYrhKR5vFCVjw/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/FE6uLAVU3UbNj8GYrhKR5vFCVjw/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/FE6uLAVU3UbNj8GYrhKR5vFCVjw/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/iantidy?a=69ROeMKH-X0:AwjUnimfREY:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/iantidy?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/iantidy?a=69ROeMKH-X0:AwjUnimfREY:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/iantidy?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/iantidy/~4/69ROeMKH-X0" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/iantidy/~3/69ROeMKH-X0/spatialware-got-me.html</link><author>noreply@blogger.com (Ian Tidy)</author><thr:total>3</thr:total><feedburner:origLink>http://iantidy.blogspot.com/2010/02/spatialware-got-me.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-6195961493286457645.post-722911656383222193</guid><pubDate>Wed, 03 Feb 2010 09:40:00 +0000</pubDate><atom:updated>2010-02-03T22:45:19.040+13:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">MapData Sciences</category><category domain="http://www.blogger.com/atom/ns#">Google</category><category domain="http://www.blogger.com/atom/ns#">Google Maps</category><title>How wrong can Google Maps get it?</title><description>Many of us have heard the stories about using Google Maps and it being wrong.  I thought that Google Maps for New Zealand was pretty good, especially since they have had the StreetView car go through most of the country taking pictures of everything.  But I was wrong.&lt;br /&gt;&lt;br /&gt;I have used Google Maps to help me plan my last 2 trips away.  The first was driving to a football (soccer) tournament in Wanganui, and the second was my families recent trip to Parachute Music Festival in Hamilton.  On both occasions the data (supplied by MapData Sciences Pty Ltd) was just wrong.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Napier to Wanganui&lt;/span&gt;&lt;br /&gt;The first trip from Napier to Wanganui was all good until we had to get to a football park in Wanganui when the instructions told me to turn onto a road, but didn't mention (or take into account) the median barrier between me and the road I was being instructed to take.  Also taking the next street, was a much simpler way to get to where I needed to go.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Napier to Mystery Creek via Hamilton City and Hamilton Airport&lt;/span&gt;&lt;br /&gt;The second trip from Napier to Hamilton, and then from Hamilton city to Hamilton Airport, and Mystery Creek Event Centre (these are all major facilities in NZ).  First the routing engine had me take some strange path from just outside Hamilton to where we stayed in Hamilton, again there was a much simpler way.  The next leg of the trip was to Mystery Creek via the Airport.  The instructions to the airport took me to the control tower, and not the terminal building on the other side of the airport.  At this stage we decided to ignore Google and use a 5+ year old map book.  We found the airport terminal building, and the gate to Mystery Creek was across the road.&lt;br /&gt;&lt;br /&gt;I know this is a combination of the routing Google uses, and the data they are supplied with.  But the data has a 2009 copyright, and my 5 year old map book was better and more up to date.  I expected that Google would at least check the data against the StreetView data that they have also captured to produce instructions and directions that would get you there.  I also noticed that Google add a disclaimer and state that Google Maps should only be used for planning, and I did try to use it to plan my trips, but when the data is that wrong can it be trusted at all?  I have found the Open Street Map (OSM) data to be more accurate, but I haven't tried the routing (maybe on my next trip).  &lt;span style="font-style: italic;"&gt;One of my concerns is this data and service is now being used by smart phones and navigation devices.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;I would be interested in hearing about other peoples experience with Google Maps.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6195961493286457645-722911656383222193?l=iantidy.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/kPhqP4Fjt4dh2TVvTjknRVaubGo/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/kPhqP4Fjt4dh2TVvTjknRVaubGo/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/kPhqP4Fjt4dh2TVvTjknRVaubGo/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/kPhqP4Fjt4dh2TVvTjknRVaubGo/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/iantidy?a=mDKDtk-1JWI:BWYpY0XeCUI:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/iantidy?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/iantidy?a=mDKDtk-1JWI:BWYpY0XeCUI:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/iantidy?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/iantidy/~4/mDKDtk-1JWI" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/iantidy/~3/mDKDtk-1JWI/how-wrong-can-google-maps-get-it.html</link><author>noreply@blogger.com (Ian Tidy)</author><thr:total>0</thr:total><feedburner:origLink>http://iantidy.blogspot.com/2010/02/how-wrong-can-google-maps-get-it.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-6195961493286457645.post-1649316643392698675</guid><pubDate>Tue, 19 Jan 2010 07:17:00 +0000</pubDate><atom:updated>2010-01-19T20:29:48.110+13:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">UMN MapServer</category><category domain="http://www.blogger.com/atom/ns#">MapInfo Exponare</category><category domain="http://www.blogger.com/atom/ns#">PBBI</category><title>MapServer and Exponare</title><description>I have been working on a new dynamic UMN MapServer interface (database driven).  It works really well, I just have a few minor issues to sort out, but a public site is already using it.  But my MapServer work has created some issues.  Parts of the MapServer deployment cross-over and conflict with a PBBI MapInfo Exponare solution operated by another department.  So while my employer standardises on MapInfo Exponare, I will continue my MapServer work as a hobby (amongst everything else).  But it has prompted me to question if PBBI MapInfo Exponare was a better solution than UMN MapServer.&lt;br /&gt;&lt;br /&gt;My personal preference is for MapServer.  Exponare definitely has its place (just like Bentley Web Publisher and ESRI ArcGIS).&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;PBBI MapInfo Exponare&lt;/span&gt;&lt;br /&gt;Exponare is a .NET product, with the server components running on Microsoft IIS.  It is not a development tool, it is an end-user (consultant) installable application (there are a few consultants who have built extensions for Exponare).  Exponare is based on MapInfo MapXtreme .NET mapping engine, while MapXtreme is very fast, I have found Exponare to be slow.  It does have a simple enough configuration tool and interface, and allows you to create simple links from your spatial data to another non-spatial dataset.  While it can be themed and tweaked, it has a fixed screen layout.  PBBI has recently added functionality to get static images from Exponare, but not an interactive map interface that could be included with a site external to Exponare (I would imagine they are working toward this).&lt;br /&gt;&lt;br /&gt;Besides the speed, the other major issue I have with Exponare is the browser support.  I have heard that Exponare 4 is in beta testing, so it will be interesting to see what that produces.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;UMN MapServer&lt;/span&gt;&lt;br /&gt;My preference is MapServer.  This is probably because it is more of a developers tool.  I agree that the lack of tools to generate map files is a pain, but this is slowly being resolved by a number of people (both open-source and private development).  I like the ability of being able to open such a wide variety of data-sources.  I like the control I have over the interface, I can make it as simple or complex as I like.  I like the speed and the ability to do pretty much anything you like.  There is nothing in Exponare that MapServer cannot do.  And MapServer will generally do a better job and faster.  One of my favourite things is being able to develop on multiple platforms.  The same code can be used on both Linux, and windows.  I do most of my day-to-day work in a MS Windows environment, but I run Linux on my home PC, and being able to work on either system is great.  Also being able to make the whole site portable (MS4W is a good example of this).&lt;br /&gt;&lt;br /&gt;I think the thing I like most about MapServer is its flexibility.  I also like the community support, this has been great. &lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Conclusion&lt;/span&gt;&lt;br /&gt;I guess my conclusion is that if you want an off the shelf product, then look at PBBI MapInfo Exponare (along with Bentley Web Publisher, and ESRI ArcGIS).  But if you want a great development tool, then have a look at MapServer.  And there are commercial products that use MapServer as the engine (I am aware of products that uses either PBBI MapInfo MapXtreme .NET (the same engine as Exponare) or UMN MapServer as the engine).&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6195961493286457645-1649316643392698675?l=iantidy.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/fWP90SzSkx6BuZSY3GXGkiYyy1Q/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/fWP90SzSkx6BuZSY3GXGkiYyy1Q/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/fWP90SzSkx6BuZSY3GXGkiYyy1Q/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/fWP90SzSkx6BuZSY3GXGkiYyy1Q/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/iantidy?a=OlA46N50osw:U8OVVqn-zhQ:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/iantidy?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/iantidy?a=OlA46N50osw:U8OVVqn-zhQ:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/iantidy?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/iantidy/~4/OlA46N50osw" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/iantidy/~3/OlA46N50osw/mapserver-and-exponare.html</link><author>noreply@blogger.com (Ian Tidy)</author><thr:total>0</thr:total><feedburner:origLink>http://iantidy.blogspot.com/2010/01/mapserver-and-exponare.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-6195961493286457645.post-3239971811411782242</guid><pubDate>Tue, 19 Jan 2010 06:56:00 +0000</pubDate><atom:updated>2010-01-19T20:35:55.536+13:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">UMN MapServer</category><category domain="http://www.blogger.com/atom/ns#">QGIS</category><category domain="http://www.blogger.com/atom/ns#">IDC</category><category domain="http://www.blogger.com/atom/ns#">Safe FME</category><category domain="http://www.blogger.com/atom/ns#">ESRI ArcGIS</category><title>Welcome to 2010...</title><description>Well another year has started with a hiss an a roar.  With lots of new stuff happening.  I was very interested in the predictions from IDC about the coming year (see &lt;a href="http://www.idc.com/research/predictions10/predictions10.jsp"&gt;http://www.idc.com/research/predictions10/predictions10.jsp&lt;/a&gt;).&lt;br /&gt;&lt;br /&gt;So far this year we have a new release of UMN MapServer (release 5.6.1, see &lt;a href="http://mapserver.org/"&gt;http://mapserver.org&lt;/a&gt;), a new relaease of Quantium GIS (release 1.4.0, see &lt;a href="http://www.qgis.org/"&gt;http://www.qgis.org&lt;/a&gt;), ESRI renaming ArcGIS 9.4 to ArcGIS 10.0 (see &lt;a href="http://www.esri.com/software/arcgis/whats-new/whats-coming.html"&gt;http://www.esri.com/software/arcgis/whats-new/whats-coming.html&lt;/a&gt;) and a new release of Safe FME (release 2010, see &lt;a href="http://www.safe.com/"&gt;http://www.safe.com&lt;/a&gt;).&lt;br /&gt;&lt;br /&gt;The changes to Quantium GIS and FME look really good from my playing around so far.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6195961493286457645-3239971811411782242?l=iantidy.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/980L5tJl-CFIxnDPd5Nk8-QWT64/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/980L5tJl-CFIxnDPd5Nk8-QWT64/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/980L5tJl-CFIxnDPd5Nk8-QWT64/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/980L5tJl-CFIxnDPd5Nk8-QWT64/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/iantidy?a=WzmFFecMxhI:uyaa44F1ZJE:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/iantidy?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/iantidy?a=WzmFFecMxhI:uyaa44F1ZJE:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/iantidy?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/iantidy/~4/WzmFFecMxhI" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/iantidy/~3/WzmFFecMxhI/welcome-to-2010.html</link><author>noreply@blogger.com (Ian Tidy)</author><thr:total>0</thr:total><feedburner:origLink>http://iantidy.blogspot.com/2010/01/welcome-to-2010.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-6195961493286457645.post-1431325335193039558</guid><pubDate>Tue, 22 Dec 2009 06:45:00 +0000</pubDate><atom:updated>2009-12-22T19:56:20.786+13:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">LINZ</category><category domain="http://www.blogger.com/atom/ns#">QGIS</category><category domain="http://www.blogger.com/atom/ns#">Eclipse</category><category domain="http://www.blogger.com/atom/ns#">Oracle</category><category domain="http://www.blogger.com/atom/ns#">Google</category><category domain="http://www.blogger.com/atom/ns#">MapServer</category><category domain="http://www.blogger.com/atom/ns#">Christams</category><category domain="http://www.blogger.com/atom/ns#">Bentley Systems</category><category domain="http://www.blogger.com/atom/ns#">Ubuntu</category><category domain="http://www.blogger.com/atom/ns#">NZGO</category><title>Christmas Again</title><description>Well, Christmas is here again and that means that the year is all but over.&lt;br /&gt;&lt;br /&gt;This year &lt;a href="http://www.bentley.com/"&gt;Bentley Systems&lt;/a&gt; has made some major progress with Bentley Map and PowerMap, they still have some things to sort out.  I think it will take them a while before Bentley have similar querying and analytical functions as ESRI and PBBI MapInfo does.  I am also very excited about Bentley Water, I plan to look at this when everything is quiet over the next few weeks.&lt;br /&gt;&lt;br /&gt;I recently used &lt;a href="http://www.qgis.org"&gt;Quantum GIS&lt;/a&gt; in an emergency Management exercise.  It performed extremely well, our biggest issue was with adding custom symbology (we should have done it before the exercise).  It was a great staff training situation, especially when it came to producing outputs.  But with the exception of a few minor crashes, the software performed brilliantly.&lt;br /&gt;&lt;br /&gt;I found out the hard way that with Oracle 11g, the system account passwords expire.  I agree with other people who have asked “what morons idea was that”.  Fortunately I found a way of fixing it at &lt;a href="http://www.odi.ch/weblog/posting.php?posting=520"&gt;http://www.odi.ch/weblog/posting.php?posting=520&lt;/a&gt;.  The fix is simply to run the following small SQL statement:&lt;br /&gt;&lt;br /&gt;ALTER PROFILE DEFAULT LIMIT&lt;br /&gt;  FAILED_LOGIN_ATTEMPTS UNLIMITED&lt;br /&gt;  PASSWORD_LIFE_TIME UNLIMITED;&lt;br /&gt;&lt;br /&gt;It is probably a good idea to run this before your passwords expire.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.linz.govt.nz/"&gt;Land Information New Zealand (LINZ)&lt;/a&gt;, have released a new set of Topographic maps, reduced the Bulk Data Extract (BDE) cost (used to build the Core Record System (CRS)), and reduced the cost of the Topographic vector data.&lt;br /&gt;&lt;br /&gt;The guys at &lt;a href="http://www.koordinates.co.nz"&gt;Koordinates&lt;/a&gt; released some Python scripts for processing both the LINZ BDE and Topographic vector data-sets (see &lt;a href="http://code.google.com/p/nz-geodata-scripts/"&gt;http://code.google.com/p/nz-geodata-scripts/&lt;/a&gt;). And the New Zealand Geospatial Office has a new boss, not too sure when he starts.&lt;br /&gt;&lt;br /&gt;As far as my development work, I have moved pretty much all my code to &lt;a href="http://www.eclipse.org/"&gt;Eclipse&lt;/a&gt; (this took a bit of getting used to) and a new &lt;a href="http://www.ubuntulinux.org/"&gt;Ubuntu Linux&lt;/a&gt; development environment.  And I am working on a new PHP/MapScript interface with some cool new features (more dynamic access to data).  I am really excited about this, but struggling to make time to work on it.&lt;br /&gt;&lt;br /&gt;I have been very disappointed with PBBI MapInfo this year, but I understand they are working on some interesting new features with Exponare.&lt;br /&gt;&lt;br /&gt;Also been playing with Google Wave (&lt;a href="http://wave.google.com"&gt;http://wave.google.com&lt;/a&gt;) and G.ho.st (&lt;a href="http://g.ho.st"&gt;http://g.ho.st&lt;/a&gt;) which are both kind of interesting, not too sure where they will fit with my kind of work though.&lt;br /&gt;&lt;br /&gt;Well that's about it for this year, so merry Christmas to all readers and I hope (and pray) that you all have a safe holiday and great new year.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6195961493286457645-1431325335193039558?l=iantidy.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/CF3y_5aTo4PNmY-DORYAuBvzZ5o/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/CF3y_5aTo4PNmY-DORYAuBvzZ5o/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/CF3y_5aTo4PNmY-DORYAuBvzZ5o/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/CF3y_5aTo4PNmY-DORYAuBvzZ5o/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/iantidy?a=JwMeqD--FOY:pFPDOrWFOCo:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/iantidy?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/iantidy?a=JwMeqD--FOY:pFPDOrWFOCo:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/iantidy?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/iantidy/~4/JwMeqD--FOY" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/iantidy/~3/JwMeqD--FOY/christmas-again.html</link><author>noreply@blogger.com (Ian Tidy)</author><thr:total>0</thr:total><feedburner:origLink>http://iantidy.blogspot.com/2009/12/christmas-again.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-6195961493286457645.post-2739826390649033075</guid><pubDate>Tue, 06 Oct 2009 04:12:00 +0000</pubDate><atom:updated>2009-10-06T17:37:37.457+13:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">WLD</category><category domain="http://www.blogger.com/atom/ns#">LINZ</category><category domain="http://www.blogger.com/atom/ns#">GeoTIFF</category><category domain="http://www.blogger.com/atom/ns#">listgeo</category><category domain="http://www.blogger.com/atom/ns#">NZTopo50</category><category domain="http://www.blogger.com/atom/ns#">TFW</category><category domain="http://www.blogger.com/atom/ns#">World Files</category><title>LINZ NZTopo50 Images</title><description>Late last month Land Information New Zealand released their new series of NZTopo50 and NZTopo250 maps (&lt;a href="http://www.linz.govt.nz/topography/topo-maps/index.aspx"&gt;http://www.linz.govt.nz/topography/topo-maps/index.aspx&lt;/a&gt; or &lt;a href="http://www.linz.govt.nz/topography/topo-maps/map-chooser/"&gt;http://www.linz.govt.nz/topography/topo-maps/map-chooser/&lt;/a&gt; ).&lt;br /&gt;&lt;br /&gt;Both the print map and GeoTIFF images are available for download from &lt;a href="http://topo.linz.govt.nz/"&gt;http://topo.linz.govt.nz&lt;/a&gt; or &lt;a href="ftp://topo.linz.govt.nz/"&gt;ftp://topo.linz.govt.nz&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Another useful site is &lt;a href="http://www.topo50.govt.nz/"&gt;http://www.topo50.govt.nz/&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;The only problems I have found with these images is they are large (the GeoTIFFs are larger than 140Mb each), there are lots of them (451 NZTopo50 Images), there are no world files (TFW or WLD), and it takes a long time to download the approximatley 95GB of images.  But I only had to do it once.&lt;br /&gt;&lt;br /&gt;If your program needs world files then here is an easy way to build them.&lt;br /&gt;1. Download all the GeoTIFFs from LINZ that you want.&lt;br /&gt;2. Download libgeotiff from RemoteSensing.org (&lt;a href="ftp://ftp.remotesensing.org/geotiff/libgeotiff/"&gt;ftp://ftp.remotesensing.org/geotiff/libgeotiff/&lt;/a&gt;).  I used the geotiff_bin_114_nt.zip file.  This contains pre-compiled libraries for MS Windows.&lt;br /&gt;3. Extract the ZIP file into the same directory as the Images (this just makes life a bit easier).&lt;br /&gt;4. At a command prompt, change into the image directory&lt;br /&gt;&lt;span style="font-style: italic;"&gt;For Windows computers:&lt;/span&gt;&lt;br /&gt;    5a. Create a new file batch file (a text file with a 'bat' extension, e.g. 'copy con create_tfw.bat')&lt;br /&gt; 5b. Copy and Paste (or retype) the following into your batch file:&lt;br /&gt;    &lt;span style="font-family:courier new;"&gt;@echo off&lt;br /&gt;for /f %%x in ('dir /b *.tif') do call listgeo -tfw %%x&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;For Linux machines - I haven't tested this script, but it should work&lt;/span&gt;&lt;br /&gt;5c. Create a new script file (e.g. 'vim create_tfw')&lt;br /&gt;5d. Type the following into your new script file&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;#!/bin/sh&lt;br /&gt;for x in `ls -b *.tif`&lt;br /&gt;do&lt;br /&gt;       listgeo -tfw $x&lt;br /&gt;done&lt;/span&gt;&lt;br /&gt;5e. Change the permissions to make it executable (e.g. 'chmod +x create_tfw')&lt;br /&gt;6. Execute the batch / script file you have created&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;What is the script doing?&lt;/strong&gt;  The script is running listgeo (with the -tfw option) against each file in the directory, listgeo will create a world file (tfw) for each tif image (where it can).&lt;br /&gt;&lt;br /&gt;Once it is finished you should have a GeoTIFF image and a corresponding world file.  This should work with almost any GeoTIFF images not just the files from LINZ.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6195961493286457645-2739826390649033075?l=iantidy.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/dPQIZuvRKPxtaqkbnSiJmRudwz0/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/dPQIZuvRKPxtaqkbnSiJmRudwz0/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/dPQIZuvRKPxtaqkbnSiJmRudwz0/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/dPQIZuvRKPxtaqkbnSiJmRudwz0/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/iantidy?a=a4qlgf9uCLA:EGUqy18lwOc:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/iantidy?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/iantidy?a=a4qlgf9uCLA:EGUqy18lwOc:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/iantidy?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/iantidy/~4/a4qlgf9uCLA" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/iantidy/~3/a4qlgf9uCLA/linz-nztopo50-images.html</link><author>noreply@blogger.com (Ian Tidy)</author><thr:total>0</thr:total><feedburner:origLink>http://iantidy.blogspot.com/2009/10/linz-nztopo50-images.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-6195961493286457645.post-2741529995622129365</guid><pubDate>Mon, 07 Sep 2009 09:57:00 +0000</pubDate><atom:updated>2009-09-07T22:05:05.555+12:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">LINZ</category><category domain="http://www.blogger.com/atom/ns#">Land Information New Zealand</category><category domain="http://www.blogger.com/atom/ns#">CRS</category><category domain="http://www.blogger.com/atom/ns#">Core Record System</category><title>Cheaper CRS Data for New Zealand?</title><description>Last month Land Information New Zealand (LINZ) announced that as of the 11th September 2009 they are reducing the price of their Bulk Data Extracts (BDE) from $270.00 to $53.00 per delivery.&lt;br /&gt;&lt;br /&gt;Companies to purchase the LINZ BDE data received an email last month stating:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;BDE fees reduction&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;The Government has agreed to the Land Information New Zealand (Fees and Charges) Amendment Regulations 2009, which includes a reduction of BDE fees from $270 to $53. The new fee takes effect from 11 September 2009.&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;As you know, the information LINZ provides you is charged on a cost of supply basis. The above decision acknowledges that the cost of providing information to you has fallen due to efficiencies in the digitisation process.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Why is this important, the BDE data is purchased by data vendors (e.g. Critchlows, SKM, etc) and changed back into a useful form of the LINZ Core Record System (CRS* or previously (along time ago) the DCDB*).  Which sells at upto (and sometimes in excess of) $300.00 for a single region.  The retailer tell us that this is due to the 'add value' components delivered with the product.&lt;br /&gt;&lt;br /&gt;I admit that there is a bit of effort and time to prepare the scripts and run them.  My scripts have been evolving over the last few years, and now the process runs pretty much unsupervised for around 8 hours (I have probably spent around 2 weeks developing my process).  But uses commercial software.  I have considered building an open-source solution, but not sure how much interest there is (if this is something you would like, or are prepared to help develop, please contact me via &lt;a href="mailto:iantidy@gmail.com"&gt;email&lt;/a&gt;) and time is always an issue.&lt;br /&gt;&lt;br /&gt;So, will the data vendors drop their prices to a similar amount (or by a similar margin).  I hope they do, but the data cost has been such a small portion for a number of years now, and the charges from vendors doesn't seem to change much.&lt;br /&gt;&lt;br /&gt;For more information see: &lt;a href="http://www.linz.govt.nz/survey-titles/landonline-data/landonline-bde/index.aspx"&gt;http://www.linz.govt.nz/survey-titles/landonline-data/landonline-bde/index.aspx &lt;/a&gt;&lt;br /&gt;&lt;br /&gt;* The DCDB (Digital Cadastral Database) or CRS (Core Record System) are the core cadastral boundaries for all of New Zealand.  The dataset contains property, title, and survey information for all NZ.  Land Information New Zealand is the custodian of this information.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6195961493286457645-2741529995622129365?l=iantidy.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/w_X6Z6uzqQubxkuowjW9ydnAZqk/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/w_X6Z6uzqQubxkuowjW9ydnAZqk/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/w_X6Z6uzqQubxkuowjW9ydnAZqk/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/w_X6Z6uzqQubxkuowjW9ydnAZqk/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/iantidy?a=Tlu9s242TJY:kj_eT0iIH6I:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/iantidy?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/iantidy?a=Tlu9s242TJY:kj_eT0iIH6I:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/iantidy?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/iantidy/~4/Tlu9s242TJY" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/iantidy/~3/Tlu9s242TJY/cheaper-crs-data-for-new-zealand.html</link><author>noreply@blogger.com (Ian Tidy)</author><thr:total>1</thr:total><feedburner:origLink>http://iantidy.blogspot.com/2009/09/cheaper-crs-data-for-new-zealand.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-6195961493286457645.post-7729035616081750437</guid><pubDate>Mon, 31 Aug 2009 01:05:00 +0000</pubDate><atom:updated>2009-08-31T13:22:50.328+12:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">MS4W</category><category domain="http://www.blogger.com/atom/ns#">PHP</category><category domain="http://www.blogger.com/atom/ns#">PHPEdit</category><category domain="http://www.blogger.com/atom/ns#">Aptana Studio</category><category domain="http://www.blogger.com/atom/ns#">MapServer</category><title>Aptana Studio and MapServer for Windows (MS4W)</title><description>Over the past few years I have been using PHPEdit (&lt;a href="http://www.phpedit.com/"&gt;http://www.phpedit.com&lt;/a&gt;) for developing PHP/MapScript and general PHP development.&lt;br /&gt;&lt;br /&gt;PHPEdit is a great product, but while I was looking for something else, I found Aptana Studio (&lt;a href="http://www.aptana.com/"&gt;http://www.aptana.com&lt;/a&gt;).  Aptana Studio is based around the Eclipse development environment, and I like it very much like it.&lt;br /&gt;&lt;br /&gt;While I was playing around, I decided to see if I could get Aptana to work with MapServer for Windows.  My previous solution (with PHPEdit) was to run the Apache Server included with MapServer and then install the debug library.  I had limited success with this, and I hoped that Aptana Studio woul fix my problems.  So in this blog post, I decided to share how to get MapServer for Windows (MS4W) to work inside Aptana Studio.&lt;br /&gt;&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Download MapServer for Windows from &lt;a href="http://www.maptools.org/ms4w/"&gt;http://www.maptools.org/ms4w/&lt;/a&gt; &lt;/li&gt;&lt;li&gt; Aptana Studio from &lt;a href="http://www.aptana.com/"&gt;http://www.aptana.com&lt;/a&gt;&lt;/li&gt;&lt;li&gt; Install / Unzip MapServer (make a note of the install path)&lt;/li&gt;&lt;li&gt; Install Aptana Studio&lt;/li&gt;&lt;li&gt; Start Aptana Studio and install the PHP extensions (see the Aptana Site for instructions - &lt;a href="http://www.aptana.com/php"&gt;http://www.aptana.com/php&lt;/a&gt;)&lt;/li&gt;&lt;li&gt;Find the setenv.bat file included with MapServer.  This file contains system environment settings, these need to be set permanently on your system.&lt;/li&gt;&lt;li&gt; Set the MapServer environment settings by right clicking 'My Computer', select 'Properties', and the 'Advanced' tab.  Then click the 'Environment Variables'.  You can choose to make the variables specific to you by adding them to the top panel (titled 'User variables for ....') or global by adding them to the bottom panel (titled 'System variables').&lt;/li&gt;&lt;li&gt; In the panel you choose (I use the bottom panel), find the 'PATH' variable, and click the 'Edit' button.  Copy this path and paste it into a text editor, and copy and append the PATH from the setenv.bat file.  NOTE : Add any extra path and drive specification to the line before appending it to the environment setting. (e.g. 'C:\', my path looks like this "%SystemRoot%\system32;%SystemRoot%;%SystemRoot%\System32\Wbem;c:\ms4w\Apache\cgi-bin;c:\ms4w\tools\gdal-ogr;c:\ms4w\tools\mapserv;c:\ms4w\tools\shapelib;c:\ms4w\proj\bin;c:\ms4w\tools\shp2tile;c:\ms4w\tools\shpdiff;c:\ms4w\tools\avce00;C:\Program Files\TortoiseSVN\bin;").  From the text editor copy the new path (with the appended part) and paste it into the 'Edit System Variable' dialog replacing the 'Variable Value' and click 'OK'.&lt;/li&gt;&lt;li&gt; Add a new Variable by clicking the 'New' button and add the GDAL_DATA to the 'Variable name' and the path from the setenv.bat file (e.g. C:\ms4w\gdaldata) to the 'Variable value' and click 'OK'.&lt;/li&gt;&lt;li&gt; Add a new Variable by clicking the 'New' button and add the GDAL_DRIVER_PATH to the 'Variable name' and the path from the setenv.bat file (e.g. C:\ms4w\gdalplugins) to the 'Variable value' and click 'OK'.&lt;/li&gt;&lt;li&gt; Add a new Variable by clicking the 'New' button and add the PROJ_LIB to the 'Variable name' and the path from the setenv.bat file (e.g. C:\ms4w\proj\nad) to the 'Variable value' and click 'OK'.&lt;/li&gt;&lt;li&gt; Click 'OK' and 'OK' to dismiss the dialogs.&lt;/li&gt;&lt;li&gt;These settings will now be available to any application and command prompt.&lt;/li&gt;&lt;li&gt; Copy the php_mapscript files to the Aptana PHP5 extension folder.  The PHP extensions can be found in 'C:\Program Files\Aptana\Aptana Studio 1.5\plugins\com.aptana.ide.php.interpreters.win32.x86_5.4.3.v20090701\resources\php5\ext' (obviously replace 'C:\Program Files\' with whatever is appropriate).  You need to copy the following files from the MapServer install path (e.g. 'C:\MS4W\Apache\php\ext') to the Aptana directory.  &lt;span style="font-weight: bold;"&gt;Make sure you don't overwrite or replace any existing files!!!&lt;/span&gt;&lt;/li&gt;&lt;li&gt; File to copy are: php_chameleon.dll, php_mapscript.dll, php_ogr.dll,  php_pdf.dll, and php_pdo_sqlite.dll&lt;/li&gt;&lt;li&gt;Copy supporting files from the MapServer Apache CGI-BIN directory (e.g. 'C:\ms4w\Apache\cgi-bin') to the Apatana PHP directory (e.g. 'C:\Program Files\Aptana\Aptana Studio 1.5\plugins\com.aptana.ide.php.interpreters.win32.x86_5.4.3.v20090701\resources\php5').  &lt;span style="font-weight: bold;"&gt;I didn't work out exactly which files are needed so I copied anything that doesn't already exist.&lt;/span&gt;&lt;/li&gt;&lt;li&gt; Files to copy are:  asprintf.dll, bgd.dll,  cfitsio.dll, cygwin1.dll,  expat.dll,  fribidi.dll,  gdal14.dll, gdal16.dll,  geos.dll,  geos_c.dll, geotiff.dll,  gifsample.exe, hdf5dll.dll,  iconv.dll,  intl.dll,  jbig1.dll, libcurl.dll,  libecwj2.dll,  libexpat.dll,  libfcgi.dll,  libmap.dll,  libswish-e.dll, libtiff.dll,  libxml2.dll,  lti_dsdk_cdll.dll, lti_dsdk_dll.dll,  mapserv.exe,  msvcp71.dll,  msvcr71.dll,  netcdf.dll, owtchart.exe,  pdflib.dll,  php-cgi.exe,  php-win.exe,  php_browscap.ini,  printenv.pl,  proj.dll,  sablot.dll,  shapelib.dll,  sqlite3.dll,  szlibdll.dll,  xerces-c_2_7.dll, yaz.dll, and zlib1.dll&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;And now (all going well and if I haven't forgotten anything), it should all work when you start Aptana Studio.  If you preview you PHP project in Aptana then it should work along with the debugging.&lt;br /&gt;&lt;br /&gt;Good Luck.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6195961493286457645-7729035616081750437?l=iantidy.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/UmW37loDRBekQp5-qmZ0vMSYdUA/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/UmW37loDRBekQp5-qmZ0vMSYdUA/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/UmW37loDRBekQp5-qmZ0vMSYdUA/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/UmW37loDRBekQp5-qmZ0vMSYdUA/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/iantidy?a=BOQJjeXV7Is:eUlEMN62ED8:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/iantidy?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/iantidy?a=BOQJjeXV7Is:eUlEMN62ED8:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/iantidy?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/iantidy/~4/BOQJjeXV7Is" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/iantidy/~3/BOQJjeXV7Is/aptana-studio-and-mapserver-for-windows.html</link><author>noreply@blogger.com (Ian Tidy)</author><thr:total>0</thr:total><feedburner:origLink>http://iantidy.blogspot.com/2009/08/aptana-studio-and-mapserver-for-windows.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-6195961493286457645.post-7785606970678516100</guid><pubDate>Wed, 05 Aug 2009 22:17:00 +0000</pubDate><atom:updated>2009-08-06T10:24:03.318+12:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">GRASS</category><category domain="http://www.blogger.com/atom/ns#">QGIS</category><title>Open PDF with GRASS / QGIS ??</title><description>Well its been a few weeks. I haven't died, just been working on some exciting new things that will be announced later this year (some really great stuff is coming).&lt;br /&gt;&lt;br /&gt;A while ago, I was asked about registering a PDF in GRASS or QGIS.  Now unfortunately, the only versions of these I have at the moment are MS Windows versions (GRASS version 6.3.0 and QGIS 1.0.2 "Kore").&lt;br /&gt;&lt;br /&gt;From what I can see, you &lt;span style="font-weight: bold;"&gt;cannot&lt;/span&gt; register a PDF into either of these products.  A work-around would be to convert the PDF to an image format (TIFF/JPG/PNG) and then reference it into GRASS or QGIS.  This will loose any geo-referencing information.&lt;br /&gt;&lt;br /&gt;The only products that I know of that will let you do this is Bentley products, and possibly ESRI products (not to sure with ESRI).&lt;br /&gt;&lt;br /&gt;If anyone can tell me how to open a PDF file directly with either QGIS or GRASS, I would like to hear from you.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6195961493286457645-7785606970678516100?l=iantidy.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/93XwqRvC3tj2j7fWYFlkZx_ZTLM/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/93XwqRvC3tj2j7fWYFlkZx_ZTLM/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/93XwqRvC3tj2j7fWYFlkZx_ZTLM/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/93XwqRvC3tj2j7fWYFlkZx_ZTLM/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/iantidy?a=yzHEP_BDH5Y:ekbzTeWYppo:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/iantidy?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/iantidy?a=yzHEP_BDH5Y:ekbzTeWYppo:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/iantidy?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/iantidy/~4/yzHEP_BDH5Y" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/iantidy/~3/yzHEP_BDH5Y/open-pdf-with-grass-qgis.html</link><author>noreply@blogger.com (Ian Tidy)</author><thr:total>0</thr:total><feedburner:origLink>http://iantidy.blogspot.com/2009/08/open-pdf-with-grass-qgis.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-6195961493286457645.post-8645706465527980226</guid><pubDate>Fri, 29 May 2009 05:18:00 +0000</pubDate><atom:updated>2009-06-02T17:07:16.303+12:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">PostGIS</category><category domain="http://www.blogger.com/atom/ns#">MS SQL Server</category><category domain="http://www.blogger.com/atom/ns#">PostgreSQL</category><category domain="http://www.blogger.com/atom/ns#">PBBI</category><category domain="http://www.blogger.com/atom/ns#">MapInfo Professional</category><category domain="http://www.blogger.com/atom/ns#">Pitney Bowes</category><title>PBBI MapInfo Playing Catch-up</title><description>Yesterday (28th May), I got up early to attend a webinar about MapInfo Professional 10.0 which is due for release next month.  I was keen to see what was new, what had been fixed, and the direction PBBI was taking the product.&lt;br /&gt;&lt;br /&gt;MapInfo Pro 10.0 has some new features, like being able to dock toolbars on all four sides of the window, a new floating layer control (which has some new features), read and write support for both MS SQL Server 2008 and PostgreSQL / PostGIS, and layered PDFs.  No improvements have been made to the browser interface.  It seems like they are further behind than when the killed the 'Grande'* development.  But overall, it looks like PBBI are trying to playing catch-up with the rest of the industry.  The things being shown are all things that are already available in other products, and in some cases they have been for some time.  I thought that PBBI are doing just enough to keep their existing customers content, but no more.&lt;br /&gt;&lt;br /&gt;A question was asked (and not by me) about SpatialWare for MS SQL Server 2008, and the response was that it wasn't required with MI Pro 10.0, but this means that if you want to use MS SQL Server 2008 for storing your spatial data (which is a sensible idea), then all your users must be running MI Pro 10.0.  The support for MS SQL Server 2008 and PostgreSQL is handled by direct native access to the database server, similar to the support for Oracle and SpatialWare.&lt;br /&gt;&lt;br /&gt;Overall, there was nothing I saw that made me think that I really need this upgrade.  So I will stick with my 7.8 version.&lt;br /&gt;&lt;br /&gt;* The 'Grande' development project was a re-write of the MapInfo Professional interface to a .NET environment.  The project was halted a few years ago.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6195961493286457645-8645706465527980226?l=iantidy.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/1-REiioFv4T03DUB_nwDx_4f-hA/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/1-REiioFv4T03DUB_nwDx_4f-hA/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/1-REiioFv4T03DUB_nwDx_4f-hA/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/1-REiioFv4T03DUB_nwDx_4f-hA/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/iantidy?a=aoYSAt9SCSA:MFVYHvRKElc:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/iantidy?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/iantidy?a=aoYSAt9SCSA:MFVYHvRKElc:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/iantidy?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/iantidy/~4/aoYSAt9SCSA" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/iantidy/~3/aoYSAt9SCSA/pbbi-mapinfo-playing-catch-up.html</link><author>noreply@blogger.com (Ian Tidy)</author><thr:total>0</thr:total><feedburner:origLink>http://iantidy.blogspot.com/2009/05/pbbi-mapinfo-playing-catch-up.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-6195961493286457645.post-1333674114259664567</guid><pubDate>Wed, 06 May 2009 04:53:00 +0000</pubDate><atom:updated>2009-05-06T17:14:23.037+12:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">MapInfo SpatialWare</category><category domain="http://www.blogger.com/atom/ns#">Oracle</category><category domain="http://www.blogger.com/atom/ns#">MapInfo Professional</category><category domain="http://www.blogger.com/atom/ns#">SQL Server</category><title>Can the data that MI Pro uses be stored in a database server as opposed to TAB files?</title><description>I was recently asked this question and the answer is a bit long for a blog comment, so here goes &lt;a href="http://iantidy.blogspot.com/2008/07/oracle-vs-microsoft.html?showComment=1241579760000#c628854122943439752" target="blank"&gt;(Click here for the Original Comment)&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Yes, MapInfo Pro can use a SQL Server (with SpatialWare) or Oracle table instead of native TAB file.  Also storing the data in SQL Server or Oracle is the only way to get multi-user editing within MapInfo Pro.&lt;br /&gt;&lt;br /&gt;MapInfo has 2 forms of DBMS connections.  These are 'Live' and 'Linked'.  A 'Live' connection is exactly that and each request is sent to the server and new data is downloaded.  With a 'Linked' version, the data is cached to the local machine and refreshed on request or update.&lt;br /&gt;&lt;br /&gt;Either way MapInfo will create a TAB file with at least the connection information (for 'Live' connections) and a copy of the TAB, DAT, MAP, and ID files for 'Linked' datasets.&lt;br /&gt;&lt;br /&gt;I haven't been paying too much attention to the work MapInfo are doing with Microsoft and SQL Server 2008, so I'm not sure if they have the full native read / write access or not.  I have noticed that there are options in EasyLoader* for SQL Server 2008.  I also understand that in the next release of MI Pro there will be support for PostgreSQL and PostGIS.  It will be interesting to see how this works and if it is full read / write access, or read-only like the SQL Server 2008 support in MapInfo 9.5.&lt;br /&gt;&lt;br /&gt;* EasyLoader is a MapInfo tool for uploading data into RDBMS systems like Oracle and SQL Server.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6195961493286457645-1333674114259664567?l=iantidy.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/5Tumtrudjk8gGaW_Ymmj6LJchyI/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/5Tumtrudjk8gGaW_Ymmj6LJchyI/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/5Tumtrudjk8gGaW_Ymmj6LJchyI/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/5Tumtrudjk8gGaW_Ymmj6LJchyI/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/iantidy?a=-YLxT7XxTDs:Aw21R6NGdog:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/iantidy?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/iantidy?a=-YLxT7XxTDs:Aw21R6NGdog:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/iantidy?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/iantidy/~4/-YLxT7XxTDs" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/iantidy/~3/-YLxT7XxTDs/can-data-that-mi-pro-uses-be-stored-in.html</link><author>noreply@blogger.com (Ian Tidy)</author><thr:total>1</thr:total><feedburner:origLink>http://iantidy.blogspot.com/2009/05/can-data-that-mi-pro-uses-be-stored-in.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-6195961493286457645.post-231487209120714520</guid><pubDate>Sun, 26 Apr 2009 05:59:00 +0000</pubDate><atom:updated>2009-04-26T18:07:02.927+12:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Sun</category><category domain="http://www.blogger.com/atom/ns#">Oracle</category><title>Oracle buys Sun</title><description>Over the last few days, I have noticed a lot of discussion about Oracle buying Sun.&lt;br /&gt;&lt;br /&gt;At this stage I'm not too sure if this is good or bad.  I can see that from Oracles perspective, it is good.  Oracle gains a hardware platform, an OS, another database, and Java.&lt;br /&gt;&lt;br /&gt;But from the open source perspective, I'm going to wait and see what happens with the software produced by Sun.&lt;br /&gt;&lt;br /&gt;In the long term, I think this could be very good for both the MySQL and Oracle databases, and Java.&lt;br /&gt;&lt;br /&gt;But I think I will delay my judgement for now, since until recently I have had limited exposure to Oracle.&lt;br /&gt;&lt;br /&gt;See &lt;a href="http://www.sun.com/aboutsun/media/presskits/2009-0420/index.jsp" target="_blank"&gt;http://www.sun.com/aboutsun/media/presskits/2009-0420/index.jsp&lt;/a&gt; or &lt;a href="http://www.oracle.com/sun/index.html" target="_blank"&gt;http://www.oracle.com/sun/index.html&lt;/a&gt; for more details.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6195961493286457645-231487209120714520?l=iantidy.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/64vz2VahHVTX7HtkpU-bbVvWte8/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/64vz2VahHVTX7HtkpU-bbVvWte8/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/64vz2VahHVTX7HtkpU-bbVvWte8/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/64vz2VahHVTX7HtkpU-bbVvWte8/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/iantidy?a=5GS69qZ9_Ts:68BGEkw5Pl0:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/iantidy?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/iantidy?a=5GS69qZ9_Ts:68BGEkw5Pl0:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/iantidy?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/iantidy/~4/5GS69qZ9_Ts" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/iantidy/~3/5GS69qZ9_Ts/oracle-buys-sun.html</link><author>noreply@blogger.com (Ian Tidy)</author><thr:total>1</thr:total><feedburner:origLink>http://iantidy.blogspot.com/2009/04/oracle-buys-sun.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-6195961493286457645.post-1057357630660835047</guid><pubDate>Thu, 05 Feb 2009 21:57:00 +0000</pubDate><atom:updated>2009-02-06T11:25:41.432+13:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">TerraGo</category><category domain="http://www.blogger.com/atom/ns#">MapInfo</category><category domain="http://www.blogger.com/atom/ns#">GeoPDF</category><category domain="http://www.blogger.com/atom/ns#">MapServer</category><title>GeoPDF goes Open</title><description>Some time ago, I asked TerraGo to make their GeoPDF detail available to open source communities.  At that stage I was looking at building a GeoPDF tool for MapInfo Professional, and UMN MapServer.&lt;br /&gt;&lt;br /&gt;Well good things take time, today I received an email from George Demmy at TerraGo informing me that the GeoPDF format developed by TerraGo had been submitted and accepted by the OGC.&lt;br /&gt;&lt;br /&gt;This is great news and I must thank TerraGo for making their IP available for us all to take advantage of.  Thanks Guys..&lt;br /&gt;&lt;br /&gt;For more details see:&lt;br /&gt;&lt;a href="http://geopdf.blogspot.com/2009/02/closing-out-bug-1584-make-geopdf-open.html" target="blank"&gt;http://geopdf.blogspot.com/2009/02/closing-out-bug-1584-make-geopdf-open.html&lt;/a&gt;&lt;br /&gt;&lt;a href="http://geopdf.blogspot.com/2009/02/ogc-approves-geopdf-22-as-ogc-best.html" target="blank"&gt;http://geopdf.blogspot.com/2009/02/ogc-approves-geopdf-22-as-ogc-best.html&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.adobe.com/devnet/pdf/pdf_reference.html" target="blank"&gt;http://www.adobe.com/devnet/pdf/pdf_reference.html&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6195961493286457645-1057357630660835047?l=iantidy.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/HgHVt3Tn6QHc6OmNcJw4idpkc8Q/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/HgHVt3Tn6QHc6OmNcJw4idpkc8Q/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/HgHVt3Tn6QHc6OmNcJw4idpkc8Q/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/HgHVt3Tn6QHc6OmNcJw4idpkc8Q/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/iantidy?a=7yQR4xEY"&gt;&lt;img src="http://feeds.feedburner.com/~f/iantidy?d=42" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/iantidy?a=Osrh75sz"&gt;&lt;img src="http://feeds.feedburner.com/~f/iantidy?d=41" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/iantidy/~4/4_ERh-TQ8Y4" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/iantidy/~3/4_ERh-TQ8Y4/geopdf-goes-open.html</link><author>noreply@blogger.com (Ian Tidy)</author><thr:total>2</thr:total><feedburner:origLink>http://iantidy.blogspot.com/2009/02/geopdf-goes-open.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-6195961493286457645.post-359625691159526248</guid><pubDate>Tue, 13 Jan 2009 08:59:00 +0000</pubDate><atom:updated>2009-02-02T20:12:33.551+13:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">MapInfo SpatialWare</category><category domain="http://www.blogger.com/atom/ns#">Oracle</category><title>Well I never...</title><description>Happy New Year to you all.&lt;br /&gt;&lt;br /&gt;A few years ago I went to a Bentley Geospatial Conference in Brisbane.  This was a good conference, I enjoyed it and learnt a bit.  At the conference, staff from Oracle made a presentation and I pretty much said that "&lt;span style="font-style: italic;"&gt;I would never implement Oracle&lt;/span&gt;".&lt;br /&gt;&lt;br /&gt;Well I guess I was wrong...&lt;br /&gt;&lt;br /&gt;I am currently going through the process of replacing a MapInfo SpatialWare for SQL Server, with an Oracle server.  This is being done for a whole host of reasons, but one of the big reasons is actually the savings in annual maintenance fees and the price of the product.&lt;br /&gt;&lt;br /&gt;So this year is already shaping up to be a very interesting year, and I need to be more careful about what I say... ;)&lt;br /&gt;&lt;br /&gt;Cheers Ian&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6195961493286457645-359625691159526248?l=iantidy.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/xSAMR9hV9NLp26mt7hj8GVo6Ocg/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/xSAMR9hV9NLp26mt7hj8GVo6Ocg/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/xSAMR9hV9NLp26mt7hj8GVo6Ocg/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/xSAMR9hV9NLp26mt7hj8GVo6Ocg/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/iantidy?a=TRNUMJuz"&gt;&lt;img src="http://feeds.feedburner.com/~f/iantidy?d=42" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/iantidy?a=z0xJDo4x"&gt;&lt;img src="http://feeds.feedburner.com/~f/iantidy?d=41" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/iantidy/~4/Z_iVvh5jaWw" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/iantidy/~3/Z_iVvh5jaWw/well-i-never.html</link><author>noreply@blogger.com (Ian Tidy)</author><thr:total>0</thr:total><feedburner:origLink>http://iantidy.blogspot.com/2009/01/well-i-never.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-6195961493286457645.post-1973508815106176033</guid><pubDate>Fri, 12 Dec 2008 20:02:00 +0000</pubDate><atom:updated>2008-12-13T09:07:00.061+13:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Bentley Map</category><category domain="http://www.blogger.com/atom/ns#">MicroStation</category><category domain="http://www.blogger.com/atom/ns#">Bentley</category><title>Bentley Map V8i</title><description>I have been working with Bentley Map V8i (the "Athens" release).  The current release looks like it has just been quickly modified to fit the MicroStation V8i framework.  It still has issues with labelling and annotation, but I have been assured by Bentley staff that this is being addressed in an update due in Q1 2009.  I like Bentley Map, I find it extremely powerful for data capture and maintenance.&lt;br /&gt;&lt;br /&gt;The "GeoSpatial Administrator" is a very powerful tool.  It not only builds and controls placement and editing tools, but also form designs, workspaces, and most other aspects of MicroStation administration.  It has a few bugs at the moment, but they are being addressed.&lt;br /&gt;&lt;br /&gt;I think this is a product with incredible potential and it will be interesting to see what Bentley Systems do with it as they develop it, and I am looking forward to seeing the next release.&lt;br /&gt;&lt;br /&gt;Well short and sweet this time.  I wish you all a very merry Christmas and a happy, but safe New Year.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6195961493286457645-1973508815106176033?l=iantidy.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/sRBWp2RmJOPs-qn3GW_lq6Gw3mg/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/sRBWp2RmJOPs-qn3GW_lq6Gw3mg/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/sRBWp2RmJOPs-qn3GW_lq6Gw3mg/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/sRBWp2RmJOPs-qn3GW_lq6Gw3mg/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/iantidy?a=dHuAeLiH"&gt;&lt;img src="http://feeds.feedburner.com/~f/iantidy?d=42" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/iantidy?a=MSybrHwC"&gt;&lt;img src="http://feeds.feedburner.com/~f/iantidy?d=41" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/iantidy/~4/WLVTYTs3ZtE" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/iantidy/~3/WLVTYTs3ZtE/bentley-map-v8i.html</link><author>noreply@blogger.com (Ian Tidy)</author><thr:total>0</thr:total><feedburner:origLink>http://iantidy.blogspot.com/2008/12/bentley-map-v8i.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-6195961493286457645.post-7973463077497194155</guid><pubDate>Wed, 29 Oct 2008 08:12:00 +0000</pubDate><atom:updated>2008-10-29T21:58:53.302+13:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Bentley Map</category><category domain="http://www.blogger.com/atom/ns#">Map 3D</category><category domain="http://www.blogger.com/atom/ns#">Autodesk</category><category domain="http://www.blogger.com/atom/ns#">Oracle</category><category domain="http://www.blogger.com/atom/ns#">Bentley</category><title>Bentley and Autodesk</title><description>Its been a while, but things happen and time goes racing past making a lovely whooshing sound.  But over the last little while I have been playing with a few things.&lt;br /&gt;&lt;br /&gt;I had the opportunity to have a look at Bentley Map (which I have been looking at for a while) and Autodesk Map 3D.  Now I have been working with the Bentley products for a while now, so I needed to go through this process with an open mind (which was hard at times).&lt;br /&gt;&lt;br /&gt;Now rival software companies are always playing leap frog, company A will have a cool feature and company B will have a better version of the same feature in their next release.  We all know how this works.  So everything I am about to say is only valid for the releases I have worked with, and I know both companies are getting ready to release newer versions.  So the versions I played with are Bentley Map XM Edition (8.09.xx) and Autodesk Map 3D 2008 Edition.&lt;br /&gt;&lt;br /&gt;Now I like Bentley Map and the flexibility you have as far as the GUI is concerned, especially over 2 monitors, I found this a bit more difficult with Autodesk Map 3D (in fact the only way I could get it to work over 2 monitors was to stretch it).&lt;br /&gt;&lt;br /&gt;I found the dynamic annotation / labelling in Map 3D was brilliant, I have never had so much control over labelling and label flow in any GIS product that I have used, so well done Autodesk.  The annotation in Bentley Map is purely static (unless you go through a convoluted setup process), and is basically none existant (except for normal CAD annotation tools).  Also in Bentley Map linking to an Oracle Spatial database is reasonably brain dead, and the product doesn't use the attributes from the database (this also applies to other file formats able to be openned by the product).&lt;br /&gt;&lt;br /&gt;I found the Bentley Map openned more file formats than Autodesk Map 3D, and the performance of managing those files was a lot better.  I have spoken with the Autodesk guys and they are looking into why this may be the case and what can be done to improve the performance.  The performance was so bad, that it took several minutes to load around 50,000 polygons, where the Bentley Map product opens the same file in about 1 minute.  Selecting the same polygons in Bentley Map took a minute or two, but after waiting over 15 minutes I crashed out of Autodesk Map 3D.  Up until this point I was reasonably excited with the product, but this just killed it for me.&lt;br /&gt;&lt;br /&gt;Unfortunaley, I didn't get a chance to test the Autodesk product with an Oracle Spatial database.  But I am not very happy with the Bentley Map support.&lt;br /&gt;&lt;br /&gt;Overall I think both products have weaknesses when compared with each other and other more mainstream GIS products, but they do have some really good features.  I think most GIS companies could learn from Autodesks dynamic labelling.  I think both products are immature when compared with other GIS products, but they both have full 3D support and great CAD tools.  I also like that Bentley ship the SDK with Bentley Map and are pushing for developers to write in native C/C++/C# code instead of a propriety language.&lt;br /&gt;&lt;br /&gt;As far as cost goes, Autodesk Map 3D is around three quarters (3/4) of the cost of Bentley Map.  This is because Bentley Map requires a full Bentley MicroStation license.  You can opt for Bentley PowerMap* which offers most of the same functionality (apart for some more advanced CAD features) for around the same price as the Autodesk product.&lt;br /&gt;&lt;br /&gt;Now as I said at the start, both Autodesk and Bentley are due to relaese newer versions of these products.  I understand that Bentley are launching their latest version of MicroStation (version 8.11 code named "Athens") very soon, and this will have flow on changes to Bentley Map.  And no doubt Autodesk will also be launching their 2009 family of products very  soon.&lt;br /&gt;&lt;br /&gt;So it will be interesting to have another look in about 6 months and once again compare these growing products.&lt;br /&gt;&lt;br /&gt;* Bentley PowerMap uses Bentley PowerDraft as the main engine instead of Bentley MicroStation.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6195961493286457645-7973463077497194155?l=iantidy.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/OIbvtDL0sEq2Ty1JaYOLGoVHRkY/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/OIbvtDL0sEq2Ty1JaYOLGoVHRkY/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/OIbvtDL0sEq2Ty1JaYOLGoVHRkY/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/OIbvtDL0sEq2Ty1JaYOLGoVHRkY/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/iantidy?a=Ufox0GT7"&gt;&lt;img src="http://feeds.feedburner.com/~f/iantidy?d=42" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/iantidy?a=2DzhBWbS"&gt;&lt;img src="http://feeds.feedburner.com/~f/iantidy?d=41" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/iantidy/~4/N2ibxJVpkRs" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/iantidy/~3/N2ibxJVpkRs/bentley-and-autodesk.html</link><author>noreply@blogger.com (Ian Tidy)</author><thr:total>1</thr:total><feedburner:origLink>http://iantidy.blogspot.com/2008/10/bentley-and-autodesk.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-6195961493286457645.post-999230669897648585</guid><pubDate>Thu, 21 Aug 2008 08:14:00 +0000</pubDate><atom:updated>2008-08-21T20:18:18.822+12:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">GIS</category><category domain="http://www.blogger.com/atom/ns#">CAD</category><title>CAD vs. GIS</title><description>Over the last few months, I have spent some time looking at CAD products, GIS products and CAD based GIS products.  All of these products groups have there place, but how do you get the best of both worlds.&lt;br /&gt;&lt;br /&gt;It seems wrong to design something in your CAD package, produce an as-built plan (CAD), and then export / import that data into your GIS package, and in some cases export the data back to CAD for cartographic and visualisation.  A lot of time and resources are spent in this process of importing and exporting of data between GIS and CAD.  I have heard of some organisations having up to six (6) import/export operations.&lt;br /&gt;&lt;br /&gt;Part of this wasted resource can be minimised by CAD based GIS.  Products like Bentley Map and Autodesk Map use a core CAD engine (and support CAD file formats), but have basic GIS functionality.  Now as a GIS, these packages tend to be very immature.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;So what is the solution?&lt;/span&gt;&lt;br /&gt;The solution is to use the best product for the job.  So I have been looking at using CAD based GIS products for data capture, data management, and visualisation.  But using traditional GIS products to for analysis of the same data (without the import/export process).&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;How can this be done?&lt;/span&gt;&lt;br /&gt;This is simply done by using a database as the backend data store instead of the native file formats.  I tested this with the Oracle XE database.  I loaded existing GIS data, opened the data from a CAD based GIS package (Bentley Map).  Data analysis was performed in a traditional GIS package (MapInfo Professional).  With cartographic presentation being done with a CAD package (Bentley MicroStation).&lt;br /&gt;&lt;br /&gt;The key to making this all work was the backend database.  At this stage, Oracle is the most widely supported database platform that will allow for this to work.  Hopefully, Microsoft SQL Server (with there spatial support) will have better support in the near future (I know for some products this will be at-least another year away).  But it would also be nice to see more support for open source databases.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6195961493286457645-999230669897648585?l=iantidy.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/SETZvpZhzsUwnKq-KsG6Do1ueAs/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/SETZvpZhzsUwnKq-KsG6Do1ueAs/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/SETZvpZhzsUwnKq-KsG6Do1ueAs/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/SETZvpZhzsUwnKq-KsG6Do1ueAs/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/iantidy?a=Vb4xJQyr"&gt;&lt;img src="http://feeds.feedburner.com/~f/iantidy?d=42" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/iantidy?a=ODZkCR4J"&gt;&lt;img src="http://feeds.feedburner.com/~f/iantidy?d=41" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/iantidy/~4/1NmV0GJ_uTI" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/iantidy/~3/1NmV0GJ_uTI/cad-vs-gis.html</link><author>noreply@blogger.com (Ian Tidy)</author><thr:total>0</thr:total><feedburner:origLink>http://iantidy.blogspot.com/2008/08/cad-vs-gis.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-6195961493286457645.post-3277848635445700157</guid><pubDate>Tue, 22 Jul 2008 07:21:00 +0000</pubDate><atom:updated>2008-07-22T19:40:12.181+12:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">SQL Server 2008</category><category domain="http://www.blogger.com/atom/ns#">SpatialWare</category><category domain="http://www.blogger.com/atom/ns#">MapInfo</category><category domain="http://www.blogger.com/atom/ns#">Oracle</category><title>Oracle vs. Microsoft</title><description>Well I have finally made some time to look at Oracle and SQL Server 2008 and the basic spatial functionality of both these products.  Now my objective when I played with these products was to create an environment where I can have a single store for both spatial and a-spatial data and access and manipulate the data from a variety of clients.&lt;br /&gt;&lt;br /&gt;And not too surprising the winner was Oracle, the biggest winning factor for Oracle is that it is here now, and is well supported in many clients.&lt;br /&gt;&lt;br /&gt;So what does this mean for SQL Server 2008?  Well, I think Microsoft have a big struggle to compete on the spatial side.  I worked with Oracle XE, which out performed SQL Server with all the clients I tested.  Oracle have also dropped the pricing considerably and can compete on pricing, especially when you can run Oracle on a Linux server to get even better performance, and lower costs.&lt;br /&gt;&lt;br /&gt;So what about MapInfo SpatialWare on SQL Server?  Again the native Oracle client is much quicker the connecting to SpatialWare (via ODBC).  And given that SpatialWare is probably only going to be around for a few more releases (at the most), I would probably invest in Oracle.&lt;br /&gt;&lt;br /&gt;What about for smaller installations?  Again, Oracle have their free XE release which I found easy to setup and get working.&lt;br /&gt;&lt;br /&gt;So which is better?  Well as yet I am undecided, but at this stage I think Oracle.  I think time will tell, but it will be interesting to see the development programs for support of SQL Server in the client software.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6195961493286457645-3277848635445700157?l=iantidy.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/_W9jZykw63Vyx-bysIqwIFjX4aM/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/_W9jZykw63Vyx-bysIqwIFjX4aM/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/_W9jZykw63Vyx-bysIqwIFjX4aM/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/_W9jZykw63Vyx-bysIqwIFjX4aM/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/iantidy?a=7WhllbaB"&gt;&lt;img src="http://feeds.feedburner.com/~f/iantidy?d=42" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/iantidy?a=w29J6A2Y"&gt;&lt;img src="http://feeds.feedburner.com/~f/iantidy?d=41" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/iantidy/~4/lu56EivV0Tc" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/iantidy/~3/lu56EivV0Tc/oracle-vs-microsoft.html</link><author>noreply@blogger.com (Ian Tidy)</author><thr:total>7</thr:total><feedburner:origLink>http://iantidy.blogspot.com/2008/07/oracle-vs-microsoft.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-6195961493286457645.post-4221085146913307643</guid><pubDate>Mon, 09 Jun 2008 04:38:00 +0000</pubDate><atom:updated>2008-06-09T16:46:13.225+12:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">SQL Server 2008</category><category domain="http://www.blogger.com/atom/ns#">PB MapInfo</category><category domain="http://www.blogger.com/atom/ns#">Bentley Map</category><category domain="http://www.blogger.com/atom/ns#">MapInfo Professional</category><category domain="http://www.blogger.com/atom/ns#">Bentley Systems</category><title>What are they doing?</title><description>Over the last few days, I have been looking at the latest releases of PB MapInfo Professional and Bentley Map. I was excited when PB MapInfo announced support for SQL Server 2008, and I had heard rumours that Bentley Map is also getting support in the May 2008 release. I thought this would give me a solution that would allow me to have the best of both products and store the data in a common format and a central location.&lt;br /&gt;&lt;br /&gt;Now, when I installed Bentley Map; I wasn't too surprised that the SQL Server support wasn't there (since it was only a rumour that I heard and Bentley Systems hadn't made any public statement). I have since found some comments in a Bentley forum stating that the support is still some time away. My guess is that it will be in the Bentley Microstation "Athens" release, which is currently under development (or the release of Bentley Map for "Athens").&lt;br /&gt;&lt;br /&gt;On the other hand; PB MapInfo did announce support for SQL Server 2008. But as I read the version comparison for MapInfo Professional 9.5, I notice this "Support for Read SQL Server 2008 native Spatial data and read and write SQL Server 2008 textual data". So "yes" MI Pro 9.5 supports SQL Server 2008, as long as you don't want to edit the spatial features. This sound almost like read-only access.&lt;br /&gt;&lt;br /&gt;For many people who has Safe Software FME, we have had read-only support for SQL Server 2008 (from MI Pro 9.0) for some time, so how is this much different? I can think of some situations where you may want to edit the attribute data without modifying the spatial data, but not many.&lt;br /&gt;&lt;br /&gt;I expected that since both Bentley Systems and PB MapInfo have adopted the Microsoft platform, and work closely with Microsoft; that they would both fully support the latest technology from Microsoft, but this is not the case.&lt;br /&gt;&lt;br /&gt;I have heard the MapInfo SpatialWare support would be 6 - 12 months after the release of SQL Server 2008. My guess is that both PB MapInfo Professional and Bentley Map won't have full support for SQL Server 2008 until their next major releases (at the earliest), so this could be around this time next year.&lt;br /&gt;&lt;br /&gt;I have been told that AutoDesk, ESRI, many open source projects and a few smaller GIS applications already have full read / write support for SQL Server 2008 (I haven't checked this for myself). So why hasn't Bentley Systems and PB MapInfo?&lt;br /&gt;&lt;br /&gt;So is there much in this release of these products? Bentley Map didn't seem to change much since the last version I saw, I think this was more of an update and patching. But MI Pro has some new features. PB MapInfo have added .NET programming support and added MapCAD (which is available separately, see &lt;a href="http://www.geoas.de/" target="_blank"&gt;http://www.geoas.de/&lt;/a&gt; for details), but the support I have been wanting to see in both these products just isn't there.&lt;br /&gt;&lt;br /&gt;So, if you are looking for a common data store, and database for you spatial data, and need it to be supported by both PB MapInfo and Bentley Systems, then your only options is still Oracle, even the free version supports the basic SDO_GEOMETRY and for a datastore, this is all you need.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6195961493286457645-4221085146913307643?l=iantidy.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/GbDu-csGdgi7qHKABsrHLqXc40k/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/GbDu-csGdgi7qHKABsrHLqXc40k/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/GbDu-csGdgi7qHKABsrHLqXc40k/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/GbDu-csGdgi7qHKABsrHLqXc40k/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/iantidy?a=tzpMX5fC"&gt;&lt;img src="http://feeds.feedburner.com/~f/iantidy?d=42" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/iantidy?a=vlU6bO9y"&gt;&lt;img src="http://feeds.feedburner.com/~f/iantidy?d=41" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/iantidy/~4/lHmKvGdCM2Q" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/iantidy/~3/lHmKvGdCM2Q/what-are-they-doing.html</link><author>noreply@blogger.com (Ian Tidy)</author><thr:total>0</thr:total><feedburner:origLink>http://iantidy.blogspot.com/2008/06/what-are-they-doing.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-6195961493286457645.post-6743568799002368048</guid><pubDate>Wed, 28 May 2008 05:05:00 +0000</pubDate><atom:updated>2008-05-28T17:14:27.583+12:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Geospatial Office</category><category domain="http://www.blogger.com/atom/ns#">Mash-up</category><category domain="http://www.blogger.com/atom/ns#">NZGO</category><category domain="http://www.blogger.com/atom/ns#">Competition</category><title>Mash Up 2008 - Part 3</title><description>Today I got an email from the New Zealand Geospatial Office about the Mash Up Competition and all things are go.  The rules can be viewed at &lt;a href="http://www.barcamp.org.nz/wellington-spatial-mash-2008-1-may-2008/rules-mash-2008"&gt;http://www.barcamp.org.nz/wellington-spatial-mash-2008-1-may-2008/rules-mash-2008&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Geospatial Mash-up 2008 brings together leading technical experts and budding enthusiasts. The aim of the event is to showcase how geospatial data about New Zealand can be used. The New Zealand Geospatial Office seeks to highlight the value of being able to easily combine and reuse data for multiple purposes. In addition, the Office seeks to show how open source software and open source standards can be used to analyse and display data.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6195961493286457645-6743568799002368048?l=iantidy.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/n6fDhuUSRANfsx4hpSgAjn7wgYM/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/n6fDhuUSRANfsx4hpSgAjn7wgYM/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/n6fDhuUSRANfsx4hpSgAjn7wgYM/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/n6fDhuUSRANfsx4hpSgAjn7wgYM/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/iantidy?a=rBOiHa6N"&gt;&lt;img src="http://feeds.feedburner.com/~f/iantidy?d=42" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/iantidy?a=32uYe4UU"&gt;&lt;img src="http://feeds.feedburner.com/~f/iantidy?d=41" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/iantidy/~4/0Vpx_CVIDxI" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/iantidy/~3/0Vpx_CVIDxI/mash-up-2008-part-3.html</link><author>noreply@blogger.com (Ian Tidy)</author><thr:total>0</thr:total><feedburner:origLink>http://iantidy.blogspot.com/2008/05/mash-up-2008-part-3.html</feedburner:origLink></item></channel></rss>

