[Mapbender-commits] r4581 - in trunk/mapbender/http: extensions
extensions/proj4js extensions/proj4js/build
extensions/proj4js/demo extensions/proj4js/demo/maps
extensions/proj4js/docs extensions/proj4js/docs/NaturalDocs
extensions/proj4js/docs/NaturalDocs/Data
extensions/proj4js/docs/NaturalDocs/files
extensions/proj4js/docs/NaturalDocs/index
extensions/proj4js/docs/NaturalDocs/javascript
extensions/proj4js/docs/NaturalDocs/styles
extensions/proj4js/lib extensions/proj4js/lib/defs
extensions/proj4js/lib/projCode extensions/proj4js/test
extensions/proj4js/tools extensions/proj4js/tools/catalogues
javascripts
svn_mapbender at osgeo.org
svn_mapbender at osgeo.org
Mon Aug 31 09:30:39 EDT 2009
Author: topi
Date: 2009-08-31 09:30:38 -0400 (Mon, 31 Aug 2009)
New Revision: 4581
Added:
trunk/mapbender/http/extensions/proj4js/
trunk/mapbender/http/extensions/proj4js/build/
trunk/mapbender/http/extensions/proj4js/build/README.txt
trunk/mapbender/http/extensions/proj4js/build/build.py
trunk/mapbender/http/extensions/proj4js/build/build.xml
trunk/mapbender/http/extensions/proj4js/build/buildUncompressed.py
trunk/mapbender/http/extensions/proj4js/build/library.cfg
trunk/mapbender/http/extensions/proj4js/build/license.txt
trunk/mapbender/http/extensions/proj4js/demo/
trunk/mapbender/http/extensions/proj4js/demo/ProjPane.js
trunk/mapbender/http/extensions/proj4js/demo/base.css
trunk/mapbender/http/extensions/proj4js/demo/index.html
trunk/mapbender/http/extensions/proj4js/demo/maps/
trunk/mapbender/http/extensions/proj4js/demo/maps/EPSG27563.js
trunk/mapbender/http/extensions/proj4js/demo/maps/EPSG42304.js
trunk/mapbender/http/extensions/proj4js/docs/
trunk/mapbender/http/extensions/proj4js/docs/NaturalDocs/
trunk/mapbender/http/extensions/proj4js/docs/NaturalDocs/Data/
trunk/mapbender/http/extensions/proj4js/docs/NaturalDocs/Data/ClassHierarchy.nd
trunk/mapbender/http/extensions/proj4js/docs/NaturalDocs/Data/ConfigFileInfo.nd
trunk/mapbender/http/extensions/proj4js/docs/NaturalDocs/Data/FileInfo.nd
trunk/mapbender/http/extensions/proj4js/docs/NaturalDocs/Data/PreviousMenuState.nd
trunk/mapbender/http/extensions/proj4js/docs/NaturalDocs/Data/PreviousSettings.nd
trunk/mapbender/http/extensions/proj4js/docs/NaturalDocs/Data/SymbolTable.nd
trunk/mapbender/http/extensions/proj4js/docs/NaturalDocs/Languages.txt
trunk/mapbender/http/extensions/proj4js/docs/NaturalDocs/Menu.txt
trunk/mapbender/http/extensions/proj4js/docs/NaturalDocs/Topics.txt
trunk/mapbender/http/extensions/proj4js/docs/NaturalDocs/files/
trunk/mapbender/http/extensions/proj4js/docs/NaturalDocs/files/proj4js-combined-js.html
trunk/mapbender/http/extensions/proj4js/docs/NaturalDocs/files/proj4js-js.html
trunk/mapbender/http/extensions/proj4js/docs/NaturalDocs/index.html
trunk/mapbender/http/extensions/proj4js/docs/NaturalDocs/index/
trunk/mapbender/http/extensions/proj4js/docs/NaturalDocs/index/Classes.html
trunk/mapbender/http/extensions/proj4js/docs/NaturalDocs/index/Functions.html
trunk/mapbender/http/extensions/proj4js/docs/NaturalDocs/index/General.html
trunk/mapbender/http/extensions/proj4js/docs/NaturalDocs/index/Properties.html
trunk/mapbender/http/extensions/proj4js/docs/NaturalDocs/javascript/
trunk/mapbender/http/extensions/proj4js/docs/NaturalDocs/javascript/main.js
trunk/mapbender/http/extensions/proj4js/docs/NaturalDocs/styles/
trunk/mapbender/http/extensions/proj4js/docs/NaturalDocs/styles/main.css
trunk/mapbender/http/extensions/proj4js/index.html
trunk/mapbender/http/extensions/proj4js/lib/
trunk/mapbender/http/extensions/proj4js/lib/defs/
trunk/mapbender/http/extensions/proj4js/lib/defs/EPSG102757.js
trunk/mapbender/http/extensions/proj4js/lib/defs/EPSG102758.js
trunk/mapbender/http/extensions/proj4js/lib/defs/EPSG21781.js
trunk/mapbender/http/extensions/proj4js/lib/defs/EPSG26591.js
trunk/mapbender/http/extensions/proj4js/lib/defs/EPSG26912.js
trunk/mapbender/http/extensions/proj4js/lib/defs/EPSG27200.js
trunk/mapbender/http/extensions/proj4js/lib/defs/EPSG27563.js
trunk/mapbender/http/extensions/proj4js/lib/defs/EPSG41001.js
trunk/mapbender/http/extensions/proj4js/lib/defs/EPSG4139.js
trunk/mapbender/http/extensions/proj4js/lib/defs/EPSG4181.js
trunk/mapbender/http/extensions/proj4js/lib/defs/EPSG42304.js
trunk/mapbender/http/extensions/proj4js/lib/defs/EPSG4272.js
trunk/mapbender/http/extensions/proj4js/lib/defs/EPSG4302.js
trunk/mapbender/http/extensions/proj4js/lib/defs/EPSG900913.js
trunk/mapbender/http/extensions/proj4js/lib/defs/EPSG900913.txt
trunk/mapbender/http/extensions/proj4js/lib/defs/GOOGLE.js
trunk/mapbender/http/extensions/proj4js/lib/proj4js-combined.js
trunk/mapbender/http/extensions/proj4js/lib/proj4js-compressed.js
trunk/mapbender/http/extensions/proj4js/lib/proj4js.js
trunk/mapbender/http/extensions/proj4js/lib/projCode/
trunk/mapbender/http/extensions/proj4js/lib/projCode/aea.js
trunk/mapbender/http/extensions/proj4js/lib/projCode/aeqd.js
trunk/mapbender/http/extensions/proj4js/lib/projCode/eqc.js
trunk/mapbender/http/extensions/proj4js/lib/projCode/eqdc.js
trunk/mapbender/http/extensions/proj4js/lib/projCode/equi.js
trunk/mapbender/http/extensions/proj4js/lib/projCode/gauss.js
trunk/mapbender/http/extensions/proj4js/lib/projCode/geocent.js
trunk/mapbender/http/extensions/proj4js/lib/projCode/gstmerc.js
trunk/mapbender/http/extensions/proj4js/lib/projCode/laea.js
trunk/mapbender/http/extensions/proj4js/lib/projCode/lcc.js
trunk/mapbender/http/extensions/proj4js/lib/projCode/merc.js
trunk/mapbender/http/extensions/proj4js/lib/projCode/mill.js
trunk/mapbender/http/extensions/proj4js/lib/projCode/moll.js
trunk/mapbender/http/extensions/proj4js/lib/projCode/nzmg.js
trunk/mapbender/http/extensions/proj4js/lib/projCode/omerc.js
trunk/mapbender/http/extensions/proj4js/lib/projCode/ortho.js
trunk/mapbender/http/extensions/proj4js/lib/projCode/poly.js
trunk/mapbender/http/extensions/proj4js/lib/projCode/sinu.js
trunk/mapbender/http/extensions/proj4js/lib/projCode/somerc.js
trunk/mapbender/http/extensions/proj4js/lib/projCode/stere.js
trunk/mapbender/http/extensions/proj4js/lib/projCode/sterea.js
trunk/mapbender/http/extensions/proj4js/lib/projCode/tmerc.js
trunk/mapbender/http/extensions/proj4js/lib/projCode/utm.js
trunk/mapbender/http/extensions/proj4js/lib/projCode/vandg.js
trunk/mapbender/http/extensions/proj4js/test/
trunk/mapbender/http/extensions/proj4js/test/base.css
trunk/mapbender/http/extensions/proj4js/test/index.html
trunk/mapbender/http/extensions/proj4js/test/runtests.js
trunk/mapbender/http/extensions/proj4js/test/testdata.js
trunk/mapbender/http/extensions/proj4js/tools/
trunk/mapbender/http/extensions/proj4js/tools/README.txt
trunk/mapbender/http/extensions/proj4js/tools/catalogues/
trunk/mapbender/http/extensions/proj4js/tools/catalogues/CRS
trunk/mapbender/http/extensions/proj4js/tools/catalogues/EPSG
trunk/mapbender/http/extensions/proj4js/tools/catalogues/IGNF
trunk/mapbender/http/extensions/proj4js/tools/jsmin.c
trunk/mapbender/http/extensions/proj4js/tools/jsmin.py
trunk/mapbender/http/extensions/proj4js/tools/mergejs.py
trunk/mapbender/http/extensions/proj4js/tools/mkpjcat.py
trunk/mapbender/http/extensions/proj4js/tools/pjjs.py
trunk/mapbender/http/extensions/proj4js/tools/toposort.py
trunk/mapbender/http/javascripts/mod_coordsLookup.js
Log:
http://trac.osgeo.org/mapbender/ticket/524
Added: trunk/mapbender/http/extensions/proj4js/build/README.txt
===================================================================
--- trunk/mapbender/http/extensions/proj4js/build/README.txt (rev 0)
+++ trunk/mapbender/http/extensions/proj4js/build/README.txt 2009-08-31 13:30:38 UTC (rev 4581)
@@ -0,0 +1,13 @@
+## HowTo: Build & deploy "Shrunk" Single File Library version of proj4js ##
+
+ * Build:
+
+ cd build
+ ./build.py
+ cd ..
+
+ * Upload the result to the server: e.g.
+
+ scp build/proj4js.js openlayers at openlayers.org:openlayers.org/htdocs/code/
+
+
Added: trunk/mapbender/http/extensions/proj4js/build/build.py
===================================================================
--- trunk/mapbender/http/extensions/proj4js/build/build.py (rev 0)
+++ trunk/mapbender/http/extensions/proj4js/build/build.py 2009-08-31 13:30:38 UTC (rev 4581)
@@ -0,0 +1,32 @@
+#!/usr/bin/env python
+
+import sys
+sys.path.append("../tools")
+
+import jsmin, mergejs
+
+sourceDirectory = "../lib"
+configFilename = "library.cfg"
+outputFilename = "../lib/proj4js-compressed.js"
+
+if len(sys.argv) > 1:
+ configFilename = sys.argv[1]
+ extension = configFilename[-4:]
+
+ if extension != ".cfg":
+ configFilename = sys.argv[1] + ".cfg"
+
+if len(sys.argv) > 2:
+ outputFilename = sys.argv[2]
+
+print "Merging libraries."
+merged = mergejs.run(sourceDirectory, None, configFilename)
+print "Compressing."
+minimized = jsmin.jsmin(merged)
+print "Adding license file."
+minimized = file("license.txt").read() + minimized
+
+print "Writing to %s." % outputFilename
+file(outputFilename, "w").write(minimized)
+
+print "Done."
Added: trunk/mapbender/http/extensions/proj4js/build/build.xml
===================================================================
--- trunk/mapbender/http/extensions/proj4js/build/build.xml (rev 0)
+++ trunk/mapbender/http/extensions/proj4js/build/build.xml 2009-08-31 13:30:38 UTC (rev 4581)
@@ -0,0 +1,159 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--*************************************************************************
+Filename : build.xml
+Project : proj4js
+Document Type : XML
+Purpose : build file for ant tool
+
+Author Date Description
+M.Adair 17-Dec-2001 initial version copied from mapbuilder
+
+$Id: build.xml 2955 2007-07-09 12:12:27Z steven $
+***************************************************************************--><!--
+-->
+<!-- A "project" describes a set of targets that may be requested
+ when Ant is executed. The "default" attribute defines the
+ target which is executed if no specific target is requested,
+ and the "basedir" attribute defines the current working directory
+ from which Ant executes the requested task. This is normally
+ set to the current working directory.
+-->
+ <project basedir=".." default="dist" name="proj4js">
+
+<!-- ===================== Property Definitions =========================== -->
+<!--
+ Each of the following properties are used in the build script.
+ Values for these properties are set by the first place they are
+ defined, from the following list:
+
+ * Definitions on the "ant" command line (ant -Dfoo=bar compile).
+
+ * Definitions from a "build.properties" file in the top level
+ source directory of this application.
+
+ * Definitions from a "build.properties" file in the developer's
+ home directory.
+
+ * Default definitions in this build.xml file.
+
+ You will note below that property values can be composed based on the
+ contents of previously defined properties. This is a powerful technique
+ that helps you minimize the number of changes required when your development
+ environment is modified. Note that property composition is allowed within
+ "build.properties" files as well as in the "build.xml" script.
+-->
+ <property file="build.properties"/>
+ <property file="${user.home}/build.properties"/>
+ <property file="default.properties"/>
+
+<!-- ==================== File and Directory Names ======================== -->
+<!--
+
+ These properties generally define file and directory names (or paths) that
+ affect where the build process stores its outputs.
+
+ app.name Base name of this application, used to
+ construct filenames and directories.
+ Defaults to "myapp".
+
+ app.path Context path to which this application should be
+ deployed (defaults to "/" plus the value of the
+ "app.name" property).
+
+ app.version Version number of this iteration of the application.
+
+ build.home The directory into which the "prepare" and
+ "compile" targets will generate their output.
+ Defaults to "build".
+
+ dist.home The name of the base directory in which
+ distribution files are created.
+ Defaults to "dist".
+-->
+
+ <property environment="env"/>
+ <property name="app.name" value="proj4js"/>
+ <property name="app.path" value="/${app.name}"/>
+ <property name="app.version" value="1.0.0-RC1"/>
+ <property name="build.home" value="${basedir}/tempBuild"/>
+ <property name="dist.home" value="${basedir}/dist"/>
+ <property name="docs.home" value="${build.home}/docs"/>
+
+
+<!-- ==================== Prepare Target ================================== -->
+<!--
+ The "prepare" target is used to create the "build" destination directory,
+ and copy the static contents of your web application to it. If you need
+ to copy static files from external dependencies, you can customize the
+ contents of this task.
+
+ Normally, this task is executed indirectly when needed.
+
+-->
+
+ <target name="prepare">
+ <!-- Create build directories as needed -->
+ <mkdir dir="${build.home}"/>
+ <!-- Copy static content of the mapbuilder project -->
+ <copy todir="${build.home}">
+ <fileset dir="${basedir}" excludes="tools/*.pyc "
+ includes="index.html
+ lib/proj4js.js,
+ lib/proj4js-combined.js
+ lib/proj4js-compressed.js
+ lib/defs/**
+ lib/projCode/**
+ build/**
+ demo/**
+ test/**
+ tools/**"
+ />
+ </copy>
+ </target>
+
+
+<!-- ==================== Clean Target ==================================== -->
+<!--
+
+ The "clean" target deletes any previous "build" and "dist" directory,
+ so that you can be ensured the application can be built from scratch.
+
+-->
+
+ <target description="Delete old build and dist directories" name="clean">
+ <delete dir="${build.home}"/>
+ <delete dir="${dist.home}"/>
+ </target>
+
+
+<!-- ==================== Documentation =================================== -->
+
+ <target description="Create documentation" name="docs" depends="prepare">
+
+ <mkdir dir="${build.home}/docs"/>
+ <mkdir dir="${build.home}/docs/NaturalDocs"/>
+
+ <echo message="Generating documentation"/>
+ <exec executable="cmd" os="Windows XP" dir="${build.home}">
+ <arg line="/c perl C:\Progra~1\NaturalDocs\NaturalDocs -i ./lib -o html ./docs/NaturalDocs -p ./docs/NaturalDocs -r"/>
+ </exec>
+ </target>
+
+
+<!-- ==================== Dist Target ===================================== -->
+<!--
+ The "dist" target creates the zip file distribution for the Apache/PHP
+ environment.
+-->
+ <target name="dist" description="Create binary distribution" depends="clean,prepare,docs">
+
+ <mkdir dir="${dist.home}"/>
+
+ <!-- Create application zip file -->
+ <zip destfile="${dist.home}/${app.name}-${app.version}.zip" update="true">
+ <zipfileset dir="${build.home}" prefix="proj4js"/>
+ </zip>
+
+ </target>
+
+</project>
Added: trunk/mapbender/http/extensions/proj4js/build/buildUncompressed.py
===================================================================
--- trunk/mapbender/http/extensions/proj4js/build/buildUncompressed.py (rev 0)
+++ trunk/mapbender/http/extensions/proj4js/build/buildUncompressed.py 2009-08-31 13:30:38 UTC (rev 4581)
@@ -0,0 +1,25 @@
+#!/usr/bin/env python
+
+import sys
+sys.path.append("../tools")
+
+import jsmin, mergejs
+
+sourceDirectory = "../lib"
+configFilename = "library.cfg"
+outputFilename = "../lib/proj4js-combined.js"
+
+if len(sys.argv) > 1:
+ configFilename = sys.argv[1] + ".cfg"
+if len(sys.argv) > 2:
+ outputFilename = sys.argv[2]
+
+print "Merging libraries."
+merged = mergejs.run(sourceDirectory, None, configFilename)
+print "Adding license file."
+merged = file("license.txt").read() + merged
+
+print "Writing to %s." % outputFilename
+file(outputFilename, "w").write(merged)
+
+print "Done."
Added: trunk/mapbender/http/extensions/proj4js/build/library.cfg
===================================================================
--- trunk/mapbender/http/extensions/proj4js/build/library.cfg (rev 0)
+++ trunk/mapbender/http/extensions/proj4js/build/library.cfg 2009-08-31 13:30:38 UTC (rev 4581)
@@ -0,0 +1,11 @@
+[first]
+proj4js.js
+
+[last]
+
+[include]
+projCode/*.js
+defs/GOOGLE.js
+
+[exclude]
+defs/*
Added: trunk/mapbender/http/extensions/proj4js/build/license.txt
===================================================================
--- trunk/mapbender/http/extensions/proj4js/build/license.txt (rev 0)
+++ trunk/mapbender/http/extensions/proj4js/build/license.txt 2009-08-31 13:30:38 UTC (rev 4581)
@@ -0,0 +1,11 @@
+/*
+ proj4js.js -- Javascript reprojection library.
+
+ Authors: Mike Adair madairATdmsolutions.ca
+ Richard Greenwood richATgreenwoodmap.com
+ Didier Richard
+ Stephen Irons
+ License: LGPL as per: http://www.gnu.org/copyleft/lesser.html
+ Note: This program is an almost direct port of the C library
+ Proj4.
+*/
Added: trunk/mapbender/http/extensions/proj4js/demo/ProjPane.js
===================================================================
--- trunk/mapbender/http/extensions/proj4js/demo/ProjPane.js (rev 0)
+++ trunk/mapbender/http/extensions/proj4js/demo/ProjPane.js 2009-08-31 13:30:38 UTC (rev 4581)
@@ -0,0 +1,91 @@
+var panes = {
+ mapL: {},
+ mapLL: {},
+ mapR: {}
+};
+
+ProjPane = Class.create();
+ProjPane.prototype = {
+ id: null,
+ map: null,
+ proj: null,
+
+ initialize: function(pane, code) {
+ this.id = pane;
+ if (code) this.setProj(code);
+ },
+
+ updateCoords: function(coords) {
+ document.getElementById(this.id+'_coords').innerHTML = coords.toString();
+ var pt = this.map.getLayerPxFromLonLat(coords);
+ this.marker.moveTo(pt);
+ },
+
+ setProj: function(code) {
+ document.getElementById(this.id+'_proj').value = code;
+
+ this.proj = new Proj4js.Proj(code);
+ var mapDef = Proj4js.maps[this.proj.srsCode];
+
+ if (this.map) this.map.destroy();
+ this.map = new OpenLayers.Map(this.id, mapDef.mapOptions);
+ this.mapLayer = new OpenLayers.Layer.WMS(mapDef.layerName, mapDef.layerUrl, mapDef.layerParams, mapDef.layerOptions);
+ this.map.addLayer(this.mapLayer);
+
+ this.map.addLayer(new OpenLayers.Layer.Markers(''));
+ this.marker = new OpenLayers.Marker(new OpenLayers.LonLat(0,0));
+ this.map.layers[1].addMarker(this.marker);
+ this.marker.map = this.map;
+ if (window.bounds) {
+ this.map.addLayer(new OpenLayers.Layer.Boxes());
+ this.map.layers[2].addMarker(new OpenLayers.Marker.Box(bounds));
+ this.map.setCenter(bounds.getCenterLonLat());
+ } else {
+ this.map.zoomToMaxExtent();
+ }
+ this.map.events.register('click', this.map, this.mapClicked.bind(this));
+
+ document.getElementById(this.id+'_units').innerHTML = this.proj.units;
+ document.getElementById(this.id+'_title').innerHTML = this.proj.title;
+ document.getElementById(this.id+'_class').innerHTML = this.proj.projName;
+ },
+
+ mapClicked: function(ev) {
+ var olc = this.map.getLonLatFromViewPortPx(ev.xy);
+ c = new Proj4js.Point(olc.lon, olc.lat);
+ this.updateCoords(c);
+
+ if (this.opposite && this.opposite.proj) {
+ var newCoords = this.proj.transform(c, this.opposite.proj);
+ this.opposite.updateCoords(newCoords);
+ }
+ if (this.common) {
+ var newCoords = this.proj.inverse(c);
+ this.common.updateCoords(newCoords);
+ }
+ if (this.projected1 && this.projected1.proj) {
+ var newCoords = this.projected1.proj.forward(c);
+ this.projected1.updateCoords(newCoords);
+ }
+ if (this.projected2 && this.projected2.proj) {
+ var newCoords = this.projected2.proj.forward(c);
+ this.projected2.updateCoords(newCoords);
+ }
+ }
+};
+
+
+function init() {
+ panes['mapLL'] = new ProjPane('mapLL',Proj4js.defaultDatum);
+ panes['mapL'] = new ProjPane('mapL');
+ panes['mapR'] = new ProjPane('mapR');
+
+ panes['mapLL'].projected1 = panes['mapL'];
+ panes['mapLL'].projected2 = panes['mapR'];
+ panes['mapL'].opposite = panes['mapR'];
+ panes['mapR'].opposite = panes['mapL'];
+ panes['mapL'].common = panes['mapLL'];
+ panes['mapR'].common = panes['mapLL'];
+
+};
+
Added: trunk/mapbender/http/extensions/proj4js/demo/base.css
===================================================================
--- trunk/mapbender/http/extensions/proj4js/demo/base.css (rev 0)
+++ trunk/mapbender/http/extensions/proj4js/demo/base.css 2009-08-31 13:30:38 UTC (rev 4581)
@@ -0,0 +1,22 @@
+#footer {
+ margin-top: 20px;
+ border-top: 1px solid #eee;
+ padding: 10px;
+}
+body {
+ font-family:Verdana;
+}
+#header {
+ background: #9D9FA1;
+ color: #FFFFFF;
+ font-family: "Trebuchet MS", Helvetica, Arial, sans-serif;
+ font-size: 18px;
+ text-shadow: 2px 2px 3px gray;
+ height: 3em;
+ padding: 4px 16px 0px 16px;
+ vertical-align: top;
+ margin:-10px -5px 0px -5px;
+ border-bottom: 10px solid #e9eef9;
+}
+#header h1{margin-top: 0px;font-weight:normal;}
+#navbar { background-color: #eee; margin: 0px -5px 10px -5px; padding: 10px; }
Added: trunk/mapbender/http/extensions/proj4js/demo/index.html
===================================================================
--- trunk/mapbender/http/extensions/proj4js/demo/index.html (rev 0)
+++ trunk/mapbender/http/extensions/proj4js/demo/index.html 2009-08-31 13:30:38 UTC (rev 4581)
@@ -0,0 +1,20 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
+<head>
+ <link href="base.css" type="text/css" rel="stylesheet"/>
+ <title>Proj4js Demonstration Page</title>
+ <script src="http://openlayers.org/api/OpenLayers.js"></script>
+ <script src="../lib/proj4js.js"></script>
+ <script src="../lib/maps/EPSG27563.js"></script>
+ <!--script src="../lib/defs/EPSG27563.js"></script-->
+ <script src="ProjPane.js"></script>
+</head>
+
+<body onload="init()">
+ <div id="header">
+ <h1>Proj4js demo page</h1>
+ <p>coming soon!</p>
+ </div>
+
+</body>
+</html>
\ No newline at end of file
Added: trunk/mapbender/http/extensions/proj4js/demo/maps/EPSG27563.js
===================================================================
--- trunk/mapbender/http/extensions/proj4js/demo/maps/EPSG27563.js (rev 0)
+++ trunk/mapbender/http/extensions/proj4js/demo/maps/EPSG27563.js 2009-08-31 13:30:38 UTC (rev 4581)
@@ -0,0 +1,11 @@
+Proj4js.maps.EPSG27563 = {
+ mapOptions: {
+ projection: 'EPSG:27563',
+ units: 'm',
+ maxResolution: 2000000/512
+ },
+ layerName: 'metacarta default',
+ layerUrl: 'http://labs.metacarta.com/wms-c/Basic.py',
+ layerParams: {'layers':'basic'},
+ layerOptions: null
+};
Added: trunk/mapbender/http/extensions/proj4js/demo/maps/EPSG42304.js
===================================================================
--- trunk/mapbender/http/extensions/proj4js/demo/maps/EPSG42304.js (rev 0)
+++ trunk/mapbender/http/extensions/proj4js/demo/maps/EPSG42304.js 2009-08-31 13:30:38 UTC (rev 4581)
@@ -0,0 +1,12 @@
+Proj4js.maps.EPSG43204 = {
+ mapOptions : {
+ maxExtent: new OpenLayers.Bounds(-3631568.75,-1293815.5,4491139.5833333321,4937122),
+ scales: [50000000,23207944.16806,10772173.45016,5000000,2320794.41681,1077217.34502,500000,232079.44168,107721.7345,50000],
+ units: 'm',
+ projection: 'EPSG:42304'
+ },
+ layerName: 'DM Solutions Demo',
+ layerUrl: "http://localhost/cgi-bin/mapserv.exe?MAP=/ms4w/apps/gmap/htdocs/gmap75_wms.map",
+ layerParams: {layers: "bathymetry,land_fn,park,drain_fn,drainage,prov_bound,fedlimit,rail,road,popplace", transparent: "false", format: "image/png" },
+ layerOptions: {singleTile: true}
+};
Added: trunk/mapbender/http/extensions/proj4js/docs/NaturalDocs/Data/ClassHierarchy.nd
===================================================================
(Binary files differ)
Property changes on: trunk/mapbender/http/extensions/proj4js/docs/NaturalDocs/Data/ClassHierarchy.nd
___________________________________________________________________
Added: svn:mime-type
+ application/octet-stream
Added: trunk/mapbender/http/extensions/proj4js/docs/NaturalDocs/Data/ConfigFileInfo.nd
===================================================================
--- trunk/mapbender/http/extensions/proj4js/docs/NaturalDocs/Data/ConfigFileInfo.nd (rev 0)
+++ trunk/mapbender/http/extensions/proj4js/docs/NaturalDocs/Data/ConfigFileInfo.nd 2009-08-31 13:30:38 UTC (rev 4581)
@@ -0,0 +1 @@
+#HæzÐHæzÐHæzÐHæzÐHæzÐ
\ No newline at end of file
Added: trunk/mapbender/http/extensions/proj4js/docs/NaturalDocs/Data/FileInfo.nd
===================================================================
--- trunk/mapbender/http/extensions/proj4js/docs/NaturalDocs/Data/FileInfo.nd (rev 0)
+++ trunk/mapbender/http/extensions/proj4js/docs/NaturalDocs/Data/FileInfo.nd 2009-08-31 13:30:38 UTC (rev 4581)
@@ -0,0 +1,45 @@
+1.35
+JavaScript
+C:\Documents and Settings\Mike\My Documents\devtree\osgeo\proj4js\tags\proj4js-1.0.0-RC1\tempBuild\lib\defs\EPSG26591.js 1223064271 0 C:\Documents and Settings\Mike\My Documents\devtree\osgeo\proj4js\tags\proj4js-1.0.0-RC1\tempBuild\lib\defs\EPSG26591.js
+C:\Documents and Settings\Mike\My Documents\devtree\osgeo\proj4js\tags\proj4js-1.0.0-RC1\tempBuild\lib\projCode\utm.js 1223064271 0 C:\Documents and Settings\Mike\My Documents\devtree\osgeo\proj4js\tags\proj4js-1.0.0-RC1\tempBuild\lib\projCode\utm.js
+C:\Documents and Settings\Mike\My Documents\devtree\osgeo\proj4js\tags\proj4js-1.0.0-RC1\tempBuild\lib\defs\EPSG102758.js 1223064271 0 C:\Documents and Settings\Mike\My Documents\devtree\osgeo\proj4js\tags\proj4js-1.0.0-RC1\tempBuild\lib\defs\EPSG102758.js
+C:\Documents and Settings\Mike\My Documents\devtree\osgeo\proj4js\tags\proj4js-1.0.0-RC1\tempBuild\lib\projCode\sinu.js 1223064271 0 C:\Documents and Settings\Mike\My Documents\devtree\osgeo\proj4js\tags\proj4js-1.0.0-RC1\tempBuild\lib\projCode\sinu.js
+C:\Documents and Settings\Mike\My Documents\devtree\osgeo\proj4js\tags\proj4js-1.0.0-RC1\tempBuild\lib\projCode\gauss.js 1223064271 0 C:\Documents and Settings\Mike\My Documents\devtree\osgeo\proj4js\tags\proj4js-1.0.0-RC1\tempBuild\lib\projCode\gauss.js
+C:\Documents and Settings\Mike\My Documents\devtree\osgeo\proj4js\tags\proj4js-1.0.0-RC1\tempBuild\lib\defs\EPSG900913.js 1223064271 0 C:\Documents and Settings\Mike\My Documents\devtree\osgeo\proj4js\tags\proj4js-1.0.0-RC1\tempBuild\lib\defs\EPSG900913.js
+C:\Documents and Settings\Mike\My Documents\devtree\osgeo\proj4js\tags\proj4js-1.0.0-RC1\tempBuild\lib\defs\EPSG4272.js 1223064271 0 C:\Documents and Settings\Mike\My Documents\devtree\osgeo\proj4js\tags\proj4js-1.0.0-RC1\tempBuild\lib\defs\EPSG4272.js
+C:\Documents and Settings\Mike\My Documents\devtree\osgeo\proj4js\tags\proj4js-1.0.0-RC1\tempBuild\lib\defs\EPSG26912.js 1223064271 0 C:\Documents and Settings\Mike\My Documents\devtree\osgeo\proj4js\tags\proj4js-1.0.0-RC1\tempBuild\lib\defs\EPSG26912.js
+C:\Documents and Settings\Mike\My Documents\devtree\osgeo\proj4js\tags\proj4js-1.0.0-RC1\tempBuild\lib\projCode\nzmg.js 1223064271 0 C:\Documents and Settings\Mike\My Documents\devtree\osgeo\proj4js\tags\proj4js-1.0.0-RC1\tempBuild\lib\projCode\nzmg.js
+C:\Documents and Settings\Mike\My Documents\devtree\osgeo\proj4js\tags\proj4js-1.0.0-RC1\tempBuild\lib\proj4js-compressed.js 1223064271 0 C:\Documents and Settings\Mike\My Documents\devtree\osgeo\proj4js\tags\proj4js-1.0.0-RC1\tempBuild\lib\proj4js-compressed.js
+C:\Documents and Settings\Mike\My Documents\devtree\osgeo\proj4js\tags\proj4js-1.0.0-RC1\tempBuild\lib\defs\GOOGLE.js 1223064271 0 C:\Documents and Settings\Mike\My Documents\devtree\osgeo\proj4js\tags\proj4js-1.0.0-RC1\tempBuild\lib\defs\GOOGLE.js
+C:\Documents and Settings\Mike\My Documents\devtree\osgeo\proj4js\tags\proj4js-1.0.0-RC1\tempBuild\lib\proj4js-combined.js 1223064271 1 Proj4js
+C:\Documents and Settings\Mike\My Documents\devtree\osgeo\proj4js\tags\proj4js-1.0.0-RC1\tempBuild\lib\projCode\omerc.js 1223064271 0 C:\Documents and Settings\Mike\My Documents\devtree\osgeo\proj4js\tags\proj4js-1.0.0-RC1\tempBuild\lib\projCode\omerc.js
+C:\Documents and Settings\Mike\My Documents\devtree\osgeo\proj4js\tags\proj4js-1.0.0-RC1\tempBuild\lib\projCode\aeqd.js 1223064271 0 C:\Documents and Settings\Mike\My Documents\devtree\osgeo\proj4js\tags\proj4js-1.0.0-RC1\tempBuild\lib\projCode\aeqd.js
+C:\Documents and Settings\Mike\My Documents\devtree\osgeo\proj4js\tags\proj4js-1.0.0-RC1\tempBuild\lib\projCode\equi.js 1223064271 0 C:\Documents and Settings\Mike\My Documents\devtree\osgeo\proj4js\tags\proj4js-1.0.0-RC1\tempBuild\lib\projCode\equi.js
+C:\Documents and Settings\Mike\My Documents\devtree\osgeo\proj4js\tags\proj4js-1.0.0-RC1\tempBuild\lib\projCode\lcc.js 1223064271 0 C:\Documents and Settings\Mike\My Documents\devtree\osgeo\proj4js\tags\proj4js-1.0.0-RC1\tempBuild\lib\projCode\lcc.js
+C:\Documents and Settings\Mike\My Documents\devtree\osgeo\proj4js\tags\proj4js-1.0.0-RC1\tempBuild\lib\defs\EPSG42304.js 1223064271 0 C:\Documents and Settings\Mike\My Documents\devtree\osgeo\proj4js\tags\proj4js-1.0.0-RC1\tempBuild\lib\defs\EPSG42304.js
+C:\Documents and Settings\Mike\My Documents\devtree\osgeo\proj4js\tags\proj4js-1.0.0-RC1\tempBuild\lib\defs\EPSG41001.js 1223064271 0 C:\Documents and Settings\Mike\My Documents\devtree\osgeo\proj4js\tags\proj4js-1.0.0-RC1\tempBuild\lib\defs\EPSG41001.js
+C:\Documents and Settings\Mike\My Documents\devtree\osgeo\proj4js\tags\proj4js-1.0.0-RC1\tempBuild\lib\projCode\laea.js 1223064271 0 C:\Documents and Settings\Mike\My Documents\devtree\osgeo\proj4js\tags\proj4js-1.0.0-RC1\tempBuild\lib\projCode\laea.js
+C:\Documents and Settings\Mike\My Documents\devtree\osgeo\proj4js\tags\proj4js-1.0.0-RC1\tempBuild\lib\defs\EPSG4302.js 1223064271 0 C:\Documents and Settings\Mike\My Documents\devtree\osgeo\proj4js\tags\proj4js-1.0.0-RC1\tempBuild\lib\defs\EPSG4302.js
+C:\Documents and Settings\Mike\My Documents\devtree\osgeo\proj4js\tags\proj4js-1.0.0-RC1\tempBuild\lib\defs\EPSG102757.js 1223064271 0 C:\Documents and Settings\Mike\My Documents\devtree\osgeo\proj4js\tags\proj4js-1.0.0-RC1\tempBuild\lib\defs\EPSG102757.js
+C:\Documents and Settings\Mike\My Documents\devtree\osgeo\proj4js\tags\proj4js-1.0.0-RC1\tempBuild\lib\projCode\sterea.js 1223064271 0 C:\Documents and Settings\Mike\My Documents\devtree\osgeo\proj4js\tags\proj4js-1.0.0-RC1\tempBuild\lib\projCode\sterea.js
+C:\Documents and Settings\Mike\My Documents\devtree\osgeo\proj4js\tags\proj4js-1.0.0-RC1\tempBuild\lib\defs\EPSG4181.js 1223064271 0 C:\Documents and Settings\Mike\My Documents\devtree\osgeo\proj4js\tags\proj4js-1.0.0-RC1\tempBuild\lib\defs\EPSG4181.js
+C:\Documents and Settings\Mike\My Documents\devtree\osgeo\proj4js\tags\proj4js-1.0.0-RC1\tempBuild\lib\defs\EPSG27563.js 1223064271 0 C:\Documents and Settings\Mike\My Documents\devtree\osgeo\proj4js\tags\proj4js-1.0.0-RC1\tempBuild\lib\defs\EPSG27563.js
+C:\Documents and Settings\Mike\My Documents\devtree\osgeo\proj4js\tags\proj4js-1.0.0-RC1\tempBuild\lib\projCode\merc.js 1223064271 0 C:\Documents and Settings\Mike\My Documents\devtree\osgeo\proj4js\tags\proj4js-1.0.0-RC1\tempBuild\lib\projCode\merc.js
+C:\Documents and Settings\Mike\My Documents\devtree\osgeo\proj4js\tags\proj4js-1.0.0-RC1\tempBuild\lib\projCode\gstmerc.js 1223064271 0 C:\Documents and Settings\Mike\My Documents\devtree\osgeo\proj4js\tags\proj4js-1.0.0-RC1\tempBuild\lib\projCode\gstmerc.js
+C:\Documents and Settings\Mike\My Documents\devtree\osgeo\proj4js\tags\proj4js-1.0.0-RC1\tempBuild\lib\projCode\stere.js 1223064271 0 C:\Documents and Settings\Mike\My Documents\devtree\osgeo\proj4js\tags\proj4js-1.0.0-RC1\tempBuild\lib\projCode\stere.js
+C:\Documents and Settings\Mike\My Documents\devtree\osgeo\proj4js\tags\proj4js-1.0.0-RC1\tempBuild\lib\projCode\moll.js 1223064271 0 C:\Documents and Settings\Mike\My Documents\devtree\osgeo\proj4js\tags\proj4js-1.0.0-RC1\tempBuild\lib\projCode\moll.js
+C:\Documents and Settings\Mike\My Documents\devtree\osgeo\proj4js\tags\proj4js-1.0.0-RC1\tempBuild\lib\projCode\poly.js 1223064271 0 C:\Documents and Settings\Mike\My Documents\devtree\osgeo\proj4js\tags\proj4js-1.0.0-RC1\tempBuild\lib\projCode\poly.js
+C:\Documents and Settings\Mike\My Documents\devtree\osgeo\proj4js\tags\proj4js-1.0.0-RC1\tempBuild\lib\projCode\vandg.js 1223064271 0 C:\Documents and Settings\Mike\My Documents\devtree\osgeo\proj4js\tags\proj4js-1.0.0-RC1\tempBuild\lib\projCode\vandg.js
+C:\Documents and Settings\Mike\My Documents\devtree\osgeo\proj4js\tags\proj4js-1.0.0-RC1\tempBuild\lib\projCode\mill.js 1223064271 0 C:\Documents and Settings\Mike\My Documents\devtree\osgeo\proj4js\tags\proj4js-1.0.0-RC1\tempBuild\lib\projCode\mill.js
+C:\Documents and Settings\Mike\My Documents\devtree\osgeo\proj4js\tags\proj4js-1.0.0-RC1\tempBuild\lib\projCode\ortho.js 1223064271 0 C:\Documents and Settings\Mike\My Documents\devtree\osgeo\proj4js\tags\proj4js-1.0.0-RC1\tempBuild\lib\projCode\ortho.js
+C:\Documents and Settings\Mike\My Documents\devtree\osgeo\proj4js\tags\proj4js-1.0.0-RC1\tempBuild\lib\defs\EPSG27200.js 1223064271 0 C:\Documents and Settings\Mike\My Documents\devtree\osgeo\proj4js\tags\proj4js-1.0.0-RC1\tempBuild\lib\defs\EPSG27200.js
+C:\Documents and Settings\Mike\My Documents\devtree\osgeo\proj4js\tags\proj4js-1.0.0-RC1\tempBuild\lib\projCode\aea.js 1223064271 0 C:\Documents and Settings\Mike\My Documents\devtree\osgeo\proj4js\tags\proj4js-1.0.0-RC1\tempBuild\lib\projCode\aea.js
+C:\Documents and Settings\Mike\My Documents\devtree\osgeo\proj4js\tags\proj4js-1.0.0-RC1\tempBuild\lib\projCode\eqdc.js 1223064271 0 C:\Documents and Settings\Mike\My Documents\devtree\osgeo\proj4js\tags\proj4js-1.0.0-RC1\tempBuild\lib\projCode\eqdc.js
+C:\Documents and Settings\Mike\My Documents\devtree\osgeo\proj4js\tags\proj4js-1.0.0-RC1\tempBuild\lib\defs\EPSG900913.txt 1223064271 0 C:\Documents and Settings\Mike\My Documents\devtree\osgeo\proj4js\tags\proj4js-1.0.0-RC1\tempBuild\lib\defs\EPSG900913.txt
+C:\Documents and Settings\Mike\My Documents\devtree\osgeo\proj4js\tags\proj4js-1.0.0-RC1\tempBuild\lib\proj4js.js 1223064271 1 Proj4js
+C:\Documents and Settings\Mike\My Documents\devtree\osgeo\proj4js\tags\proj4js-1.0.0-RC1\tempBuild\lib\defs\EPSG21781.js 1223064271 0 C:\Documents and Settings\Mike\My Documents\devtree\osgeo\proj4js\tags\proj4js-1.0.0-RC1\tempBuild\lib\defs\EPSG21781.js
+C:\Documents and Settings\Mike\My Documents\devtree\osgeo\proj4js\tags\proj4js-1.0.0-RC1\tempBuild\lib\projCode\eqc.js 1223064271 0 C:\Documents and Settings\Mike\My Documents\devtree\osgeo\proj4js\tags\proj4js-1.0.0-RC1\tempBuild\lib\projCode\eqc.js
+C:\Documents and Settings\Mike\My Documents\devtree\osgeo\proj4js\tags\proj4js-1.0.0-RC1\tempBuild\lib\projCode\geocent.js 1223064271 0 C:\Documents and Settings\Mike\My Documents\devtree\osgeo\proj4js\tags\proj4js-1.0.0-RC1\tempBuild\lib\projCode\geocent.js
+C:\Documents and Settings\Mike\My Documents\devtree\osgeo\proj4js\tags\proj4js-1.0.0-RC1\tempBuild\lib\projCode\somerc.js 1223064271 0 C:\Documents and Settings\Mike\My Documents\devtree\osgeo\proj4js\tags\proj4js-1.0.0-RC1\tempBuild\lib\projCode\somerc.js
+C:\Documents and Settings\Mike\My Documents\devtree\osgeo\proj4js\tags\proj4js-1.0.0-RC1\tempBuild\lib\projCode\tmerc.js 1223064271 0 C:\Documents and Settings\Mike\My Documents\devtree\osgeo\proj4js\tags\proj4js-1.0.0-RC1\tempBuild\lib\projCode\tmerc.js
+C:\Documents and Settings\Mike\My Documents\devtree\osgeo\proj4js\tags\proj4js-1.0.0-RC1\tempBuild\lib\defs\EPSG4139.js 1223064271 0 C:\Documents and Settings\Mike\My Documents\devtree\osgeo\proj4js\tags\proj4js-1.0.0-RC1\tempBuild\lib\defs\EPSG4139.js
Added: trunk/mapbender/http/extensions/proj4js/docs/NaturalDocs/Data/PreviousMenuState.nd
===================================================================
(Binary files differ)
Property changes on: trunk/mapbender/http/extensions/proj4js/docs/NaturalDocs/Data/PreviousMenuState.nd
___________________________________________________________________
Added: svn:mime-type
+ application/octet-stream
Added: trunk/mapbender/http/extensions/proj4js/docs/NaturalDocs/Data/PreviousSettings.nd
===================================================================
(Binary files differ)
Property changes on: trunk/mapbender/http/extensions/proj4js/docs/NaturalDocs/Data/PreviousSettings.nd
___________________________________________________________________
Added: svn:mime-type
+ application/octet-stream
Added: trunk/mapbender/http/extensions/proj4js/docs/NaturalDocs/Data/SymbolTable.nd
===================================================================
(Binary files differ)
Property changes on: trunk/mapbender/http/extensions/proj4js/docs/NaturalDocs/Data/SymbolTable.nd
___________________________________________________________________
Added: svn:mime-type
+ application/octet-stream
Added: trunk/mapbender/http/extensions/proj4js/docs/NaturalDocs/Languages.txt
===================================================================
--- trunk/mapbender/http/extensions/proj4js/docs/NaturalDocs/Languages.txt (rev 0)
+++ trunk/mapbender/http/extensions/proj4js/docs/NaturalDocs/Languages.txt 2009-08-31 13:30:38 UTC (rev 4581)
@@ -0,0 +1,113 @@
+Format: 1.35
+
+# This is the Natural Docs languages file for this project. If you change
+# anything here, it will apply to THIS PROJECT ONLY. If you'd like to change
+# something for all your projects, edit the Languages.txt in Natural Docs'
+# Config directory instead.
+
+
+# You can prevent certain file extensions from being scanned like this:
+# Ignore Extensions: [extension] [extension] ...
+
+
+#-------------------------------------------------------------------------------
+# SYNTAX:
+#
+# Unlike other Natural Docs configuration files, in this file all comments
+# MUST be alone on a line. Some languages deal with the # character, so you
+# cannot put comments on the same line as content.
+#
+# Also, all lists are separated with spaces, not commas, again because some
+# languages may need to use them.
+#
+# Language: [name]
+# Alter Language: [name]
+# Defines a new language or alters an existing one. Its name can use any
+# characters. If any of the properties below have an add/replace form, you
+# must use that when using Alter Language.
+#
+# The language Shebang Script is special. It's entry is only used for
+# extensions, and files with those extensions have their shebang (#!) lines
+# read to determine the real language of the file. Extensionless files are
+# always treated this way.
+#
+# The language Text File is also special. It's treated as one big comment
+# so you can put Natural Docs content in them without special symbols. Also,
+# if you don't specify a package separator, ignored prefixes, or enum value
+# behavior, it will copy those settings from the language that is used most
+# in the source tree.
+#
+# Extensions: [extension] [extension] ...
+# [Add/Replace] Extensions: [extension] [extension] ...
+# Defines the file extensions of the language's source files. You can
+# redefine extensions found in the main languages file. You can use * to
+# mean any undefined extension.
+#
+# Shebang Strings: [string] [string] ...
+# [Add/Replace] Shebang Strings: [string] [string] ...
+# Defines a list of strings that can appear in the shebang (#!) line to
+# designate that it's part of the language. You can redefine strings found
+# in the main languages file.
+#
+# Ignore Prefixes in Index: [prefix] [prefix] ...
+# [Add/Replace] Ignored Prefixes in Index: [prefix] [prefix] ...
+#
+# Ignore [Topic Type] Prefixes in Index: [prefix] [prefix] ...
+# [Add/Replace] Ignored [Topic Type] Prefixes in Index: [prefix] [prefix] ...
+# Specifies prefixes that should be ignored when sorting symbols in an
+# index. Can be specified in general or for a specific topic type.
+#
+#------------------------------------------------------------------------------
+# For basic language support only:
+#
+# Line Comments: [symbol] [symbol] ...
+# Defines a space-separated list of symbols that are used for line comments,
+# if any.
+#
+# Block Comments: [opening sym] [closing sym] [opening sym] [closing sym] ...
+# Defines a space-separated list of symbol pairs that are used for block
+# comments, if any.
+#
+# Package Separator: [symbol]
+# Defines the default package separator symbol. The default is a dot.
+#
+# [Topic Type] Prototype Enders: [symbol] [symbol] ...
+# When defined, Natural Docs will attempt to get a prototype from the code
+# immediately following the topic type. It stops when it reaches one of
+# these symbols. Use \n for line breaks.
+#
+# Line Extender: [symbol]
+# Defines the symbol that allows a prototype to span multiple lines if
+# normally a line break would end it.
+#
+# Enum Values: [global|under type|under parent]
+# Defines how enum values are referenced. The default is global.
+# global - Values are always global, referenced as 'value'.
+# under type - Values are under the enum type, referenced as
+# 'package.enum.value'.
+# under parent - Values are under the enum's parent, referenced as
+# 'package.value'.
+#
+# Perl Package: [perl package]
+# Specifies the Perl package used to fine-tune the language behavior in ways
+# too complex to do in this file.
+#
+#------------------------------------------------------------------------------
+# For full language support only:
+#
+# Full Language Support: [perl package]
+# Specifies the Perl package that has the parsing routines necessary for full
+# language support.
+#
+#-------------------------------------------------------------------------------
+
+# The following languages are defined in the main file, if you'd like to alter
+# them:
+#
+# Text File, Shebang Script, C/C++, C#, Java, JavaScript, Perl, Python,
+# PHP, SQL, Visual Basic, Pascal, Assembly, Ada, Tcl, Ruby, Makefile,
+# ActionScript, ColdFusion, R, Fortran
+
+# If you add a language that you think would be useful to other developers
+# and should be included in Natural Docs by default, please e-mail it to
+# languages [at] naturaldocs [dot] org.
Added: trunk/mapbender/http/extensions/proj4js/docs/NaturalDocs/Menu.txt
===================================================================
--- trunk/mapbender/http/extensions/proj4js/docs/NaturalDocs/Menu.txt (rev 0)
+++ trunk/mapbender/http/extensions/proj4js/docs/NaturalDocs/Menu.txt 2009-08-31 13:30:38 UTC (rev 4581)
@@ -0,0 +1,43 @@
+Format: 1.35
+
+
+# You can add a title and sub-title to your menu like this:
+# Title: [project name]
+# SubTitle: [subtitle]
+
+# You can add a footer to your documentation like this:
+# Footer: [text]
+# If you want to add a copyright notice, this would be the place to do it.
+
+
+# --------------------------------------------------------------------------
+#
+# Cut and paste the lines below to change the order in which your files
+# appear on the menu. Don't worry about adding or removing files, Natural
+# Docs will take care of that.
+#
+# You can further organize the menu by grouping the entries. Add a
+# "Group: [name] {" line to start a group, and add a "}" to end it.
+#
+# You can add text and web links to the menu by adding "Text: [text]" and
+# "Link: [name] ([URL])" lines, respectively.
+#
+# The formatting and comments are auto-generated, so don't worry about
+# neatness when editing the file. Natural Docs will clean it up the next
+# time it is run. When working with groups, just deal with the braces and
+# forget about the indentation and comments.
+#
+# --------------------------------------------------------------------------
+
+
+File: Proj4js (proj4js.js)
+File: Proj4js (proj4js-combined.js)
+
+Group: Index {
+
+ Index: Everything
+ Class Index: Classes
+ Function Index: Functions
+ Property Index: Properties
+ } # Group: Index
+
Added: trunk/mapbender/http/extensions/proj4js/docs/NaturalDocs/Topics.txt
===================================================================
--- trunk/mapbender/http/extensions/proj4js/docs/NaturalDocs/Topics.txt (rev 0)
+++ trunk/mapbender/http/extensions/proj4js/docs/NaturalDocs/Topics.txt 2009-08-31 13:30:38 UTC (rev 4581)
@@ -0,0 +1,84 @@
+Format: 1.35
+
+# This is the Natural Docs topics file for this project. If you change anything
+# here, it will apply to THIS PROJECT ONLY. If you'd like to change something
+# for all your projects, edit the Topics.txt in Natural Docs' Config directory
+# instead.
+
+
+# If you'd like to prevent keywords from being recognized by Natural Docs, you
+# can do it like this:
+# Ignore Keywords: [keyword], [keyword], ...
+#
+# Or you can use the list syntax like how they are defined:
+# Ignore Keywords:
+# [keyword]
+# [keyword], [plural keyword]
+# ...
+
+
+#-------------------------------------------------------------------------------
+# SYNTAX:
+#
+# Topic Type: [name]
+# Alter Topic Type: [name]
+# Creates a new topic type or alters one from the main file. Each type gets
+# its own index and behavior settings. Its name can have letters, numbers,
+# spaces, and these charaters: - / . '
+#
+# Plural: [name]
+# Sets the plural name of the topic type, if different.
+#
+# Keywords:
+# [keyword]
+# [keyword], [plural keyword]
+# ...
+# Defines or adds to the list of keywords for the topic type. They may only
+# contain letters, numbers, and spaces and are not case sensitive. Plural
+# keywords are used for list topics. You can redefine keywords found in the
+# main topics file.
+#
+# Index: [yes|no]
+# Whether the topics get their own index. Defaults to yes. Everything is
+# included in the general index regardless of this setting.
+#
+# Scope: [normal|start|end|always global]
+# How the topics affects scope. Defaults to normal.
+# normal - Topics stay within the current scope.
+# start - Topics start a new scope for all the topics beneath it,
+# like class topics.
+# end - Topics reset the scope back to global for all the topics
+# beneath it.
+# always global - Topics are defined as global, but do not change the scope
+# for any other topics.
+#
+# Class Hierarchy: [yes|no]
+# Whether the topics are part of the class hierarchy. Defaults to no.
+#
+# Variable Type: [yes|no]
+# Whether the topics can be a variable type. Defaults to no.
+#
+# Page Title If First: [yes|no]
+# Whether the topic's title becomes the page title if it's the first one in
+# a file. Defaults to no.
+#
+# Break Lists: [yes|no]
+# Whether list topics should be broken into individual topics in the output.
+# Defaults to no.
+#
+# Can Group With: [type], [type], ...
+# Defines a list of topic types that this one can possibly be grouped with.
+# Defaults to none.
+#-------------------------------------------------------------------------------
+
+# The following topics are defined in the main file, if you'd like to alter
+# their behavior or add keywords:
+#
+# Generic, Class, Interface, Section, File, Group, Function, Variable,
+# Property, Type, Constant, Enumeration, Event, Delegate, Macro,
+# Database, Database Table, Database View, Database Index, Database
+# Cursor, Database Trigger, Cookie, Build Target
+
+# If you add something that you think would be useful to other developers
+# and should be included in Natural Docs by default, please e-mail it to
+# topics [at] naturaldocs [dot] org.
Added: trunk/mapbender/http/extensions/proj4js/docs/NaturalDocs/files/proj4js-combined-js.html
===================================================================
--- trunk/mapbender/http/extensions/proj4js/docs/NaturalDocs/files/proj4js-combined-js.html (rev 0)
+++ trunk/mapbender/http/extensions/proj4js/docs/NaturalDocs/files/proj4js-combined-js.html 2009-08-31 13:30:38 UTC (rev 4581)
@@ -0,0 +1,94 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>Proj4js</title><link rel="stylesheet" type="text/css" href="../styles/main.css"><script language=JavaScript src="../javascript/main.js"></script></head><body class=UnframedPage onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!-- Generated by Natural Docs, version 1.35 -->
+<!-- http://www.naturaldocs.org -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+<table border=0 cellspacing=0 cellpadding=0 width=100%><tr><td class=MenuSection valign=top><!--START_ND_MENU--><div class=MEntry><div class=MFile><a href="proj4js-js.html">Proj4js</a></div></div><div class=MEntry><div class=MFile id=MSelected>Proj4js</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">Index</a><div class=MGroupContent id=MGroupContent1><div class=MEntry><div class=MIndex><a href="../index/General.html">Everything</a></div></div><div class=MEntry><div class=MIndex><a href="../index/Classes.html">Classes</a></div></div><div class=MEntry><div class=MIndex><a href="../index/Functions.html">Functions</a></div></div><div class=MEntry><div class=MIndex><a href="../index/Properties.html">Properties</a></div></div></div></div></div><!--END_ND_MENU--></td>
+
+<td class=ContentSection valign=top><div class=CClass id=MainTopic><div class=CTopic><h1 class=CTitle><a name="Proj4js"></a>Proj4js</h1><div class=CBody><p class=CParagraph>Proj4js is a JavaScript library to transform point coordinates from one coordinate system to another, including datum transformations.</p><p class=CParagraph>This library is a port of both the Proj.4 and GCTCP C libraries to JavaScript. Enabling these transformations in the browser allows geographic data stored in different projections to be combined in browser-based web mapping applications.</p><p class=CParagraph>Proj4js must have access to coordinate system initialization strings (which are the same as for PROJ.4 command line). Thes can be included in your application using a <script> tag or Proj4js can load CS initialization strings from a local directory or a web service such as spatialreference.org.</p><p class=CParagraph>Similarly, Proj4js must have access to projection transform code. These can be included individually using a <script> tag in your page, built into a custom build of Proj4js or loaded dynamically at run-time. Using the -combined and -compressed versions of Proj4js includes all projection class code by default.</p><p class=CParagraph>Note that dynamic loading of defs and code happens ascynchrously, check the Proj.readyToUse flag before using the Proj object. If the defs and code required by your application are loaded through script tags, dynamic loading is not required and the Proj object will be readyToUse on return from the constructor.</p><p class=CParagraph>All coordinates are handled as points which have a .x and a .y property which will be modified in place.</p><p class=CParagraph>Override Proj4js.reportError for output of alerts and warnings.</p><p class=CParagraph>See <a href="http://trac.osgeo.org/proj4js/wiki/UserGuide" class=LURL>http://trac.osgeo.org/proj4js/wiki/UserGuide</a> for full details.</p><!--START_ND_SUMMARY--><div class=Summary><div class=STitle>Summary</div><div class=SBorder><table border=0 cellspacing=0 cellpadding=0 class=STable><tr><td class=SEntrySize><div class=SMain><div class=SEntry><a href="#Proj4js" >Proj4js</a></div></div></td><td class=SDescriptionSize><div class=SMain><div class=SDescription>Proj4js is a JavaScript library to transform point coordinates from one coordinate system to another, including datum transformations.</div></div></td></tr><tr><td><div class=SGroup><div class=SEntry><div class=SIndent1><a href="#Proj4js.Properties" >Properties</a></div></div></div></td><td><div class=SGroup><div class=SDescription><div class=SIndent1></div></div></div></td></tr><tr class=SMarked><td><div class=SProperty><div class=SEntry><div class=SIndent2><a href="#Proj4js.defaultDatum" >defaultDatum</a></div></div></div></td><td><div class=SProperty><div class=SDescription><div class=SIndent2>The datum to use when no others a specified</div></div></div></td></tr><tr><td><div class=SGroup><div class=SEntry><div class=SIndent1><a href="#Proj4js.Functions" >Functions</a></div></div></div></td><td><div class=SGroup><div class=SDescription><div class=SIndent1></div></div></div></td></tr><tr class=SMarked><td><div class=SFunction><div class=SEntry><div class=SIndent2><a href="#Proj4js.transform(source,dest,point)" id=link1 onMouseOver="ShowTip(event, 'tt1', 'link1')" onMouseOut="HideTip('tt1')">transform(source, dest, point)</a></div></div></div></td><td><div class=SFunction><div class=SDescription><div class=SIndent2>Transform a point coordinate from one map projection to another. </div></div></div></td></tr><tr><td><div class=SFunction><div class=SEntry><div class=SIndent2><a href="#Proj4js.reportError" id=link2 onMouseOver="ShowTip(event, 'tt2', 'link2')" onMouseOut="HideTip('tt2')">reportError</a></div></div></div></td><td><div class=SFunction><div class=SDescription><div class=SIndent2>An internal method to report errors back to user. </div></div></div></td></tr><tr><td><div class=SSection><div class=SEntry><a href="#Private_Methods" >Private Methods</a></div></div></td><td><div class=SSection><div class=SDescription>The following properties and methods are intended for internal use only.</div></div></td></tr><tr><td><div class=SGroup><div class=SEntry><div class=SIndent1><a href="#Functions_and_Properties" >Functions and Properties</a></div></div></div></td><td><div class=SGroup><div class=SDescription><div class=SIndent1></div></div></div></td></tr><tr class=SMarked><td><div class=SFunction><div class=SEntry><div class=SIndent2><a href="#extend" id=link3 onMouseOver="ShowTip(event, 'tt3', 'link3')" onMouseOut="HideTip('tt3')">extend</a></div></div></div></td><td><div class=SFunction><div class=SDescription><div class=SIndent2>Copy all properties of a source object to a destination object. </div></div></div></td></tr><tr><td><div class=SFunction><div class=SEntry><div class=SIndent2><a href="#Class" id=link4 onMouseOver="ShowTip(event, 'tt4', 'link4')" onMouseOut="HideTip('tt4')">Class</a></div></div></div></td><td><div class=SFunction><div class=SDescription><div class=SIndent2>Base class used to construct all other classes. </div></div></div></td></tr><tr class=SMarked><td><div class=SFunction><div class=SEntry><div class=SIndent2><a href="#bind" id=link5 onMouseOver="ShowTip(event, 'tt5', 'link5')" onMouseOut="HideTip('tt5')">bind</a></div></div></div></td><td><div class=SFunction><div class=SDescription><div class=SIndent2>Bind a function to an object. </div></div></div></td></tr><tr><td><div class=SProperty><div class=SEntry><div class=SIndent2><a href="#defsLookupService" >defsLookupService</a></div></div></div></td><td><div class=SProperty><div class=SDescription><div class=SIndent2>AJAX service to retreive projection definition parameters from</div></div></div></td></tr><tr class=SMarked><td><div class=SProperty><div class=SEntry><div class=SIndent2><a href="#libPath" >libPath</a></div></div></div></td><td><div class=SProperty><div class=SDescription><div class=SIndent2>internal: http server path to library code.</div></div></div></td></tr><tr><td><div class=SFunction><div class=SEntry><div class=SIndent2><a href="#getScriptLocation" id=link6 onMouseOver="ShowTip(event, 'tt6', 'link6')" onMouseOut="HideTip('tt6')">getScriptLocation</a></div></div></div></td><td><div class=SFunction><div class=SDescription><div class=SIndent2>Return the path to this script.</div></div></div></td></tr><tr class=SMarked><td><div class=SFunction><div class=SEntry><div class=SIndent2><a href="#loadScript" id=link7 onMouseOver="ShowTip(event, 'tt7', 'link7')" onMouseOut="HideTip('tt7')">loadScript</a></div></div></div></td><td><div class=SFunction><div class=SDescription><div class=SIndent2>Load a JS file from a URL into a <script> tag in the page.</div></div></div></td></tr><tr><td><div class=SFunction><div class=SEntry><div class=SIndent2><a href="#checkReadyState" id=link8 onMouseOver="ShowTip(event, 'tt8', 'link8')" onMouseOut="HideTip('tt8')">checkReadyState</a></div></div></div></td><td><div class=SFunction><div class=SDescription><div class=SIndent2>IE workaround since there is no onerror handler. </div></div></div></td></tr><tr><td><div class=SClass><div class=SEntry><a href="#Proj4js.Proj" >Proj4js.Proj</a></div></div></td><td><div class=SClass><div class=SDescription>Proj objects provide transformation methods for point coordinates between geodetic latitude/longitude and a projected coordinate system. </div></div></td></tr><tr><td><div class=SGroup><div class=SEntry><div class=SIndent1><a href="#Proj4js.Proj.Properties" >Properties</a></div></div></div></td><td><div class=SGroup><div class=SDescription><div class=SIndent1></div></div></div></td></tr><tr class=SMarked><td><div class=SProperty><div class=SEntry><div class=SIndent2><a href="#Proj4js.Proj.readyToUse" >readyToUse</a></div></div></div></td><td><div class=SProperty><div class=SDescription><div class=SIndent2>Flag to indicate if initialization is complete for this Proj object</div></div></div></td></tr><tr><td><div class=SProperty><div class=SEntry><div class=SIndent2><a href="#Proj4js.Proj.title" >title</a></div></div></div></td><td><div class=SProperty><div class=SDescription><div class=SIndent2>The title to describe the projection</div></div></div></td></tr><tr class=SMarked><td><div class=SProperty><div class=SEntry><div class=SIndent2><a href="#Proj4js.Proj.projName" >projName</a></div></div></div></td><td><div class=SProperty><div class=SDescription><div class=SIndent2>The projection class for this projection, e.g. </div></div></div></td></tr><tr><td><div class=SProperty><div class=SEntry><div class=SIndent2><a href="#Proj4js.Proj.units" >units</a></div></div></div></td><td><div class=SProperty><div class=SDescription><div class=SIndent2>The units of the projection. </div></div></div></td></tr><tr class=SMarked><td><div class=SProperty><div class=SEntry><div class=SIndent2><a href="#Proj4js.Proj.datum" >datum</a></div></div></div></td><td><div class=SProperty><div class=SDescription><div class=SIndent2>The datum specified for the projection</div></div></div></td></tr><tr><td><div class=SGroup><div class=SEntry><div class=SIndent1><a href="#Proj4js.Proj.Functions" >Functions</a></div></div></div></td><td><div class=SGroup><div class=SDescription><div class=SIndent1></div></div></div></td></tr><tr class=SMarked><td><div class=SFunction><div class=SEntry><div class=SIndent2><a href="#Proj4js.Proj.initialize" id=link9 onMouseOver="ShowTip(event, 'tt9', 'link9')" onMouseOut="HideTip('tt9')">initialize</a></div></div></div></td><td><div class=SFunction><div class=SDescription><div class=SIndent2>Constructor for Proj4js.Proj objects</div></div></div></td></tr><tr><td><div class=SFunction><div class=SEntry><div class=SIndent2><a href="#Proj4js.Proj.loadProjDefinition" id=link10 onMouseOver="ShowTip(event, 'tt10', 'link10')" onMouseOut="HideTip('tt10')">loadProjDefinition</a></div></div></div></td><td><div class=SFunction><div class=SDescription><div class=SIndent2>Loads the coordinate system initialization string if required. </div></div></div></td></tr><tr class=SMarked><td><div class=SFunction><div class=SEntry><div class=SIndent2><a href="#Proj4js.Proj.loadFromService" id=link11 onMouseOver="ShowTip(event, 'tt11', 'link11')" onMouseOut="HideTip('tt11')">loadFromService</a></div></div></div></td><td><div class=SFunction><div class=SDescription><div class=SIndent2>Creates the REST URL for loading the definition from a web service and loads it.</div></div></div></td></tr><tr><td><div class=SFunction><div class=SEntry><div class=SIndent2><a href="#Proj4js.Proj.defsLoaded" id=link12 onMouseOver="ShowTip(event, 'tt12', 'link12')" onMouseOut="HideTip('tt12')">defsLoaded</a></div></div></div></td><td><div class=SFunction><div class=SDescription><div class=SIndent2>Continues the Proj object initilization once the def file is loaded</div></div></div></td></tr><tr class=SMarked><td><div class=SFunction><div class=SEntry><div class=SIndent2><a href="#Proj4js.Proj.checkDefsLoaded" id=link13 onMouseOver="ShowTip(event, 'tt13', 'link13')" onMouseOut="HideTip('tt13')">checkDefsLoaded</a></div></div></div></td><td><div class=SFunction><div class=SDescription><div class=SIndent2>This is the loadCheck method to see if the def object exists</div></div></div></td></tr><tr><td><div class=SFunction><div class=SEntry><div class=SIndent2><a href="#Proj4js.Proj.defsFailed" id=link14 onMouseOver="ShowTip(event, 'tt14', 'link14')" onMouseOut="HideTip('tt14')">defsFailed</a></div></div></div></td><td><div class=SFunction><div class=SDescription><div class=SIndent2>Report an error in loading the defs file, but continue on using WGS84</div></div></div></td></tr><tr class=SMarked><td><div class=SFunction><div class=SEntry><div class=SIndent2><a href="#Proj4js.Proj.loadProjCode" id=link15 onMouseOver="ShowTip(event, 'tt15', 'link15')" onMouseOut="HideTip('tt15')">loadProjCode</a></div></div></div></td><td><div class=SFunction><div class=SDescription><div class=SIndent2>Loads projection class code dynamically if required. </div></div></div></td></tr><tr><td><div class=SFunction><div class=SEntry><div class=SIndent2><a href="#Proj4js.Proj.loadProjCodeSuccess" id=link16 onMouseOver="ShowTip(event, 'tt16', 'link16')" onMouseOut="HideTip('tt16')">loadProjCodeSuccess</a></div></div></div></td><td><div class=SFunction><div class=SDescription><div class=SIndent2>Loads any proj dependencies or continue on to final initialization.</div></div></div></td></tr><tr class=SMarked><td><div class=SFunction><div class=SEntry><div class=SIndent2><a href="#Proj4js.Proj.defsFailed" >defsFailed</a></div></div></div></td><td><div class=SFunction><div class=SDescription><div class=SIndent2>Report an error in loading the proj file. </div></div></div></td></tr><tr><td><div class=SFunction><div class=SEntry><div class=SIndent2><a href="#Proj4js.Proj.checkCodeLoaded" id=link17 onMouseOver="ShowTip(event, 'tt17', 'link17')" onMouseOut="HideTip('tt17')">checkCodeLoaded</a></div></div></div></td><td><div class=SFunction><div class=SDescription><div class=SIndent2>This is the loadCheck method to see if the projection code is loaded</div></div></div></td></tr><tr class=SMarked><td><div class=SFunction><div class=SEntry><div class=SIndent2><a href="#Proj4js.Proj.initTransforms" id=link18 onMouseOver="ShowTip(event, 'tt18', 'link18')" onMouseOut="HideTip('tt18')">initTransforms</a></div></div></div></td><td><div class=SFunction><div class=SDescription><div class=SIndent2>Finalize the initialization of the Proj object</div></div></div></td></tr><tr><td><div class=SFunction><div class=SEntry><div class=SIndent2><a href="#Proj4js.Proj.parseDefs" id=link19 onMouseOver="ShowTip(event, 'tt19', 'link19')" onMouseOut="HideTip('tt19')">parseDefs</a></div></div></div></td><td><div class=SFunction><div class=SDescription><div class=SIndent2>Parses the PROJ.4 initialization string and sets the associated properties.</div></div></div></td></tr><tr class=SMarked><td><div class=SFunction><div class=SEntry><div class=SIndent2><a href="#Proj4js.Proj.deriveConstants" id=link20 onMouseOver="ShowTip(event, 'tt20', 'link20')" onMouseOut="HideTip('tt20')">deriveConstants</a></div></div></div></td><td><div class=SFunction><div class=SDescription><div class=SIndent2>Sets several derived constant values and initialization of datum and ellipse parameters.</div></div></div></td></tr></table></div></div><!--END_ND_SUMMARY--></div></div></div>
+
+<div class=CGroup><div class=CTopic><h3 class=CTitle><a name="Proj4js.Properties"></a>Properties</h3></div></div>
+
+<div class=CProperty><div class=CTopic><h3 class=CTitle><a name="Proj4js.defaultDatum"></a>defaultDatum</h3><div class=CBody><p class=CParagraph>The datum to use when no others a specified</p></div></div></div>
+
+<div class=CGroup><div class=CTopic><h3 class=CTitle><a name="Proj4js.Functions"></a>Functions</h3></div></div>
+
+<div class=CFunction><div class=CTopic><h3 class=CTitle><a name="Proj4js.transform(source,dest,point)"></a>transform(source, dest, point)</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>transform: function(</td><td class=PParameter nowrap>source,</td></tr><tr><td></td><td class=PParameter nowrap>dest,</td></tr><tr><td></td><td class=PParameter nowrap>point</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p class=CParagraph>Transform a point coordinate from one map projection to another. This is really the only public method you should need to use.</p><h4 class=CHeading>Parameters</h4><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList><tr><td class=CDLEntry>source</td><td class=CDLDescription>{Proj4js.Proj} source map projection for the transformation</td></tr><tr><td class=CDLEntry>dest</td><td class=CDLDescription>{Proj4js.Proj} destination map projection for the transformation</td></tr><tr><td class=CDLEntry>point</td><td class=CDLDescription>{Object} point to transform, may be geodetic (long, lat) or projected Cartesian (x,y), but should always have x,y properties.</td></tr></table></div></div></div>
+
+<div class=CFunction><div class=CTopic><h3 class=CTitle><a name="Proj4js.reportError"></a>reportError</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>reportError: function(</td><td class=PParameter nowrap>msg</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p class=CParagraph>An internal method to report errors back to user. Override this in applications to report error messages or throw exceptions.</p></div></div></div>
+
+<div class=CSection><div class=CTopic><h2 class=CTitle><a name="Private_Methods"></a>Private Methods</h2><div class=CBody><p class=CParagraph>The following properties and methods are intended for internal use only.</p><p class=CParagraph>This is a minimal implementation of JavaScript inheritance methods so that Proj4js can be used as a stand-alone library. These are copies of the equivalent OpenLayers methods at v2.7</p><!--START_ND_SUMMARY--><div class=Summary><div class=STitle>Summary</div><div class=SBorder><table border=0 cellspacing=0 cellpadding=0 class=STable><tr><td class=SEntrySize><div class=SGroup><div class=SEntry><a href="#Functions_and_Properties" >Functions and Properties</a></div></div></td><td class=SDescriptionSize><div class=SGroup><div class=SDescription></div></div></td></tr><tr class=SMarked><td><div class=SFunction><div class=SEntry><div class=SIndent1><a href="#extend" id=link21 onMouseOver="ShowTip(event, 'tt3', 'link21')" onMouseOut="HideTip('tt3')">extend</a></div></div></div></td><td><div class=SFunction><div class=SDescription><div class=SIndent1>Copy all properties of a source object to a destination object. </div></div></div></td></tr><tr><td><div class=SFunction><div class=SEntry><div class=SIndent1><a href="#Class" id=link22 onMouseOver="ShowTip(event, 'tt4', 'link22')" onMouseOut="HideTip('tt4')">Class</a></div></div></div></td><td><div class=SFunction><div class=SDescription><div class=SIndent1>Base class used to construct all other classes. </div></div></div></td></tr><tr class=SMarked><td><div class=SFunction><div class=SEntry><div class=SIndent1><a href="#bind" id=link23 onMouseOver="ShowTip(event, 'tt5', 'link23')" onMouseOut="HideTip('tt5')">bind</a></div></div></div></td><td><div class=SFunction><div class=SDescription><div class=SIndent1>Bind a function to an object. </div></div></div></td></tr><tr><td><div class=SProperty><div class=SEntry><div class=SIndent1><a href="#defsLookupService" >defsLookupService</a></div></div></div></td><td><div class=SProperty><div class=SDescription><div class=SIndent1>AJAX service to retreive projection definition parameters from</div></div></div></td></tr><tr class=SMarked><td><div class=SProperty><div class=SEntry><div class=SIndent1><a href="#libPath" >libPath</a></div></div></div></td><td><div class=SProperty><div class=SDescription><div class=SIndent1>internal: http server path to library code.</div></div></div></td></tr><tr><td><div class=SFunction><div class=SEntry><div class=SIndent1><a href="#getScriptLocation" id=link24 onMouseOver="ShowTip(event, 'tt6', 'link24')" onMouseOut="HideTip('tt6')">getScriptLocation</a></div></div></div></td><td><div class=SFunction><div class=SDescription><div class=SIndent1>Return the path to this script.</div></div></div></td></tr><tr class=SMarked><td><div class=SFunction><div class=SEntry><div class=SIndent1><a href="#loadScript" id=link25 onMouseOver="ShowTip(event, 'tt7', 'link25')" onMouseOut="HideTip('tt7')">loadScript</a></div></div></div></td><td><div class=SFunction><div class=SDescription><div class=SIndent1>Load a JS file from a URL into a <script> tag in the page.</div></div></div></td></tr><tr><td><div class=SFunction><div class=SEntry><div class=SIndent1><a href="#checkReadyState" id=link26 onMouseOver="ShowTip(event, 'tt8', 'link26')" onMouseOut="HideTip('tt8')">checkReadyState</a></div></div></div></td><td><div class=SFunction><div class=SDescription><div class=SIndent1>IE workaround since there is no onerror handler. </div></div></div></td></tr></table></div></div><!--END_ND_SUMMARY--></div></div></div>
+
+<div class=CGroup><div class=CTopic><h3 class=CTitle><a name="Functions_and_Properties"></a>Functions and Properties</h3></div></div>
+
+<div class=CFunction><div class=CTopic><h3 class=CTitle><a name="extend"></a>extend</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>extend: function(</td><td class=PParameter nowrap>destination,</td></tr><tr><td></td><td class=PParameter nowrap>source</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p class=CParagraph>Copy all properties of a source object to a destination object. Modifies the passed in destination object. Any properties on the source object that are set to undefined will not be (re)set on the destination object.</p><h4 class=CHeading>Parameters</h4><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList><tr><td class=CDLEntry>destination</td><td class=CDLDescription>{Object} The object that will be modified</td></tr><tr><td class=CDLEntry>source</td><td class=CDLDescription>{Object} The object with properties to be set on the destination</td></tr></table><h4 class=CHeading>Returns</h4><p class=CParagraph>{Object} The destination object.</p></div></div></div>
+
+<div class=CFunction><div class=CTopic><h3 class=CTitle><a name="Class"></a>Class</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>Class: function()</td></tr></table></blockquote><p class=CParagraph>Base class used to construct all other classes. Includes support for multiple inheritance.</p></div></div></div>
+
+<div class=CFunction><div class=CTopic><h3 class=CTitle><a name="bind"></a>bind</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>bind: function(</td><td class=PParameter nowrap>func,</td></tr><tr><td></td><td class=PParameter nowrap>object</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p class=CParagraph>Bind a function to an object. Method to easily create closures with ‘this’ altered.</p><h4 class=CHeading>Parameters</h4><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList><tr><td class=CDLEntry>func</td><td class=CDLDescription>{Function} Input function.</td></tr><tr><td class=CDLEntry>object</td><td class=CDLDescription>{Object} The object to bind to the input function (as this).</td></tr></table><h4 class=CHeading>Returns</h4><p class=CParagraph>{Function} A closure with ‘this’ set to the passed in object.</p></div></div></div>
+
+<div class=CProperty><div class=CTopic><h3 class=CTitle><a name="defsLookupService"></a>defsLookupService</h3><div class=CBody><p class=CParagraph>AJAX service to retreive projection definition parameters from</p></div></div></div>
+
+<div class=CProperty><div class=CTopic><h3 class=CTitle><a name="libPath"></a>libPath</h3><div class=CBody><p class=CParagraph>internal: http server path to library code.</p></div></div></div>
+
+<div class=CFunction><div class=CTopic><h3 class=CTitle><a name="getScriptLocation"></a>getScriptLocation</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>getScriptLocation: function ()</td></tr></table></blockquote><p class=CParagraph>Return the path to this script.</p><h4 class=CHeading>Returns</h4><p class=CParagraph>Path to this script</p></div></div></div>
+
+<div class=CFunction><div class=CTopic><h3 class=CTitle><a name="loadScript"></a>loadScript</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>loadScript: function(</td><td class=PParameter nowrap>url,</td></tr><tr><td></td><td class=PParameter nowrap>onload,</td></tr><tr><td></td><td class=PParameter nowrap>onfail,</td></tr><tr><td></td><td class=PParameter nowrap>loadCheck</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p class=CParagraph>Load a JS file from a URL into a <script> tag in the page.</p><h4 class=CHeading>Parameters</h4><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList><tr><td class=CDLEntry>url</td><td class=CDLDescription>{String} The URL containing the script to load</td></tr><tr><td class=CDLEntry>onload</td><td class=CDLDescription>{Function} A method to be executed when the script loads successfully</td></tr><tr><td class=CDLEntry>onfail</td><td class=CDLDescription>{Function} A method to be executed when there is an error loading the script</td></tr><tr><td class=CDLEntry>loadCheck</td><td class=CDLDescription>{Function} A boolean method that checks to see if the script has loaded. Typically this just checks for the existance of an object in the file just loaded.</td></tr></table></div></div></div>
+
+<div class=CFunction><div class=CTopic><h3 class=CTitle><a name="checkReadyState"></a>checkReadyState</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>checkReadyState: function()</td></tr></table></blockquote><p class=CParagraph>IE workaround since there is no onerror handler. Calls the user defined loadCheck method to determine if the script is loaded.</p></div></div></div>
+
+<div class=CClass><div class=CTopic><h2 class=CTitle><a name="Proj4js.Proj"></a>Proj4js.Proj</h2><div class=CBody><p class=CParagraph>Proj objects provide transformation methods for point coordinates between geodetic latitude/longitude and a projected coordinate system. once they have been initialized with a projection code.</p><p class=CParagraph>Initialization of Proj objects is with a projection code, usually EPSG codes, which is the key that will be used with the Proj4js.defs array.</p><p class=CParagraph>The code passed in will be stripped of colons and converted to uppercase to locate projection definition files.</p><p class=CParagraph>A projection object has properties for units and title strings.</p><!--START_ND_SUMMARY--><div class=Summary><div class=STitle>Summary</div><div class=SBorder><table border=0 cellspacing=0 cellpadding=0 class=STable><tr><td class=SEntrySize><div class=SGroup><div class=SEntry><a href="#Proj4js.Proj.Properties" >Properties</a></div></div></td><td class=SDescriptionSize><div class=SGroup><div class=SDescription></div></div></td></tr><tr class=SMarked><td><div class=SProperty><div class=SEntry><div class=SIndent1><a href="#Proj4js.Proj.readyToUse" >readyToUse</a></div></div></div></td><td><div class=SProperty><div class=SDescription><div class=SIndent1>Flag to indicate if initialization is complete for this Proj object</div></div></div></td></tr><tr><td><div class=SProperty><div class=SEntry><div class=SIndent1><a href="#Proj4js.Proj.title" >title</a></div></div></div></td><td><div class=SProperty><div class=SDescription><div class=SIndent1>The title to describe the projection</div></div></div></td></tr><tr class=SMarked><td><div class=SProperty><div class=SEntry><div class=SIndent1><a href="#Proj4js.Proj.projName" >projName</a></div></div></div></td><td><div class=SProperty><div class=SDescription><div class=SIndent1>The projection class for this projection, e.g. </div></div></div></td></tr><tr><td><div class=SProperty><div class=SEntry><div class=SIndent1><a href="#Proj4js.Proj.units" >units</a></div></div></div></td><td><div class=SProperty><div class=SDescription><div class=SIndent1>The units of the projection. </div></div></div></td></tr><tr class=SMarked><td><div class=SProperty><div class=SEntry><div class=SIndent1><a href="#Proj4js.Proj.datum" >datum</a></div></div></div></td><td><div class=SProperty><div class=SDescription><div class=SIndent1>The datum specified for the projection</div></div></div></td></tr><tr><td><div class=SGroup><div class=SEntry><a href="#Proj4js.Proj.Functions" >Functions</a></div></div></td><td><div class=SGroup><div class=SDescription></div></div></td></tr><tr class=SMarked><td><div class=SFunction><div class=SEntry><div class=SIndent1><a href="#Proj4js.Proj.initialize" id=link27 onMouseOver="ShowTip(event, 'tt9', 'link27')" onMouseOut="HideTip('tt9')">initialize</a></div></div></div></td><td><div class=SFunction><div class=SDescription><div class=SIndent1>Constructor for Proj4js.Proj objects</div></div></div></td></tr><tr><td><div class=SFunction><div class=SEntry><div class=SIndent1><a href="#Proj4js.Proj.loadProjDefinition" id=link28 onMouseOver="ShowTip(event, 'tt10', 'link28')" onMouseOut="HideTip('tt10')">loadProjDefinition</a></div></div></div></td><td><div class=SFunction><div class=SDescription><div class=SIndent1>Loads the coordinate system initialization string if required. </div></div></div></td></tr><tr class=SMarked><td><div class=SFunction><div class=SEntry><div class=SIndent1><a href="#Proj4js.Proj.loadFromService" id=link29 onMouseOver="ShowTip(event, 'tt11', 'link29')" onMouseOut="HideTip('tt11')">loadFromService</a></div></div></div></td><td><div class=SFunction><div class=SDescription><div class=SIndent1>Creates the REST URL for loading the definition from a web service and loads it.</div></div></div></td></tr><tr><td><div class=SFunction><div class=SEntry><div class=SIndent1><a href="#Proj4js.Proj.defsLoaded" id=link30 onMouseOver="ShowTip(event, 'tt12', 'link30')" onMouseOut="HideTip('tt12')">defsLoaded</a></div></div></div></td><td><div class=SFunction><div class=SDescription><div class=SIndent1>Continues the Proj object initilization once the def file is loaded</div></div></div></td></tr><tr class=SMarked><td><div class=SFunction><div class=SEntry><div class=SIndent1><a href="#Proj4js.Proj.checkDefsLoaded" id=link31 onMouseOver="ShowTip(event, 'tt13', 'link31')" onMouseOut="HideTip('tt13')">checkDefsLoaded</a></div></div></div></td><td><div class=SFunction><div class=SDescription><div class=SIndent1>This is the loadCheck method to see if the def object exists</div></div></div></td></tr><tr><td><div class=SFunction><div class=SEntry><div class=SIndent1><a href="#Proj4js.Proj.defsFailed" id=link32 onMouseOver="ShowTip(event, 'tt14', 'link32')" onMouseOut="HideTip('tt14')">defsFailed</a></div></div></div></td><td><div class=SFunction><div class=SDescription><div class=SIndent1>Report an error in loading the defs file, but continue on using WGS84</div></div></div></td></tr><tr class=SMarked><td><div class=SFunction><div class=SEntry><div class=SIndent1><a href="#Proj4js.Proj.loadProjCode" id=link33 onMouseOver="ShowTip(event, 'tt15', 'link33')" onMouseOut="HideTip('tt15')">loadProjCode</a></div></div></div></td><td><div class=SFunction><div class=SDescription><div class=SIndent1>Loads projection class code dynamically if required. </div></div></div></td></tr><tr><td><div class=SFunction><div class=SEntry><div class=SIndent1><a href="#Proj4js.Proj.loadProjCodeSuccess" id=link34 onMouseOver="ShowTip(event, 'tt16', 'link34')" onMouseOut="HideTip('tt16')">loadProjCodeSuccess</a></div></div></div></td><td><div class=SFunction><div class=SDescription><div class=SIndent1>Loads any proj dependencies or continue on to final initialization.</div></div></div></td></tr><tr class=SMarked><td><div class=SFunction><div class=SEntry><div class=SIndent1><a href="#Proj4js.Proj.defsFailed" >defsFailed</a></div></div></div></td><td><div class=SFunction><div class=SDescription><div class=SIndent1>Report an error in loading the proj file. </div></div></div></td></tr><tr><td><div class=SFunction><div class=SEntry><div class=SIndent1><a href="#Proj4js.Proj.checkCodeLoaded" id=link35 onMouseOver="ShowTip(event, 'tt17', 'link35')" onMouseOut="HideTip('tt17')">checkCodeLoaded</a></div></div></div></td><td><div class=SFunction><div class=SDescription><div class=SIndent1>This is the loadCheck method to see if the projection code is loaded</div></div></div></td></tr><tr class=SMarked><td><div class=SFunction><div class=SEntry><div class=SIndent1><a href="#Proj4js.Proj.initTransforms" id=link36 onMouseOver="ShowTip(event, 'tt18', 'link36')" onMouseOut="HideTip('tt18')">initTransforms</a></div></div></div></td><td><div class=SFunction><div class=SDescription><div class=SIndent1>Finalize the initialization of the Proj object</div></div></div></td></tr><tr><td><div class=SFunction><div class=SEntry><div class=SIndent1><a href="#Proj4js.Proj.parseDefs" id=link37 onMouseOver="ShowTip(event, 'tt19', 'link37')" onMouseOut="HideTip('tt19')">parseDefs</a></div></div></div></td><td><div class=SFunction><div class=SDescription><div class=SIndent1>Parses the PROJ.4 initialization string and sets the associated properties.</div></div></div></td></tr><tr class=SMarked><td><div class=SFunction><div class=SEntry><div class=SIndent1><a href="#Proj4js.Proj.deriveConstants" id=link38 onMouseOver="ShowTip(event, 'tt20', 'link38')" onMouseOut="HideTip('tt20')">deriveConstants</a></div></div></div></td><td><div class=SFunction><div class=SDescription><div class=SIndent1>Sets several derived constant values and initialization of datum and ellipse parameters.</div></div></div></td></tr></table></div></div><!--END_ND_SUMMARY--></div></div></div>
+
+<div class=CGroup><div class=CTopic><h3 class=CTitle><a name="Proj4js.Proj.Properties"></a>Properties</h3></div></div>
+
+<div class=CProperty><div class=CTopic><h3 class=CTitle><a name="Proj4js.Proj.readyToUse"></a>readyToUse</h3><div class=CBody><p class=CParagraph>Flag to indicate if initialization is complete for this Proj object</p></div></div></div>
+
+<div class=CProperty><div class=CTopic><h3 class=CTitle><a name="Proj4js.Proj.title"></a>title</h3><div class=CBody><p class=CParagraph>The title to describe the projection</p></div></div></div>
+
+<div class=CProperty><div class=CTopic><h3 class=CTitle><a name="Proj4js.Proj.projName"></a>projName</h3><div class=CBody><p class=CParagraph>The projection class for this projection, e.g. lcc (lambert conformal conic, or merc for mercator. These are exactly equicvalent to their Proj4 counterparts.</p></div></div></div>
+
+<div class=CProperty><div class=CTopic><h3 class=CTitle><a name="Proj4js.Proj.units"></a>units</h3><div class=CBody><p class=CParagraph>The units of the projection. Values include ‘m’ and ‘degrees’</p></div></div></div>
+
+<div class=CProperty><div class=CTopic><h3 class=CTitle><a name="Proj4js.Proj.datum"></a>datum</h3><div class=CBody><p class=CParagraph>The datum specified for the projection</p></div></div></div>
+
+<div class=CGroup><div class=CTopic><h3 class=CTitle><a name="Proj4js.Proj.Functions"></a>Functions</h3></div></div>
+
+<div class=CFunction><div class=CTopic><h3 class=CTitle><a name="Proj4js.Proj.initialize"></a>initialize</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>initialize: function(</td><td class=PParameter nowrap>srsCode</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p class=CParagraph>Constructor for Proj4js.Proj objects</p><h4 class=CHeading>Parameters</h4><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList><tr><td class=CDLEntry>srsCode</td><td class=CDLDescription>a code for map projection definition parameters. These are usually (but not always) EPSG codes.</td></tr></table></div></div></div>
+
+<div class=CFunction><div class=CTopic><h3 class=CTitle><a name="Proj4js.Proj.loadProjDefinition"></a>loadProjDefinition</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>loadProjDefinition: function()</td></tr></table></blockquote><p class=CParagraph>Loads the coordinate system initialization string if required. Note that dynamic loading happens asynchronously so an application must wait for the readyToUse property is set to true. To prevent dynamic loading, include the defs through a script tag in your application.</p></div></div></div>
+
+<div class=CFunction><div class=CTopic><h3 class=CTitle><a name="Proj4js.Proj.loadFromService"></a>loadFromService</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>loadFromService: function()</td></tr></table></blockquote><p class=CParagraph>Creates the REST URL for loading the definition from a web service and loads it.</p></div></div></div>
+
+<div class=CFunction><div class=CTopic><h3 class=CTitle><a name="Proj4js.Proj.defsLoaded"></a>defsLoaded</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>defsLoaded: function()</td></tr></table></blockquote><p class=CParagraph>Continues the Proj object initilization once the def file is loaded</p></div></div></div>
+
+<div class=CFunction><div class=CTopic><h3 class=CTitle><a name="Proj4js.Proj.checkDefsLoaded"></a>checkDefsLoaded</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>checkDefsLoaded: function()</td></tr></table></blockquote><p class=CParagraph>This is the loadCheck method to see if the def object exists</p></div></div></div>
+
+<div class=CFunction><div class=CTopic><h3 class=CTitle><a name="Proj4js.Proj.defsFailed"></a>defsFailed</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>defsFailed: function()</td></tr></table></blockquote><p class=CParagraph>Report an error in loading the defs file, but continue on using WGS84</p></div></div></div>
+
+<div class=CFunction><div class=CTopic><h3 class=CTitle><a name="Proj4js.Proj.loadProjCode"></a>loadProjCode</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>loadProjCode: function(</td><td class=PParameter nowrap>projName</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p class=CParagraph>Loads projection class code dynamically if required. Projection code may be included either through a script tag or in a built version of proj4js</p></div></div></div>
+
+<div class=CFunction><div class=CTopic><h3 class=CTitle><a name="Proj4js.Proj.loadProjCodeSuccess"></a>loadProjCodeSuccess</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>loadProjCodeSuccess: function(</td><td class=PParameter nowrap>projName</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p class=CParagraph>Loads any proj dependencies or continue on to final initialization.</p></div></div></div>
+
+<div class=CFunction><div class=CTopic><h3 class=CTitle><a name="Proj4js.Proj.defsFailed"></a>defsFailed</h3><div class=CBody><p class=CParagraph>Report an error in loading the proj file. Initialization of the Proj object has failed and the readyToUse flag will never be set.</p></div></div></div>
+
+<div class=CFunction><div class=CTopic><h3 class=CTitle><a name="Proj4js.Proj.checkCodeLoaded"></a>checkCodeLoaded</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>checkCodeLoaded: function(</td><td class=PParameter nowrap>projName</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p class=CParagraph>This is the loadCheck method to see if the projection code is loaded</p></div></div></div>
+
+<div class=CFunction><div class=CTopic><h3 class=CTitle><a name="Proj4js.Proj.initTransforms"></a>initTransforms</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>initTransforms: function()</td></tr></table></blockquote><p class=CParagraph>Finalize the initialization of the Proj object</p></div></div></div>
+
+<div class=CFunction><div class=CTopic><h3 class=CTitle><a name="Proj4js.Proj.parseDefs"></a>parseDefs</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>parseDefs: function()</td></tr></table></blockquote><p class=CParagraph>Parses the PROJ.4 initialization string and sets the associated properties.</p></div></div></div>
+
+<div class=CFunction><div class=CTopic><h3 class=CTitle><a name="Proj4js.Proj.deriveConstants"></a>deriveConstants</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>deriveConstants: function()</td></tr></table></blockquote><p class=CParagraph>Sets several derived constant values and initialization of datum and ellipse parameters.</p></div></div></div>
+
+</td>
+
+</tr></table><div class=Footer><!--START_ND_FOOTER-->Generated by <a href="http://www.naturaldocs.org">Natural Docs</a><!--END_ND_FOOTER--></div>
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>transform: function(</td><td class=PParameter nowrap>source,</td></tr><tr><td></td><td class=PParameter nowrap>dest,</td></tr><tr><td></td><td class=PParameter nowrap>point</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote>Transform a point coordinate from one map projection to another. </div></div><div class=CToolTip id="tt2"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>reportError: function(</td><td class=PParameter nowrap>msg</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote>An internal method to report errors back to user. </div></div><div class=CToolTip id="tt3"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>extend: function(</td><td class=PParameter nowrap>destination,</td></tr><tr><td></td><td class=PParameter nowrap>source</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote>Copy all properties of a source object to a destination object. </div></div><div class=CToolTip id="tt4"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>Class: function()</td></tr></table></blockquote>Base class used to construct all other classes. </div></div><div class=CToolTip id="tt5"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>bind: function(</td><td class=PParameter nowrap>func,</td></tr><tr><td></td><td class=PParameter nowrap>object</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote>Bind a function to an object. </div></div><div class=CToolTip id="tt6"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>getScriptLocation: function ()</td></tr></table></blockquote>Return the path to this script.</div></div><div class=CToolTip id="tt7"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>loadScript: function(</td><td class=PParameter nowrap>url,</td></tr><tr><td></td><td class=PParameter nowrap>onload,</td></tr><tr><td></td><td class=PParameter nowrap>onfail,</td></tr><tr><td></td><td class=PParameter nowrap>loadCheck</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote>Load a JS file from a URL into a script tag in the page.</div></div><div class=CToolTip id="tt8"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>checkReadyState: function()</td></tr></table></blockquote>IE workaround since there is no onerror handler. </div></div><div class=CToolTip id="tt9"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>initialize: function(</td><td class=PParameter nowrap>srsCode</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote>Constructor for Proj4js.Proj objects</div></div><div class=CToolTip id="tt10"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>loadProjDefinition: function()</td></tr></table></blockquote>Loads the coordinate system initialization string if required. </div></div><div class=CToolTip id="tt11"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>loadFromService: function()</td></tr></table></blockquote>Creates the REST URL for loading the definition from a web service and loads it.</div></div><div class=CToolTip id="tt12"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>defsLoaded: function()</td></tr></table></blockquote>Continues the Proj object initilization once the def file is loaded</div></div><div class=CToolTip id="tt13"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>checkDefsLoaded: function()</td></tr></table></blockquote>This is the loadCheck method to see if the def object exists</div></div><div class=CToolTip id="tt14"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>defsFailed: function()</td></tr></table></blockquote>Report an error in loading the defs file, but continue on using WGS84</div></div><div class=CToolTip id="tt15"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>loadProjCode: function(</td><td class=PParameter nowrap>projName</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote>Loads projection class code dynamically if required. </div></div><div class=CToolTip id="tt16"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>loadProjCodeSuccess: function(</td><td class=PParameter nowrap>projName</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote>Loads any proj dependencies or continue on to final initialization.</div></div><div class=CToolTip id="tt17"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>checkCodeLoaded: function(</td><td class=PParameter nowrap>projName</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote>This is the loadCheck method to see if the projection code is loaded</div></div><div class=CToolTip id="tt18"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>initTransforms: function()</td></tr></table></blockquote>Finalize the initialization of the Proj object</div></div><div class=CToolTip id="tt19"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>parseDefs: function()</td></tr></table></blockquote>Parses the PROJ.4 initialization string and sets the associated properties.</div></div><div class=CToolTip id="tt20"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>deriveConstants: function()</td></tr></table></blockquote>Sets several derived constant values and initialization of datum and ellipse parameters.</div></div><!--END_ND_TOOLTIPS-->
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
Added: trunk/mapbender/http/extensions/proj4js/docs/NaturalDocs/files/proj4js-js.html
===================================================================
--- trunk/mapbender/http/extensions/proj4js/docs/NaturalDocs/files/proj4js-js.html (rev 0)
+++ trunk/mapbender/http/extensions/proj4js/docs/NaturalDocs/files/proj4js-js.html 2009-08-31 13:30:38 UTC (rev 4581)
@@ -0,0 +1,94 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>Proj4js</title><link rel="stylesheet" type="text/css" href="../styles/main.css"><script language=JavaScript src="../javascript/main.js"></script></head><body class=UnframedPage onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!-- Generated by Natural Docs, version 1.35 -->
+<!-- http://www.naturaldocs.org -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+<table border=0 cellspacing=0 cellpadding=0 width=100%><tr><td class=MenuSection valign=top><!--START_ND_MENU--><div class=MEntry><div class=MFile id=MSelected>Proj4js</div></div><div class=MEntry><div class=MFile><a href="proj4js-combined-js.html">Proj4js</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">Index</a><div class=MGroupContent id=MGroupContent1><div class=MEntry><div class=MIndex><a href="../index/General.html">Everything</a></div></div><div class=MEntry><div class=MIndex><a href="../index/Classes.html">Classes</a></div></div><div class=MEntry><div class=MIndex><a href="../index/Functions.html">Functions</a></div></div><div class=MEntry><div class=MIndex><a href="../index/Properties.html">Properties</a></div></div></div></div></div><!--END_ND_MENU--></td>
+
+<td class=ContentSection valign=top><div class=CClass id=MainTopic><div class=CTopic><h1 class=CTitle><a name="Proj4js"></a>Proj4js</h1><div class=CBody><p class=CParagraph>Proj4js is a JavaScript library to transform point coordinates from one coordinate system to another, including datum transformations.</p><p class=CParagraph>This library is a port of both the Proj.4 and GCTCP C libraries to JavaScript. Enabling these transformations in the browser allows geographic data stored in different projections to be combined in browser-based web mapping applications.</p><p class=CParagraph>Proj4js must have access to coordinate system initialization strings (which are the same as for PROJ.4 command line). Thes can be included in your application using a <script> tag or Proj4js can load CS initialization strings from a local directory or a web service such as spatialreference.org.</p><p class=CParagraph>Similarly, Proj4js must have access to projection transform code. These can be included individually using a <script> tag in your page, built into a custom build of Proj4js or loaded dynamically at run-time. Using the -combined and -compressed versions of Proj4js includes all projection class code by default.</p><p class=CParagraph>Note that dynamic loading of defs and code happens ascynchrously, check the Proj.readyToUse flag before using the Proj object. If the defs and code required by your application are loaded through script tags, dynamic loading is not required and the Proj object will be readyToUse on return from the constructor.</p><p class=CParagraph>All coordinates are handled as points which have a .x and a .y property which will be modified in place.</p><p class=CParagraph>Override Proj4js.reportError for output of alerts and warnings.</p><p class=CParagraph>See <a href="http://trac.osgeo.org/proj4js/wiki/UserGuide" class=LURL>http://trac.osgeo.org/proj4js/wiki/UserGuide</a> for full details.</p><!--START_ND_SUMMARY--><div class=Summary><div class=STitle>Summary</div><div class=SBorder><table border=0 cellspacing=0 cellpadding=0 class=STable><tr><td class=SEntrySize><div class=SMain><div class=SEntry><a href="#Proj4js" >Proj4js</a></div></div></td><td class=SDescriptionSize><div class=SMain><div class=SDescription>Proj4js is a JavaScript library to transform point coordinates from one coordinate system to another, including datum transformations.</div></div></td></tr><tr><td><div class=SGroup><div class=SEntry><div class=SIndent1><a href="#Proj4js.Properties" >Properties</a></div></div></div></td><td><div class=SGroup><div class=SDescription><div class=SIndent1></div></div></div></td></tr><tr class=SMarked><td><div class=SProperty><div class=SEntry><div class=SIndent2><a href="#Proj4js.defaultDatum" >defaultDatum</a></div></div></div></td><td><div class=SProperty><div class=SDescription><div class=SIndent2>The datum to use when no others a specified</div></div></div></td></tr><tr><td><div class=SGroup><div class=SEntry><div class=SIndent1><a href="#Proj4js.Functions" >Functions</a></div></div></div></td><td><div class=SGroup><div class=SDescription><div class=SIndent1></div></div></div></td></tr><tr class=SMarked><td><div class=SFunction><div class=SEntry><div class=SIndent2><a href="#Proj4js.transform(source,dest,point)" id=link1 onMouseOver="ShowTip(event, 'tt1', 'link1')" onMouseOut="HideTip('tt1')">transform(source, dest, point)</a></div></div></div></td><td><div class=SFunction><div class=SDescription><div class=SIndent2>Transform a point coordinate from one map projection to another. </div></div></div></td></tr><tr><td><div class=SFunction><div class=SEntry><div class=SIndent2><a href="#Proj4js.reportError" id=link2 onMouseOver="ShowTip(event, 'tt2', 'link2')" onMouseOut="HideTip('tt2')">reportError</a></div></div></div></td><td><div class=SFunction><div class=SDescription><div class=SIndent2>An internal method to report errors back to user. </div></div></div></td></tr><tr><td><div class=SSection><div class=SEntry><a href="#Private_Methods" >Private Methods</a></div></div></td><td><div class=SSection><div class=SDescription>The following properties and methods are intended for internal use only.</div></div></td></tr><tr><td><div class=SGroup><div class=SEntry><div class=SIndent1><a href="#Functions_and_Properties" >Functions and Properties</a></div></div></div></td><td><div class=SGroup><div class=SDescription><div class=SIndent1></div></div></div></td></tr><tr class=SMarked><td><div class=SFunction><div class=SEntry><div class=SIndent2><a href="#extend" id=link3 onMouseOver="ShowTip(event, 'tt3', 'link3')" onMouseOut="HideTip('tt3')">extend</a></div></div></div></td><td><div class=SFunction><div class=SDescription><div class=SIndent2>Copy all properties of a source object to a destination object. </div></div></div></td></tr><tr><td><div class=SFunction><div class=SEntry><div class=SIndent2><a href="#Class" id=link4 onMouseOver="ShowTip(event, 'tt4', 'link4')" onMouseOut="HideTip('tt4')">Class</a></div></div></div></td><td><div class=SFunction><div class=SDescription><div class=SIndent2>Base class used to construct all other classes. </div></div></div></td></tr><tr class=SMarked><td><div class=SFunction><div class=SEntry><div class=SIndent2><a href="#bind" id=link5 onMouseOver="ShowTip(event, 'tt5', 'link5')" onMouseOut="HideTip('tt5')">bind</a></div></div></div></td><td><div class=SFunction><div class=SDescription><div class=SIndent2>Bind a function to an object. </div></div></div></td></tr><tr><td><div class=SProperty><div class=SEntry><div class=SIndent2><a href="#defsLookupService" >defsLookupService</a></div></div></div></td><td><div class=SProperty><div class=SDescription><div class=SIndent2>AJAX service to retreive projection definition parameters from</div></div></div></td></tr><tr class=SMarked><td><div class=SProperty><div class=SEntry><div class=SIndent2><a href="#libPath" >libPath</a></div></div></div></td><td><div class=SProperty><div class=SDescription><div class=SIndent2>internal: http server path to library code.</div></div></div></td></tr><tr><td><div class=SFunction><div class=SEntry><div class=SIndent2><a href="#getScriptLocation" id=link6 onMouseOver="ShowTip(event, 'tt6', 'link6')" onMouseOut="HideTip('tt6')">getScriptLocation</a></div></div></div></td><td><div class=SFunction><div class=SDescription><div class=SIndent2>Return the path to this script.</div></div></div></td></tr><tr class=SMarked><td><div class=SFunction><div class=SEntry><div class=SIndent2><a href="#loadScript" id=link7 onMouseOver="ShowTip(event, 'tt7', 'link7')" onMouseOut="HideTip('tt7')">loadScript</a></div></div></div></td><td><div class=SFunction><div class=SDescription><div class=SIndent2>Load a JS file from a URL into a <script> tag in the page.</div></div></div></td></tr><tr><td><div class=SFunction><div class=SEntry><div class=SIndent2><a href="#checkReadyState" id=link8 onMouseOver="ShowTip(event, 'tt8', 'link8')" onMouseOut="HideTip('tt8')">checkReadyState</a></div></div></div></td><td><div class=SFunction><div class=SDescription><div class=SIndent2>IE workaround since there is no onerror handler. </div></div></div></td></tr><tr><td><div class=SClass><div class=SEntry><a href="#Proj4js.Proj" >Proj4js.Proj</a></div></div></td><td><div class=SClass><div class=SDescription>Proj objects provide transformation methods for point coordinates between geodetic latitude/longitude and a projected coordinate system. </div></div></td></tr><tr><td><div class=SGroup><div class=SEntry><div class=SIndent1><a href="#Proj4js.Proj.Properties" >Properties</a></div></div></div></td><td><div class=SGroup><div class=SDescription><div class=SIndent1></div></div></div></td></tr><tr class=SMarked><td><div class=SProperty><div class=SEntry><div class=SIndent2><a href="#Proj4js.Proj.readyToUse" >readyToUse</a></div></div></div></td><td><div class=SProperty><div class=SDescription><div class=SIndent2>Flag to indicate if initialization is complete for this Proj object</div></div></div></td></tr><tr><td><div class=SProperty><div class=SEntry><div class=SIndent2><a href="#Proj4js.Proj.title" >title</a></div></div></div></td><td><div class=SProperty><div class=SDescription><div class=SIndent2>The title to describe the projection</div></div></div></td></tr><tr class=SMarked><td><div class=SProperty><div class=SEntry><div class=SIndent2><a href="#Proj4js.Proj.projName" >projName</a></div></div></div></td><td><div class=SProperty><div class=SDescription><div class=SIndent2>The projection class for this projection, e.g. </div></div></div></td></tr><tr><td><div class=SProperty><div class=SEntry><div class=SIndent2><a href="#Proj4js.Proj.units" >units</a></div></div></div></td><td><div class=SProperty><div class=SDescription><div class=SIndent2>The units of the projection. </div></div></div></td></tr><tr class=SMarked><td><div class=SProperty><div class=SEntry><div class=SIndent2><a href="#Proj4js.Proj.datum" >datum</a></div></div></div></td><td><div class=SProperty><div class=SDescription><div class=SIndent2>The datum specified for the projection</div></div></div></td></tr><tr><td><div class=SGroup><div class=SEntry><div class=SIndent1><a href="#Proj4js.Proj.Functions" >Functions</a></div></div></div></td><td><div class=SGroup><div class=SDescription><div class=SIndent1></div></div></div></td></tr><tr class=SMarked><td><div class=SFunction><div class=SEntry><div class=SIndent2><a href="#Proj4js.Proj.initialize" id=link9 onMouseOver="ShowTip(event, 'tt9', 'link9')" onMouseOut="HideTip('tt9')">initialize</a></div></div></div></td><td><div class=SFunction><div class=SDescription><div class=SIndent2>Constructor for Proj4js.Proj objects</div></div></div></td></tr><tr><td><div class=SFunction><div class=SEntry><div class=SIndent2><a href="#Proj4js.Proj.loadProjDefinition" id=link10 onMouseOver="ShowTip(event, 'tt10', 'link10')" onMouseOut="HideTip('tt10')">loadProjDefinition</a></div></div></div></td><td><div class=SFunction><div class=SDescription><div class=SIndent2>Loads the coordinate system initialization string if required. </div></div></div></td></tr><tr class=SMarked><td><div class=SFunction><div class=SEntry><div class=SIndent2><a href="#Proj4js.Proj.loadFromService" id=link11 onMouseOver="ShowTip(event, 'tt11', 'link11')" onMouseOut="HideTip('tt11')">loadFromService</a></div></div></div></td><td><div class=SFunction><div class=SDescription><div class=SIndent2>Creates the REST URL for loading the definition from a web service and loads it.</div></div></div></td></tr><tr><td><div class=SFunction><div class=SEntry><div class=SIndent2><a href="#Proj4js.Proj.defsLoaded" id=link12 onMouseOver="ShowTip(event, 'tt12', 'link12')" onMouseOut="HideTip('tt12')">defsLoaded</a></div></div></div></td><td><div class=SFunction><div class=SDescription><div class=SIndent2>Continues the Proj object initilization once the def file is loaded</div></div></div></td></tr><tr class=SMarked><td><div class=SFunction><div class=SEntry><div class=SIndent2><a href="#Proj4js.Proj.checkDefsLoaded" id=link13 onMouseOver="ShowTip(event, 'tt13', 'link13')" onMouseOut="HideTip('tt13')">checkDefsLoaded</a></div></div></div></td><td><div class=SFunction><div class=SDescription><div class=SIndent2>This is the loadCheck method to see if the def object exists</div></div></div></td></tr><tr><td><div class=SFunction><div class=SEntry><div class=SIndent2><a href="#Proj4js.Proj.defsFailed" id=link14 onMouseOver="ShowTip(event, 'tt14', 'link14')" onMouseOut="HideTip('tt14')">defsFailed</a></div></div></div></td><td><div class=SFunction><div class=SDescription><div class=SIndent2>Report an error in loading the defs file, but continue on using WGS84</div></div></div></td></tr><tr class=SMarked><td><div class=SFunction><div class=SEntry><div class=SIndent2><a href="#Proj4js.Proj.loadProjCode" id=link15 onMouseOver="ShowTip(event, 'tt15', 'link15')" onMouseOut="HideTip('tt15')">loadProjCode</a></div></div></div></td><td><div class=SFunction><div class=SDescription><div class=SIndent2>Loads projection class code dynamically if required. </div></div></div></td></tr><tr><td><div class=SFunction><div class=SEntry><div class=SIndent2><a href="#Proj4js.Proj.loadProjCodeSuccess" id=link16 onMouseOver="ShowTip(event, 'tt16', 'link16')" onMouseOut="HideTip('tt16')">loadProjCodeSuccess</a></div></div></div></td><td><div class=SFunction><div class=SDescription><div class=SIndent2>Loads any proj dependencies or continue on to final initialization.</div></div></div></td></tr><tr class=SMarked><td><div class=SFunction><div class=SEntry><div class=SIndent2><a href="#Proj4js.Proj.defsFailed" >defsFailed</a></div></div></div></td><td><div class=SFunction><div class=SDescription><div class=SIndent2>Report an error in loading the proj file. </div></div></div></td></tr><tr><td><div class=SFunction><div class=SEntry><div class=SIndent2><a href="#Proj4js.Proj.checkCodeLoaded" id=link17 onMouseOver="ShowTip(event, 'tt17', 'link17')" onMouseOut="HideTip('tt17')">checkCodeLoaded</a></div></div></div></td><td><div class=SFunction><div class=SDescription><div class=SIndent2>This is the loadCheck method to see if the projection code is loaded</div></div></div></td></tr><tr class=SMarked><td><div class=SFunction><div class=SEntry><div class=SIndent2><a href="#Proj4js.Proj.initTransforms" id=link18 onMouseOver="ShowTip(event, 'tt18', 'link18')" onMouseOut="HideTip('tt18')">initTransforms</a></div></div></div></td><td><div class=SFunction><div class=SDescription><div class=SIndent2>Finalize the initialization of the Proj object</div></div></div></td></tr><tr><td><div class=SFunction><div class=SEntry><div class=SIndent2><a href="#Proj4js.Proj.parseDefs" id=link19 onMouseOver="ShowTip(event, 'tt19', 'link19')" onMouseOut="HideTip('tt19')">parseDefs</a></div></div></div></td><td><div class=SFunction><div class=SDescription><div class=SIndent2>Parses the PROJ.4 initialization string and sets the associated properties.</div></div></div></td></tr><tr class=SMarked><td><div class=SFunction><div class=SEntry><div class=SIndent2><a href="#Proj4js.Proj.deriveConstants" id=link20 onMouseOver="ShowTip(event, 'tt20', 'link20')" onMouseOut="HideTip('tt20')">deriveConstants</a></div></div></div></td><td><div class=SFunction><div class=SDescription><div class=SIndent2>Sets several derived constant values and initialization of datum and ellipse parameters.</div></div></div></td></tr></table></div></div><!--END_ND_SUMMARY--></div></div></div>
+
+<div class=CGroup><div class=CTopic><h3 class=CTitle><a name="Proj4js.Properties"></a>Properties</h3></div></div>
+
+<div class=CProperty><div class=CTopic><h3 class=CTitle><a name="Proj4js.defaultDatum"></a>defaultDatum</h3><div class=CBody><p class=CParagraph>The datum to use when no others a specified</p></div></div></div>
+
+<div class=CGroup><div class=CTopic><h3 class=CTitle><a name="Proj4js.Functions"></a>Functions</h3></div></div>
+
+<div class=CFunction><div class=CTopic><h3 class=CTitle><a name="Proj4js.transform(source,dest,point)"></a>transform(source, dest, point)</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>transform: function(</td><td class=PParameter nowrap>source,</td></tr><tr><td></td><td class=PParameter nowrap>dest,</td></tr><tr><td></td><td class=PParameter nowrap>point</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p class=CParagraph>Transform a point coordinate from one map projection to another. This is really the only public method you should need to use.</p><h4 class=CHeading>Parameters</h4><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList><tr><td class=CDLEntry>source</td><td class=CDLDescription>{Proj4js.Proj} source map projection for the transformation</td></tr><tr><td class=CDLEntry>dest</td><td class=CDLDescription>{Proj4js.Proj} destination map projection for the transformation</td></tr><tr><td class=CDLEntry>point</td><td class=CDLDescription>{Object} point to transform, may be geodetic (long, lat) or projected Cartesian (x,y), but should always have x,y properties.</td></tr></table></div></div></div>
+
+<div class=CFunction><div class=CTopic><h3 class=CTitle><a name="Proj4js.reportError"></a>reportError</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>reportError: function(</td><td class=PParameter nowrap>msg</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p class=CParagraph>An internal method to report errors back to user. Override this in applications to report error messages or throw exceptions.</p></div></div></div>
+
+<div class=CSection><div class=CTopic><h2 class=CTitle><a name="Private_Methods"></a>Private Methods</h2><div class=CBody><p class=CParagraph>The following properties and methods are intended for internal use only.</p><p class=CParagraph>This is a minimal implementation of JavaScript inheritance methods so that Proj4js can be used as a stand-alone library. These are copies of the equivalent OpenLayers methods at v2.7</p><!--START_ND_SUMMARY--><div class=Summary><div class=STitle>Summary</div><div class=SBorder><table border=0 cellspacing=0 cellpadding=0 class=STable><tr><td class=SEntrySize><div class=SGroup><div class=SEntry><a href="#Functions_and_Properties" >Functions and Properties</a></div></div></td><td class=SDescriptionSize><div class=SGroup><div class=SDescription></div></div></td></tr><tr class=SMarked><td><div class=SFunction><div class=SEntry><div class=SIndent1><a href="#extend" id=link21 onMouseOver="ShowTip(event, 'tt3', 'link21')" onMouseOut="HideTip('tt3')">extend</a></div></div></div></td><td><div class=SFunction><div class=SDescription><div class=SIndent1>Copy all properties of a source object to a destination object. </div></div></div></td></tr><tr><td><div class=SFunction><div class=SEntry><div class=SIndent1><a href="#Class" id=link22 onMouseOver="ShowTip(event, 'tt4', 'link22')" onMouseOut="HideTip('tt4')">Class</a></div></div></div></td><td><div class=SFunction><div class=SDescription><div class=SIndent1>Base class used to construct all other classes. </div></div></div></td></tr><tr class=SMarked><td><div class=SFunction><div class=SEntry><div class=SIndent1><a href="#bind" id=link23 onMouseOver="ShowTip(event, 'tt5', 'link23')" onMouseOut="HideTip('tt5')">bind</a></div></div></div></td><td><div class=SFunction><div class=SDescription><div class=SIndent1>Bind a function to an object. </div></div></div></td></tr><tr><td><div class=SProperty><div class=SEntry><div class=SIndent1><a href="#defsLookupService" >defsLookupService</a></div></div></div></td><td><div class=SProperty><div class=SDescription><div class=SIndent1>AJAX service to retreive projection definition parameters from</div></div></div></td></tr><tr class=SMarked><td><div class=SProperty><div class=SEntry><div class=SIndent1><a href="#libPath" >libPath</a></div></div></div></td><td><div class=SProperty><div class=SDescription><div class=SIndent1>internal: http server path to library code.</div></div></div></td></tr><tr><td><div class=SFunction><div class=SEntry><div class=SIndent1><a href="#getScriptLocation" id=link24 onMouseOver="ShowTip(event, 'tt6', 'link24')" onMouseOut="HideTip('tt6')">getScriptLocation</a></div></div></div></td><td><div class=SFunction><div class=SDescription><div class=SIndent1>Return the path to this script.</div></div></div></td></tr><tr class=SMarked><td><div class=SFunction><div class=SEntry><div class=SIndent1><a href="#loadScript" id=link25 onMouseOver="ShowTip(event, 'tt7', 'link25')" onMouseOut="HideTip('tt7')">loadScript</a></div></div></div></td><td><div class=SFunction><div class=SDescription><div class=SIndent1>Load a JS file from a URL into a <script> tag in the page.</div></div></div></td></tr><tr><td><div class=SFunction><div class=SEntry><div class=SIndent1><a href="#checkReadyState" id=link26 onMouseOver="ShowTip(event, 'tt8', 'link26')" onMouseOut="HideTip('tt8')">checkReadyState</a></div></div></div></td><td><div class=SFunction><div class=SDescription><div class=SIndent1>IE workaround since there is no onerror handler. </div></div></div></td></tr></table></div></div><!--END_ND_SUMMARY--></div></div></div>
+
+<div class=CGroup><div class=CTopic><h3 class=CTitle><a name="Functions_and_Properties"></a>Functions and Properties</h3></div></div>
+
+<div class=CFunction><div class=CTopic><h3 class=CTitle><a name="extend"></a>extend</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>extend: function(</td><td class=PParameter nowrap>destination,</td></tr><tr><td></td><td class=PParameter nowrap>source</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p class=CParagraph>Copy all properties of a source object to a destination object. Modifies the passed in destination object. Any properties on the source object that are set to undefined will not be (re)set on the destination object.</p><h4 class=CHeading>Parameters</h4><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList><tr><td class=CDLEntry>destination</td><td class=CDLDescription>{Object} The object that will be modified</td></tr><tr><td class=CDLEntry>source</td><td class=CDLDescription>{Object} The object with properties to be set on the destination</td></tr></table><h4 class=CHeading>Returns</h4><p class=CParagraph>{Object} The destination object.</p></div></div></div>
+
+<div class=CFunction><div class=CTopic><h3 class=CTitle><a name="Class"></a>Class</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>Class: function()</td></tr></table></blockquote><p class=CParagraph>Base class used to construct all other classes. Includes support for multiple inheritance.</p></div></div></div>
+
+<div class=CFunction><div class=CTopic><h3 class=CTitle><a name="bind"></a>bind</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>bind: function(</td><td class=PParameter nowrap>func,</td></tr><tr><td></td><td class=PParameter nowrap>object</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p class=CParagraph>Bind a function to an object. Method to easily create closures with ‘this’ altered.</p><h4 class=CHeading>Parameters</h4><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList><tr><td class=CDLEntry>func</td><td class=CDLDescription>{Function} Input function.</td></tr><tr><td class=CDLEntry>object</td><td class=CDLDescription>{Object} The object to bind to the input function (as this).</td></tr></table><h4 class=CHeading>Returns</h4><p class=CParagraph>{Function} A closure with ‘this’ set to the passed in object.</p></div></div></div>
+
+<div class=CProperty><div class=CTopic><h3 class=CTitle><a name="defsLookupService"></a>defsLookupService</h3><div class=CBody><p class=CParagraph>AJAX service to retreive projection definition parameters from</p></div></div></div>
+
+<div class=CProperty><div class=CTopic><h3 class=CTitle><a name="libPath"></a>libPath</h3><div class=CBody><p class=CParagraph>internal: http server path to library code.</p></div></div></div>
+
+<div class=CFunction><div class=CTopic><h3 class=CTitle><a name="getScriptLocation"></a>getScriptLocation</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>getScriptLocation: function ()</td></tr></table></blockquote><p class=CParagraph>Return the path to this script.</p><h4 class=CHeading>Returns</h4><p class=CParagraph>Path to this script</p></div></div></div>
+
+<div class=CFunction><div class=CTopic><h3 class=CTitle><a name="loadScript"></a>loadScript</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>loadScript: function(</td><td class=PParameter nowrap>url,</td></tr><tr><td></td><td class=PParameter nowrap>onload,</td></tr><tr><td></td><td class=PParameter nowrap>onfail,</td></tr><tr><td></td><td class=PParameter nowrap>loadCheck</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p class=CParagraph>Load a JS file from a URL into a <script> tag in the page.</p><h4 class=CHeading>Parameters</h4><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList><tr><td class=CDLEntry>url</td><td class=CDLDescription>{String} The URL containing the script to load</td></tr><tr><td class=CDLEntry>onload</td><td class=CDLDescription>{Function} A method to be executed when the script loads successfully</td></tr><tr><td class=CDLEntry>onfail</td><td class=CDLDescription>{Function} A method to be executed when there is an error loading the script</td></tr><tr><td class=CDLEntry>loadCheck</td><td class=CDLDescription>{Function} A boolean method that checks to see if the script has loaded. Typically this just checks for the existance of an object in the file just loaded.</td></tr></table></div></div></div>
+
+<div class=CFunction><div class=CTopic><h3 class=CTitle><a name="checkReadyState"></a>checkReadyState</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>checkReadyState: function()</td></tr></table></blockquote><p class=CParagraph>IE workaround since there is no onerror handler. Calls the user defined loadCheck method to determine if the script is loaded.</p></div></div></div>
+
+<div class=CClass><div class=CTopic><h2 class=CTitle><a name="Proj4js.Proj"></a>Proj4js.Proj</h2><div class=CBody><p class=CParagraph>Proj objects provide transformation methods for point coordinates between geodetic latitude/longitude and a projected coordinate system. once they have been initialized with a projection code.</p><p class=CParagraph>Initialization of Proj objects is with a projection code, usually EPSG codes, which is the key that will be used with the Proj4js.defs array.</p><p class=CParagraph>The code passed in will be stripped of colons and converted to uppercase to locate projection definition files.</p><p class=CParagraph>A projection object has properties for units and title strings.</p><!--START_ND_SUMMARY--><div class=Summary><div class=STitle>Summary</div><div class=SBorder><table border=0 cellspacing=0 cellpadding=0 class=STable><tr><td class=SEntrySize><div class=SGroup><div class=SEntry><a href="#Proj4js.Proj.Properties" >Properties</a></div></div></td><td class=SDescriptionSize><div class=SGroup><div class=SDescription></div></div></td></tr><tr class=SMarked><td><div class=SProperty><div class=SEntry><div class=SIndent1><a href="#Proj4js.Proj.readyToUse" >readyToUse</a></div></div></div></td><td><div class=SProperty><div class=SDescription><div class=SIndent1>Flag to indicate if initialization is complete for this Proj object</div></div></div></td></tr><tr><td><div class=SProperty><div class=SEntry><div class=SIndent1><a href="#Proj4js.Proj.title" >title</a></div></div></div></td><td><div class=SProperty><div class=SDescription><div class=SIndent1>The title to describe the projection</div></div></div></td></tr><tr class=SMarked><td><div class=SProperty><div class=SEntry><div class=SIndent1><a href="#Proj4js.Proj.projName" >projName</a></div></div></div></td><td><div class=SProperty><div class=SDescription><div class=SIndent1>The projection class for this projection, e.g. </div></div></div></td></tr><tr><td><div class=SProperty><div class=SEntry><div class=SIndent1><a href="#Proj4js.Proj.units" >units</a></div></div></div></td><td><div class=SProperty><div class=SDescription><div class=SIndent1>The units of the projection. </div></div></div></td></tr><tr class=SMarked><td><div class=SProperty><div class=SEntry><div class=SIndent1><a href="#Proj4js.Proj.datum" >datum</a></div></div></div></td><td><div class=SProperty><div class=SDescription><div class=SIndent1>The datum specified for the projection</div></div></div></td></tr><tr><td><div class=SGroup><div class=SEntry><a href="#Proj4js.Proj.Functions" >Functions</a></div></div></td><td><div class=SGroup><div class=SDescription></div></div></td></tr><tr class=SMarked><td><div class=SFunction><div class=SEntry><div class=SIndent1><a href="#Proj4js.Proj.initialize" id=link27 onMouseOver="ShowTip(event, 'tt9', 'link27')" onMouseOut="HideTip('tt9')">initialize</a></div></div></div></td><td><div class=SFunction><div class=SDescription><div class=SIndent1>Constructor for Proj4js.Proj objects</div></div></div></td></tr><tr><td><div class=SFunction><div class=SEntry><div class=SIndent1><a href="#Proj4js.Proj.loadProjDefinition" id=link28 onMouseOver="ShowTip(event, 'tt10', 'link28')" onMouseOut="HideTip('tt10')">loadProjDefinition</a></div></div></div></td><td><div class=SFunction><div class=SDescription><div class=SIndent1>Loads the coordinate system initialization string if required. </div></div></div></td></tr><tr class=SMarked><td><div class=SFunction><div class=SEntry><div class=SIndent1><a href="#Proj4js.Proj.loadFromService" id=link29 onMouseOver="ShowTip(event, 'tt11', 'link29')" onMouseOut="HideTip('tt11')">loadFromService</a></div></div></div></td><td><div class=SFunction><div class=SDescription><div class=SIndent1>Creates the REST URL for loading the definition from a web service and loads it.</div></div></div></td></tr><tr><td><div class=SFunction><div class=SEntry><div class=SIndent1><a href="#Proj4js.Proj.defsLoaded" id=link30 onMouseOver="ShowTip(event, 'tt12', 'link30')" onMouseOut="HideTip('tt12')">defsLoaded</a></div></div></div></td><td><div class=SFunction><div class=SDescription><div class=SIndent1>Continues the Proj object initilization once the def file is loaded</div></div></div></td></tr><tr class=SMarked><td><div class=SFunction><div class=SEntry><div class=SIndent1><a href="#Proj4js.Proj.checkDefsLoaded" id=link31 onMouseOver="ShowTip(event, 'tt13', 'link31')" onMouseOut="HideTip('tt13')">checkDefsLoaded</a></div></div></div></td><td><div class=SFunction><div class=SDescription><div class=SIndent1>This is the loadCheck method to see if the def object exists</div></div></div></td></tr><tr><td><div class=SFunction><div class=SEntry><div class=SIndent1><a href="#Proj4js.Proj.defsFailed" id=link32 onMouseOver="ShowTip(event, 'tt14', 'link32')" onMouseOut="HideTip('tt14')">defsFailed</a></div></div></div></td><td><div class=SFunction><div class=SDescription><div class=SIndent1>Report an error in loading the defs file, but continue on using WGS84</div></div></div></td></tr><tr class=SMarked><td><div class=SFunction><div class=SEntry><div class=SIndent1><a href="#Proj4js.Proj.loadProjCode" id=link33 onMouseOver="ShowTip(event, 'tt15', 'link33')" onMouseOut="HideTip('tt15')">loadProjCode</a></div></div></div></td><td><div class=SFunction><div class=SDescription><div class=SIndent1>Loads projection class code dynamically if required. </div></div></div></td></tr><tr><td><div class=SFunction><div class=SEntry><div class=SIndent1><a href="#Proj4js.Proj.loadProjCodeSuccess" id=link34 onMouseOver="ShowTip(event, 'tt16', 'link34')" onMouseOut="HideTip('tt16')">loadProjCodeSuccess</a></div></div></div></td><td><div class=SFunction><div class=SDescription><div class=SIndent1>Loads any proj dependencies or continue on to final initialization.</div></div></div></td></tr><tr class=SMarked><td><div class=SFunction><div class=SEntry><div class=SIndent1><a href="#Proj4js.Proj.defsFailed" >defsFailed</a></div></div></div></td><td><div class=SFunction><div class=SDescription><div class=SIndent1>Report an error in loading the proj file. </div></div></div></td></tr><tr><td><div class=SFunction><div class=SEntry><div class=SIndent1><a href="#Proj4js.Proj.checkCodeLoaded" id=link35 onMouseOver="ShowTip(event, 'tt17', 'link35')" onMouseOut="HideTip('tt17')">checkCodeLoaded</a></div></div></div></td><td><div class=SFunction><div class=SDescription><div class=SIndent1>This is the loadCheck method to see if the projection code is loaded</div></div></div></td></tr><tr class=SMarked><td><div class=SFunction><div class=SEntry><div class=SIndent1><a href="#Proj4js.Proj.initTransforms" id=link36 onMouseOver="ShowTip(event, 'tt18', 'link36')" onMouseOut="HideTip('tt18')">initTransforms</a></div></div></div></td><td><div class=SFunction><div class=SDescription><div class=SIndent1>Finalize the initialization of the Proj object</div></div></div></td></tr><tr><td><div class=SFunction><div class=SEntry><div class=SIndent1><a href="#Proj4js.Proj.parseDefs" id=link37 onMouseOver="ShowTip(event, 'tt19', 'link37')" onMouseOut="HideTip('tt19')">parseDefs</a></div></div></div></td><td><div class=SFunction><div class=SDescription><div class=SIndent1>Parses the PROJ.4 initialization string and sets the associated properties.</div></div></div></td></tr><tr class=SMarked><td><div class=SFunction><div class=SEntry><div class=SIndent1><a href="#Proj4js.Proj.deriveConstants" id=link38 onMouseOver="ShowTip(event, 'tt20', 'link38')" onMouseOut="HideTip('tt20')">deriveConstants</a></div></div></div></td><td><div class=SFunction><div class=SDescription><div class=SIndent1>Sets several derived constant values and initialization of datum and ellipse parameters.</div></div></div></td></tr></table></div></div><!--END_ND_SUMMARY--></div></div></div>
+
+<div class=CGroup><div class=CTopic><h3 class=CTitle><a name="Proj4js.Proj.Properties"></a>Properties</h3></div></div>
+
+<div class=CProperty><div class=CTopic><h3 class=CTitle><a name="Proj4js.Proj.readyToUse"></a>readyToUse</h3><div class=CBody><p class=CParagraph>Flag to indicate if initialization is complete for this Proj object</p></div></div></div>
+
+<div class=CProperty><div class=CTopic><h3 class=CTitle><a name="Proj4js.Proj.title"></a>title</h3><div class=CBody><p class=CParagraph>The title to describe the projection</p></div></div></div>
+
+<div class=CProperty><div class=CTopic><h3 class=CTitle><a name="Proj4js.Proj.projName"></a>projName</h3><div class=CBody><p class=CParagraph>The projection class for this projection, e.g. lcc (lambert conformal conic, or merc for mercator. These are exactly equicvalent to their Proj4 counterparts.</p></div></div></div>
+
+<div class=CProperty><div class=CTopic><h3 class=CTitle><a name="Proj4js.Proj.units"></a>units</h3><div class=CBody><p class=CParagraph>The units of the projection. Values include ‘m’ and ‘degrees’</p></div></div></div>
+
+<div class=CProperty><div class=CTopic><h3 class=CTitle><a name="Proj4js.Proj.datum"></a>datum</h3><div class=CBody><p class=CParagraph>The datum specified for the projection</p></div></div></div>
+
+<div class=CGroup><div class=CTopic><h3 class=CTitle><a name="Proj4js.Proj.Functions"></a>Functions</h3></div></div>
+
+<div class=CFunction><div class=CTopic><h3 class=CTitle><a name="Proj4js.Proj.initialize"></a>initialize</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>initialize: function(</td><td class=PParameter nowrap>srsCode</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p class=CParagraph>Constructor for Proj4js.Proj objects</p><h4 class=CHeading>Parameters</h4><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList><tr><td class=CDLEntry>srsCode</td><td class=CDLDescription>a code for map projection definition parameters. These are usually (but not always) EPSG codes.</td></tr></table></div></div></div>
+
+<div class=CFunction><div class=CTopic><h3 class=CTitle><a name="Proj4js.Proj.loadProjDefinition"></a>loadProjDefinition</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>loadProjDefinition: function()</td></tr></table></blockquote><p class=CParagraph>Loads the coordinate system initialization string if required. Note that dynamic loading happens asynchronously so an application must wait for the readyToUse property is set to true. To prevent dynamic loading, include the defs through a script tag in your application.</p></div></div></div>
+
+<div class=CFunction><div class=CTopic><h3 class=CTitle><a name="Proj4js.Proj.loadFromService"></a>loadFromService</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>loadFromService: function()</td></tr></table></blockquote><p class=CParagraph>Creates the REST URL for loading the definition from a web service and loads it.</p></div></div></div>
+
+<div class=CFunction><div class=CTopic><h3 class=CTitle><a name="Proj4js.Proj.defsLoaded"></a>defsLoaded</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>defsLoaded: function()</td></tr></table></blockquote><p class=CParagraph>Continues the Proj object initilization once the def file is loaded</p></div></div></div>
+
+<div class=CFunction><div class=CTopic><h3 class=CTitle><a name="Proj4js.Proj.checkDefsLoaded"></a>checkDefsLoaded</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>checkDefsLoaded: function()</td></tr></table></blockquote><p class=CParagraph>This is the loadCheck method to see if the def object exists</p></div></div></div>
+
+<div class=CFunction><div class=CTopic><h3 class=CTitle><a name="Proj4js.Proj.defsFailed"></a>defsFailed</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>defsFailed: function()</td></tr></table></blockquote><p class=CParagraph>Report an error in loading the defs file, but continue on using WGS84</p></div></div></div>
+
+<div class=CFunction><div class=CTopic><h3 class=CTitle><a name="Proj4js.Proj.loadProjCode"></a>loadProjCode</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>loadProjCode: function(</td><td class=PParameter nowrap>projName</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p class=CParagraph>Loads projection class code dynamically if required. Projection code may be included either through a script tag or in a built version of proj4js</p></div></div></div>
+
+<div class=CFunction><div class=CTopic><h3 class=CTitle><a name="Proj4js.Proj.loadProjCodeSuccess"></a>loadProjCodeSuccess</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>loadProjCodeSuccess: function(</td><td class=PParameter nowrap>projName</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p class=CParagraph>Loads any proj dependencies or continue on to final initialization.</p></div></div></div>
+
+<div class=CFunction><div class=CTopic><h3 class=CTitle><a name="Proj4js.Proj.defsFailed"></a>defsFailed</h3><div class=CBody><p class=CParagraph>Report an error in loading the proj file. Initialization of the Proj object has failed and the readyToUse flag will never be set.</p></div></div></div>
+
+<div class=CFunction><div class=CTopic><h3 class=CTitle><a name="Proj4js.Proj.checkCodeLoaded"></a>checkCodeLoaded</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>checkCodeLoaded: function(</td><td class=PParameter nowrap>projName</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p class=CParagraph>This is the loadCheck method to see if the projection code is loaded</p></div></div></div>
+
+<div class=CFunction><div class=CTopic><h3 class=CTitle><a name="Proj4js.Proj.initTransforms"></a>initTransforms</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>initTransforms: function()</td></tr></table></blockquote><p class=CParagraph>Finalize the initialization of the Proj object</p></div></div></div>
+
+<div class=CFunction><div class=CTopic><h3 class=CTitle><a name="Proj4js.Proj.parseDefs"></a>parseDefs</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>parseDefs: function()</td></tr></table></blockquote><p class=CParagraph>Parses the PROJ.4 initialization string and sets the associated properties.</p></div></div></div>
+
+<div class=CFunction><div class=CTopic><h3 class=CTitle><a name="Proj4js.Proj.deriveConstants"></a>deriveConstants</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>deriveConstants: function()</td></tr></table></blockquote><p class=CParagraph>Sets several derived constant values and initialization of datum and ellipse parameters.</p></div></div></div>
+
+</td>
+
+</tr></table><div class=Footer><!--START_ND_FOOTER-->Generated by <a href="http://www.naturaldocs.org">Natural Docs</a><!--END_ND_FOOTER--></div>
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>transform: function(</td><td class=PParameter nowrap>source,</td></tr><tr><td></td><td class=PParameter nowrap>dest,</td></tr><tr><td></td><td class=PParameter nowrap>point</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote>Transform a point coordinate from one map projection to another. </div></div><div class=CToolTip id="tt2"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>reportError: function(</td><td class=PParameter nowrap>msg</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote>An internal method to report errors back to user. </div></div><div class=CToolTip id="tt3"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>extend: function(</td><td class=PParameter nowrap>destination,</td></tr><tr><td></td><td class=PParameter nowrap>source</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote>Copy all properties of a source object to a destination object. </div></div><div class=CToolTip id="tt4"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>Class: function()</td></tr></table></blockquote>Base class used to construct all other classes. </div></div><div class=CToolTip id="tt5"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>bind: function(</td><td class=PParameter nowrap>func,</td></tr><tr><td></td><td class=PParameter nowrap>object</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote>Bind a function to an object. </div></div><div class=CToolTip id="tt6"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>getScriptLocation: function ()</td></tr></table></blockquote>Return the path to this script.</div></div><div class=CToolTip id="tt7"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>loadScript: function(</td><td class=PParameter nowrap>url,</td></tr><tr><td></td><td class=PParameter nowrap>onload,</td></tr><tr><td></td><td class=PParameter nowrap>onfail,</td></tr><tr><td></td><td class=PParameter nowrap>loadCheck</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote>Load a JS file from a URL into a script tag in the page.</div></div><div class=CToolTip id="tt8"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>checkReadyState: function()</td></tr></table></blockquote>IE workaround since there is no onerror handler. </div></div><div class=CToolTip id="tt9"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>initialize: function(</td><td class=PParameter nowrap>srsCode</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote>Constructor for Proj4js.Proj objects</div></div><div class=CToolTip id="tt10"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>loadProjDefinition: function()</td></tr></table></blockquote>Loads the coordinate system initialization string if required. </div></div><div class=CToolTip id="tt11"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>loadFromService: function()</td></tr></table></blockquote>Creates the REST URL for loading the definition from a web service and loads it.</div></div><div class=CToolTip id="tt12"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>defsLoaded: function()</td></tr></table></blockquote>Continues the Proj object initilization once the def file is loaded</div></div><div class=CToolTip id="tt13"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>checkDefsLoaded: function()</td></tr></table></blockquote>This is the loadCheck method to see if the def object exists</div></div><div class=CToolTip id="tt14"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>defsFailed: function()</td></tr></table></blockquote>Report an error in loading the defs file, but continue on using WGS84</div></div><div class=CToolTip id="tt15"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>loadProjCode: function(</td><td class=PParameter nowrap>projName</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote>Loads projection class code dynamically if required. </div></div><div class=CToolTip id="tt16"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>loadProjCodeSuccess: function(</td><td class=PParameter nowrap>projName</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote>Loads any proj dependencies or continue on to final initialization.</div></div><div class=CToolTip id="tt17"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>checkCodeLoaded: function(</td><td class=PParameter nowrap>projName</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote>This is the loadCheck method to see if the projection code is loaded</div></div><div class=CToolTip id="tt18"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>initTransforms: function()</td></tr></table></blockquote>Finalize the initialization of the Proj object</div></div><div class=CToolTip id="tt19"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>parseDefs: function()</td></tr></table></blockquote>Parses the PROJ.4 initialization string and sets the associated properties.</div></div><div class=CToolTip id="tt20"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>deriveConstants: function()</td></tr></table></blockquote>Sets several derived constant values and initialization of datum and ellipse parameters.</div></div><!--END_ND_TOOLTIPS-->
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
Added: trunk/mapbender/http/extensions/proj4js/docs/NaturalDocs/index/Classes.html
===================================================================
--- trunk/mapbender/http/extensions/proj4js/docs/NaturalDocs/index/Classes.html (rev 0)
+++ trunk/mapbender/http/extensions/proj4js/docs/NaturalDocs/index/Classes.html 2009-08-31 13:30:38 UTC (rev 4581)
@@ -0,0 +1,16 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>Class Index</title><link rel="stylesheet" type="text/css" href="../styles/main.css"><script language=JavaScript src="../javascript/main.js"></script></head><body class=UnframedPage onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!-- Generated by Natural Docs, version 1.35 -->
+<!-- http://www.naturaldocs.org -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+<table border=0 cellspacing=0 cellpadding=0 width=100%><tr><td class=MenuSection valign=top><!--START_ND_MENU--><div class=MEntry><div class=MFile><a href="../files/proj4js-js.html">Proj4js</a></div></div><div class=MEntry><div class=MFile><a href="../files/proj4js-combined-js.html">Proj4js</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">Index</a><div class=MGroupContent id=MGroupContent1><div class=MEntry><div class=MIndex><a href="General.html">Everything</a></div></div><div class=MEntry><div class=MIndex id=MSelected>Classes</div></div><div class=MEntry><div class=MIndex><a href="Functions.html">Functions</a></div></div><div class=MEntry><div class=MIndex><a href="Properties.html">Properties</a></div></div></div></div></div><!--END_ND_MENU--></td><td class=IndexSection valign=top><div class=IPageTitle>Class Index</div><div class=INavigationBar>$#! · 0-9 · A · B · C · D · E · F · G · H · I · J · K · L · M · N · O · <a href="#P">P</a> · Q · R · S · T · U · V · W · X · Y · Z</div><table border=0 cellspacing=0 cellpadding=0><tr><td class=IHeading id=IFirstHeading><a name="P"></a>P</td><td></td></tr><tr><td class=ISymbolPrefix id=IFirstSymbolPrefix> </td><td class=IEntry><span class=ISymbol>Proj4js</span><div class=ISubIndex><a href="../files/proj4js-combined-js.html#Proj4js" id=link1 onMouseOver="ShowTip(event, 'tt1', 'link1')" onMouseOut="HideTip('tt1')" class=IFile>proj4js-combined.js</a><a href="../files/proj4js-js.html#Proj4js" id=link2 onMouseOver="ShowTip(event, 'tt1', 'link2')" onMouseOut="HideTip('tt1')" class=IFile>proj4js.js</a></div></td></tr><tr><td class=ISymbolPrefix id=ILastSymbolPrefix> </td><td class=IEntry><span class=ISymbol>Proj4js.Proj</span><div class=ISubIndex><a href="../files/proj4js-combined-js.html#Proj4js.Proj" id=link3 onMouseOver="ShowTip(event, 'tt2', 'link3')" onMouseOut="HideTip('tt2')" class=IFile>proj4js-combined.js</a><a href="../files/proj4js-js.html#Proj4js.Proj" id=link4 onMouseOver="ShowTip(event, 'tt2', 'link4')" onMouseOut="HideTip('tt2')" class=IFile>proj4js.js</a></div></td></tr></table>
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CClass>Proj4js is a JavaScript library to transform point coordinates from one coordinate system to another, including datum transformations.</div></div><div class=CToolTip id="tt2"><div class=CClass>Proj objects provide transformation methods for point coordinates between geodetic latitude/longitude and a projected coordinate system. </div></div><!--END_ND_TOOLTIPS-->
+
+</td></tr></table><div class=Footer><!--START_ND_FOOTER-->Generated by <a href="http://www.naturaldocs.org">Natural Docs</a><!--END_ND_FOOTER--></div><script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
Added: trunk/mapbender/http/extensions/proj4js/docs/NaturalDocs/index/Functions.html
===================================================================
--- trunk/mapbender/http/extensions/proj4js/docs/NaturalDocs/index/Functions.html (rev 0)
+++ trunk/mapbender/http/extensions/proj4js/docs/NaturalDocs/index/Functions.html 2009-08-31 13:30:38 UTC (rev 4581)
@@ -0,0 +1,52 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>Function Index</title><link rel="stylesheet" type="text/css" href="../styles/main.css"><script language=JavaScript src="../javascript/main.js"></script></head><body class=UnframedPage onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!-- Generated by Natural Docs, version 1.35 -->
+<!-- http://www.naturaldocs.org -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+<table border=0 cellspacing=0 cellpadding=0 width=100%><tr><td class=MenuSection valign=top><!--START_ND_MENU--><div class=MEntry><div class=MFile><a href="../files/proj4js-js.html">Proj4js</a></div></div><div class=MEntry><div class=MFile><a href="../files/proj4js-combined-js.html">Proj4js</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">Index</a><div class=MGroupContent id=MGroupContent1><div class=MEntry><div class=MIndex><a href="General.html">Everything</a></div></div><div class=MEntry><div class=MIndex><a href="Classes.html">Classes</a></div></div><div class=MEntry><div class=MIndex id=MSelected>Functions</div></div><div class=MEntry><div class=MIndex><a href="Properties.html">Properties</a></div></div></div></div></div><!--END_ND_MENU--></td><td class=IndexSection valign=top><div class=IPageTitle>Function Index</div><div class=INavigationBar>$#! · 0-9 · A · <a href="#B">B</a> · <a href="#C">C</a> · <a href="#D">D</a> · <a href="#E">E</a> · F · <a href="#G">G</a> · H · <a href="#I">I</a> · J · K · <a href="#L">L</a> · M · N · O · <a href="#P">P</a> · Q · <a href="#R">R</a> · S · <a href="#T">T</a> · U · V · W · X · Y · Z</div><table border=0 cellspacing=0 cellpadding=0><tr><td class=IHeading id=IFirstHeading><a name="B"></a>B</td><td></td></tr><tr><td class=ISymbolPrefix id=IOnlySymbolPrefix> </td><td class=IEntry><span class=ISymbol>bind</span><div class=ISubIndex><a href="../files/proj4js-combined-js.html#bind" id=link1 onMouseOver="ShowTip(event, 'tt1', 'link1')" onMouseOut="HideTip('tt1')" class=IFile>proj4js-combined.js</a><a href="../files/proj4js-js.html#bind" id=link2 onMouseOver="ShowTip(event, 'tt1', 'link2')" onMouseOut="HideTip('tt1')" class=IFile>proj4js.js</a></div></td></tr><tr><td class=IHeading><a name="C"></a>C</td><td></td></tr><tr><td class=ISymbolPrefix id=IFirstSymbolPrefix> </td><td class=IEntry><span class=ISymbol>checkCodeLoaded</span>, <span class=IParent>Proj4js.Proj</span><div class=ISubIndex><a href="../files/proj4js-combined-js.html#Proj4js.Proj.checkCodeLoaded" id=link3 onMouseOver="ShowTip(event, 'tt2', 'link3')" onMouseOut="HideTip('tt2')" class=IFile>proj4js-combined.js</a><a href="../files/proj4js-js.html#Proj4js.Proj.checkCodeLoaded" id=link4 onMouseOver="ShowTip(event, 'tt2', 'link4')" onMouseOut="HideTip('tt2')" class=IFile>proj4js.js</a></div></td></tr><tr><td class=ISymbolPrefix> </td><td class=IEntry><span class=ISymbol>checkDefsLoaded</span>, <span class=IParent>Proj4js.Proj</span><div class=ISubIndex><a href="../files/proj4js-combined-js.html#Proj4js.Proj.checkDefsLoaded" id=link5 onMouseOver="ShowTip(event, 'tt3', 'link5')" onMouseOut="HideTip('tt3')" class=IFile>proj4js-combined.js</a><a href="../files/proj4js-js.html#Proj4js.Proj.checkDefsLoaded" id=link6 onMouseOver="ShowTip(event, 'tt3', 'link6')" onMouseOut="HideTip('tt3')" class=IFile>proj4js.js</a></div></td></tr><tr><td class=ISymbolPrefix> </td><td class=IEntry><span class=ISymbol>checkReadyState</span><div class=ISubIndex><a href="../files/proj4js-combined-js.html#checkReadyState" id=link7 onMouseOver="ShowTip(event, 'tt4', 'link7')" onMouseOut="HideTip('tt4')" class=IFile>proj4js-combined.js</a><a href="../files/proj4js-js.html#checkReadyState" id=link8 onMouseOver="ShowTip(event, 'tt4', 'link8')" onMouseOut="HideTip('tt4')" class=IFile>proj4js.js</a></div></td></tr><tr><td class=ISymbolPrefix id=ILastSymbolPrefix> </td><td class=IEntry><span class=ISymbol>Class</span><div class=ISubIndex><a href="../files/proj4js-combined-js.html#Class" id=link9 onMouseOver="ShowTip(event, 'tt5', 'link9')" onMouseOut="HideTip('tt5')" class=IFile>proj4js-combined.js</a><a href="../files/proj4js-js.html#Class" id=link10 onMouseOver="ShowTip(event, 'tt5', 'link10')" onMouseOut="HideTip('tt5')" class=IFile>proj4js.js</a></div></td></tr><tr><td class=IHeading><a name="D"></a>D</td><td></td></tr><tr><td class=ISymbolPrefix id=IFirstSymbolPrefix> </td><td class=IEntry><span class=ISymbol>defsFailed</span>, <span class=IParent>Proj4js.Proj</span><div class=ISubIndex><a href="../files/proj4js-combined-js.html#Proj4js.Proj.defsFailed" id=link11 onMouseOver="ShowTip(event, 'tt6', 'link11')" onMouseOut="HideTip('tt6')" class=IFile>proj4js-combined.js</a><a href="../files/proj4js-js.html#Proj4js.Proj.defsFailed" id=link12 onMouseOver="ShowTip(event, 'tt6', 'link12')" onMouseOut="HideTip('tt6')" class=IFile>proj4js.js</a></div></td></tr><tr><td class=ISymbolPrefix> </td><td class=IEntry><span class=ISymbol>defsLoaded</span>, <span class=IParent>Proj4js.Proj</span><div class=ISubIndex><a href="../files/proj4js-combined-js.html#Proj4js.Proj.defsLoaded" id=link13 onMouseOver="ShowTip(event, 'tt7', 'link13')" onMouseOut="HideTip('tt7')" class=IFile>proj4js-combined.js</a><a href="../files/proj4js-js.html#Proj4js.Proj.defsLoaded" id=link14 onMouseOver="ShowTip(event, 'tt7', 'link14')" onMouseOut="HideTip('tt7')" class=IFile>proj4js.js</a></div></td></tr><tr><td class=ISymbolPrefix id=ILastSymbolPrefix> </td><td class=IEntry><span class=ISymbol>deriveConstants</span>, <span class=IParent>Proj4js.Proj</span><div class=ISubIndex><a href="../files/proj4js-combined-js.html#Proj4js.Proj.deriveConstants" id=link15 onMouseOver="ShowTip(event, 'tt8', 'link15')" onMouseOut="HideTip('tt8')" class=IFile>proj4js-combined.js</a><a href="../files/proj4js-js.html#Proj4js.Proj.deriveConstants" id=link16 onMouseOver="ShowTip(event, 'tt8', 'link16')" onMouseOut="HideTip('tt8')" class=IFile>proj4js.js</a></div></td></tr><tr><td class=IHeading><a name="E"></a>E</td><td></td></tr><tr><td class=ISymbolPrefix id=IOnlySymbolPrefix> </td><td class=IEntry><span class=ISymbol>extend</span><div class=ISubIndex><a href="../files/proj4js-combined-js.html#extend" id=link17 onMouseOver="ShowTip(event, 'tt9', 'link17')" onMouseOut="HideTip('tt9')" class=IFile>proj4js-combined.js</a><a href="../files/proj4js-js.html#extend" id=link18 onMouseOver="ShowTip(event, 'tt9', 'link18')" onMouseOut="HideTip('tt9')" class=IFile>proj4js.js</a></div></td></tr><tr><td class=IHeading><a name="G"></a>G</td><td></td></tr><tr><td class=ISymbolPrefix id=IOnlySymbolPrefix> </td><td class=IEntry><span class=ISymbol>getScriptLocation</span><div class=ISubIndex><a href="../files/proj4js-combined-js.html#getScriptLocation" id=link19 onMouseOver="ShowTip(event, 'tt10', 'link19')" onMouseOut="HideTip('tt10')" class=IFile>proj4js-combined.js</a><a href="../files/proj4js-js.html#getScriptLocation" id=link20 onMouseOver="ShowTip(event, 'tt10', 'link20')" onMouseOut="HideTip('tt10')" class=IFile>proj4js.js</a></div></td></tr><tr><td class=IHeading><a name="I"></a>I</td><td></td></tr><tr><td class=ISymbolPrefix id=IFirstSymbolPrefix> </td><td class=IEntry><span class=ISymbol>initialize</span>, <span class=IParent>Proj4js.Proj</span><div class=ISubIndex><a href="../files/proj4js-combined-js.html#Proj4js.Proj.initialize" id=link21 onMouseOver="ShowTip(event, 'tt11', 'link21')" onMouseOut="HideTip('tt11')" class=IFile>proj4js-combined.js</a><a href="../files/proj4js-js.html#Proj4js.Proj.initialize" id=link22 onMouseOver="ShowTip(event, 'tt11', 'link22')" onMouseOut="HideTip('tt11')" class=IFile>proj4js.js</a></div></td></tr><tr><td class=ISymbolPrefix id=ILastSymbolPrefix> </td><td class=IEntry><span class=ISymbol>initTransforms</span>, <span class=IParent>Proj4js.Proj</span><div class=ISubIndex><a href="../files/proj4js-combined-js.html#Proj4js.Proj.initTransforms" id=link23 onMouseOver="ShowTip(event, 'tt12', 'link23')" onMouseOut="HideTip('tt12')" class=IFile>proj4js-combined.js</a><a href="../files/proj4js-js.html#Proj4js.Proj.initTransforms" id=link24 onMouseOver="ShowTip(event, 'tt12', 'link24')" onMouseOut="HideTip('tt12')" class=IFile>proj4js.js</a></div></td></tr><tr><td class=IHeading><a name="L"></a>L</td><td></td></tr><tr><td class=ISymbolPrefix id=IFirstSymbolPrefix> </td><td class=IEntry><span class=ISymbol>loadFromService</span>, <span class=IParent>Proj4js.Proj</span><div class=ISubIndex><a href="../files/proj4js-combined-js.html#Proj4js.Proj.loadFromService" id=link25 onMouseOver="ShowTip(event, 'tt13', 'link25')" onMouseOut="HideTip('tt13')" class=IFile>proj4js-combined.js</a><a href="../files/proj4js-js.html#Proj4js.Proj.loadFromService" id=link26 onMouseOver="ShowTip(event, 'tt13', 'link26')" onMouseOut="HideTip('tt13')" class=IFile>proj4js.js</a></div></td></tr><tr><td class=ISymbolPrefix> </td><td class=IEntry><span class=ISymbol>loadProjCode</span>, <span class=IParent>Proj4js.Proj</span><div class=ISubIndex><a href="../files/proj4js-combined-js.html#Proj4js.Proj.loadProjCode" id=link27 onMouseOver="ShowTip(event, 'tt14', 'link27')" onMouseOut="HideTip('tt14')" class=IFile>proj4js-combined.js</a><a href="../files/proj4js-js.html#Proj4js.Proj.loadProjCode" id=link28 onMouseOver="ShowTip(event, 'tt14', 'link28')" onMouseOut="HideTip('tt14')" class=IFile>proj4js.js</a></div></td></tr><tr><td class=ISymbolPrefix> </td><td class=IEntry><span class=ISymbol>loadProjCodeSuccess</span>, <span class=IParent>Proj4js.Proj</span><div class=ISubIndex><a href="../files/proj4js-combined-js.html#Proj4js.Proj.loadProjCodeSuccess" id=link29 onMouseOver="ShowTip(event, 'tt15', 'link29')" onMouseOut="HideTip('tt15')" class=IFile>proj4js-combined.js</a><a href="../files/proj4js-js.html#Proj4js.Proj.loadProjCodeSuccess" id=link30 onMouseOver="ShowTip(event, 'tt15', 'link30')" onMouseOut="HideTip('tt15')" class=IFile>proj4js.js</a></div></td></tr><tr><td class=ISymbolPrefix> </td><td class=IEntry><span class=ISymbol>loadProjDefinition</span>, <span class=IParent>Proj4js.Proj</span><div class=ISubIndex><a href="../files/proj4js-combined-js.html#Proj4js.Proj.loadProjDefinition" id=link31 onMouseOver="ShowTip(event, 'tt16', 'link31')" onMouseOut="HideTip('tt16')" class=IFile>proj4js-combined.js</a><a href="../files/proj4js-js.html#Proj4js.Proj.loadProjDefinition" id=link32 onMouseOver="ShowTip(event, 'tt16', 'link32')" onMouseOut="HideTip('tt16')" class=IFile>proj4js.js</a></div></td></tr><tr><td class=ISymbolPrefix id=ILastSymbolPrefix> </td><td class=IEntry><span class=ISymbol>loadScript</span><div class=ISubIndex><a href="../files/proj4js-combined-js.html#loadScript" id=link33 onMouseOver="ShowTip(event, 'tt17', 'link33')" onMouseOut="HideTip('tt17')" class=IFile>proj4js-combined.js</a><a href="../files/proj4js-js.html#loadScript" id=link34 onMouseOver="ShowTip(event, 'tt17', 'link34')" onMouseOut="HideTip('tt17')" class=IFile>proj4js.js</a></div></td></tr><tr><td class=IHeading><a name="P"></a>P</td><td></td></tr><tr><td class=ISymbolPrefix id=IOnlySymbolPrefix> </td><td class=IEntry><span class=ISymbol>parseDefs</span>, <span class=IParent>Proj4js.Proj</span><div class=ISubIndex><a href="../files/proj4js-combined-js.html#Proj4js.Proj.parseDefs" id=link35 onMouseOver="ShowTip(event, 'tt18', 'link35')" onMouseOut="HideTip('tt18')" class=IFile>proj4js-combined.js</a><a href="../files/proj4js-js.html#Proj4js.Proj.parseDefs" id=link36 onMouseOver="ShowTip(event, 'tt18', 'link36')" onMouseOut="HideTip('tt18')" class=IFile>proj4js.js</a></div></td></tr><tr><td class=IHeading><a name="R"></a>R</td><td></td></tr><tr><td class=ISymbolPrefix id=IOnlySymbolPrefix> </td><td class=IEntry><span class=ISymbol>reportError</span>, <span class=IParent>Proj4js</span><div class=ISubIndex><a href="../files/proj4js-combined-js.html#Proj4js.reportError" id=link37 onMouseOver="ShowTip(event, 'tt19', 'link37')" onMouseOut="HideTip('tt19')" class=IFile>proj4js-combined.js</a><a href="../files/proj4js-js.html#Proj4js.reportError" id=link38 onMouseOver="ShowTip(event, 'tt19', 'link38')" onMouseOut="HideTip('tt19')" class=IFile>proj4js.js</a></div></td></tr><tr><td class=IHeading><a name="T"></a>T</td><td></td></tr><tr><td class=ISymbolPrefix id=IOnlySymbolPrefix> </td><td class=IEntry><span class=ISymbol>transform(source,dest,point)</span>, <span class=IParent>Proj4js</span><div class=ISubIndex><a href="../files/proj4js-combined-js.html#Proj4js.transform(source,dest,point)" id=link39 onMouseOver="ShowTip(event, 'tt20', 'link39')" onMouseOut="HideTip('tt20')" class=IFile>proj4js-combined.js</a><a href="../files/proj4js-js.html#Proj4js.transform(source,dest,point)" id=link40 onMouseOver="ShowTip(event, 'tt20', 'link40')" onMouseOut="HideTip('tt20')" class=IFile>proj4js.js</a></div></td></tr></table>
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>bind: function(</td><td class=PParameter nowrap>func,</td></tr><tr><td></td><td class=PParameter nowrap>object</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote>Bind a function to an object. </div></div><!--END_ND_TOOLTIPS-->
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt2"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>checkCodeLoaded: function(</td><td class=PParameter nowrap>projName</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote>This is the loadCheck method to see if the projection code is loaded</div></div><div class=CToolTip id="tt3"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>checkDefsLoaded: function()</td></tr></table></blockquote>This is the loadCheck method to see if the def object exists</div></div><div class=CToolTip id="tt4"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>checkReadyState: function()</td></tr></table></blockquote>IE workaround since there is no onerror handler. </div></div><div class=CToolTip id="tt5"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>Class: function()</td></tr></table></blockquote>Base class used to construct all other classes. </div></div><!--END_ND_TOOLTIPS-->
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt6"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>defsFailed: function()</td></tr></table></blockquote>Report an error in loading the defs file, but continue on using WGS84</div></div><div class=CToolTip id="tt7"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>defsLoaded: function()</td></tr></table></blockquote>Continues the Proj object initilization once the def file is loaded</div></div><div class=CToolTip id="tt8"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>deriveConstants: function()</td></tr></table></blockquote>Sets several derived constant values and initialization of datum and ellipse parameters.</div></div><!--END_ND_TOOLTIPS-->
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt9"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>extend: function(</td><td class=PParameter nowrap>destination,</td></tr><tr><td></td><td class=PParameter nowrap>source</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote>Copy all properties of a source object to a destination object. </div></div><!--END_ND_TOOLTIPS-->
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt10"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>getScriptLocation: function ()</td></tr></table></blockquote>Return the path to this script.</div></div><!--END_ND_TOOLTIPS-->
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt11"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>initialize: function(</td><td class=PParameter nowrap>srsCode</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote>Constructor for Proj4js.Proj objects</div></div><div class=CToolTip id="tt12"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>initTransforms: function()</td></tr></table></blockquote>Finalize the initialization of the Proj object</div></div><!--END_ND_TOOLTIPS-->
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt13"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>loadFromService: function()</td></tr></table></blockquote>Creates the REST URL for loading the definition from a web service and loads it.</div></div><div class=CToolTip id="tt14"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>loadProjCode: function(</td><td class=PParameter nowrap>projName</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote>Loads projection class code dynamically if required. </div></div><div class=CToolTip id="tt15"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>loadProjCodeSuccess: function(</td><td class=PParameter nowrap>projName</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote>Loads any proj dependencies or continue on to final initialization.</div></div><div class=CToolTip id="tt16"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>loadProjDefinition: function()</td></tr></table></blockquote>Loads the coordinate system initialization string if required. </div></div><div class=CToolTip id="tt17"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>loadScript: function(</td><td class=PParameter nowrap>url,</td></tr><tr><td></td><td class=PParameter nowrap>onload,</td></tr><tr><td></td><td class=PParameter nowrap>onfail,</td></tr><tr><td></td><td class=PParameter nowrap>loadCheck</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote>Load a JS file from a URL into a script tag in the page.</div></div><!--END_ND_TOOLTIPS-->
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt18"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>parseDefs: function()</td></tr></table></blockquote>Parses the PROJ.4 initialization string and sets the associated properties.</div></div><!--END_ND_TOOLTIPS-->
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt19"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>reportError: function(</td><td class=PParameter nowrap>msg</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote>An internal method to report errors back to user. </div></div><!--END_ND_TOOLTIPS-->
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt20"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>transform: function(</td><td class=PParameter nowrap>source,</td></tr><tr><td></td><td class=PParameter nowrap>dest,</td></tr><tr><td></td><td class=PParameter nowrap>point</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote>Transform a point coordinate from one map projection to another. </div></div><!--END_ND_TOOLTIPS-->
+
+</td></tr></table><div class=Footer><!--START_ND_FOOTER-->Generated by <a href="http://www.naturaldocs.org">Natural Docs</a><!--END_ND_FOOTER--></div><script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
Added: trunk/mapbender/http/extensions/proj4js/docs/NaturalDocs/index/General.html
===================================================================
--- trunk/mapbender/http/extensions/proj4js/docs/NaturalDocs/index/General.html (rev 0)
+++ trunk/mapbender/http/extensions/proj4js/docs/NaturalDocs/index/General.html 2009-08-31 13:30:38 UTC (rev 4581)
@@ -0,0 +1,60 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>Index</title><link rel="stylesheet" type="text/css" href="../styles/main.css"><script language=JavaScript src="../javascript/main.js"></script></head><body class=UnframedPage onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!-- Generated by Natural Docs, version 1.35 -->
+<!-- http://www.naturaldocs.org -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+<table border=0 cellspacing=0 cellpadding=0 width=100%><tr><td class=MenuSection valign=top><!--START_ND_MENU--><div class=MEntry><div class=MFile><a href="../files/proj4js-js.html">Proj4js</a></div></div><div class=MEntry><div class=MFile><a href="../files/proj4js-combined-js.html">Proj4js</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">Index</a><div class=MGroupContent id=MGroupContent1><div class=MEntry><div class=MIndex id=MSelected>Everything</div></div><div class=MEntry><div class=MIndex><a href="Classes.html">Classes</a></div></div><div class=MEntry><div class=MIndex><a href="Functions.html">Functions</a></div></div><div class=MEntry><div class=MIndex><a href="Properties.html">Properties</a></div></div></div></div></div><!--END_ND_MENU--></td><td class=IndexSection valign=top><div class=IPageTitle>Index</div><div class=INavigationBar>$#! · 0-9 · A · <a href="#B">B</a> · <a href="#C">C</a> · <a href="#D">D</a> · <a href="#E">E</a> · <a href="#F">F</a> · <a href="#G">G</a> · H · <a href="#I">I</a> · J · K · <a href="#L">L</a> · M · N · O · <a href="#P">P</a> · Q · <a href="#R">R</a> · S · <a href="#T">T</a> · <a href="#U">U</a> · V · W · X · Y · Z</div><table border=0 cellspacing=0 cellpadding=0><tr><td class=IHeading id=IFirstHeading><a name="B"></a>B</td><td></td></tr><tr><td class=ISymbolPrefix id=IOnlySymbolPrefix> </td><td class=IEntry><span class=ISymbol>bind</span><div class=ISubIndex><a href="../files/proj4js-combined-js.html#bind" id=link1 onMouseOver="ShowTip(event, 'tt1', 'link1')" onMouseOut="HideTip('tt1')" class=IFile>proj4js-combined.js</a><a href="../files/proj4js-js.html#bind" id=link2 onMouseOver="ShowTip(event, 'tt1', 'link2')" onMouseOut="HideTip('tt1')" class=IFile>proj4js.js</a></div></td></tr><tr><td class=IHeading><a name="C"></a>C</td><td></td></tr><tr><td class=ISymbolPrefix id=IFirstSymbolPrefix> </td><td class=IEntry><span class=ISymbol>checkCodeLoaded</span>, <span class=IParent>Proj4js.Proj</span><div class=ISubIndex><a href="../files/proj4js-combined-js.html#Proj4js.Proj.checkCodeLoaded" id=link3 onMouseOver="ShowTip(event, 'tt2', 'link3')" onMouseOut="HideTip('tt2')" class=IFile>proj4js-combined.js</a><a href="../files/proj4js-js.html#Proj4js.Proj.checkCodeLoaded" id=link4 onMouseOver="ShowTip(event, 'tt2', 'link4')" onMouseOut="HideTip('tt2')" class=IFile>proj4js.js</a></div></td></tr><tr><td class=ISymbolPrefix> </td><td class=IEntry><span class=ISymbol>checkDefsLoaded</span>, <span class=IParent>Proj4js.Proj</span><div class=ISubIndex><a href="../files/proj4js-combined-js.html#Proj4js.Proj.checkDefsLoaded" id=link5 onMouseOver="ShowTip(event, 'tt3', 'link5')" onMouseOut="HideTip('tt3')" class=IFile>proj4js-combined.js</a><a href="../files/proj4js-js.html#Proj4js.Proj.checkDefsLoaded" id=link6 onMouseOver="ShowTip(event, 'tt3', 'link6')" onMouseOut="HideTip('tt3')" class=IFile>proj4js.js</a></div></td></tr><tr><td class=ISymbolPrefix> </td><td class=IEntry><span class=ISymbol>checkReadyState</span><div class=ISubIndex><a href="../files/proj4js-combined-js.html#checkReadyState" id=link7 onMouseOver="ShowTip(event, 'tt4', 'link7')" onMouseOut="HideTip('tt4')" class=IFile>proj4js-combined.js</a><a href="../files/proj4js-js.html#checkReadyState" id=link8 onMouseOver="ShowTip(event, 'tt4', 'link8')" onMouseOut="HideTip('tt4')" class=IFile>proj4js.js</a></div></td></tr><tr><td class=ISymbolPrefix id=ILastSymbolPrefix> </td><td class=IEntry><span class=ISymbol>Class</span><div class=ISubIndex><a href="../files/proj4js-combined-js.html#Class" id=link9 onMouseOver="ShowTip(event, 'tt5', 'link9')" onMouseOut="HideTip('tt5')" class=IFile>proj4js-combined.js</a><a href="../files/proj4js-js.html#Class" id=link10 onMouseOver="ShowTip(event, 'tt5', 'link10')" onMouseOut="HideTip('tt5')" class=IFile>proj4js.js</a></div></td></tr><tr><td class=IHeading><a name="D"></a>D</td><td></td></tr><tr><td class=ISymbolPrefix id=IFirstSymbolPrefix> </td><td class=IEntry><span class=ISymbol>datum</span>, <span class=IParent>Proj4js.Proj</span><div class=ISubIndex><a href="../files/proj4js-combined-js.html#Proj4js.Proj.datum" id=link11 onMouseOver="ShowTip(event, 'tt6', 'link11')" onMouseOut="HideTip('tt6')" class=IFile>proj4js-combined.js</a><a href="../files/proj4js-js.html#Proj4js.Proj.datum" id=link12 onMouseOver="ShowTip(event, 'tt6', 'link12')" onMouseOut="HideTip('tt6')" class=IFile>proj4js.js</a></div></td></tr><tr><td class=ISymbolPrefix> </td><td class=IEntry><span class=ISymbol>defaultDatum</span>, <span class=IParent>Proj4js</span><div class=ISubIndex><a href="../files/proj4js-combined-js.html#Proj4js.defaultDatum" id=link13 onMouseOver="ShowTip(event, 'tt7', 'link13')" onMouseOut="HideTip('tt7')" class=IFile>proj4js-combined.js</a><a href="../files/proj4js-js.html#Proj4js.defaultDatum" id=link14 onMouseOver="ShowTip(event, 'tt7', 'link14')" onMouseOut="HideTip('tt7')" class=IFile>proj4js.js</a></div></td></tr><tr><td class=ISymbolPrefix> </td><td class=IEntry><span class=ISymbol>defsFailed</span>, <span class=IParent>Proj4js.Proj</span><div class=ISubIndex><a href="../files/proj4js-combined-js.html#Proj4js.Proj.defsFailed" id=link15 onMouseOver="ShowTip(event, 'tt8', 'link15')" onMouseOut="HideTip('tt8')" class=IFile>proj4js-combined.js</a><a href="../files/proj4js-js.html#Proj4js.Proj.defsFailed" id=link16 onMouseOver="ShowTip(event, 'tt8', 'link16')" onMouseOut="HideTip('tt8')" class=IFile>proj4js.js</a></div></td></tr><tr><td class=ISymbolPrefix> </td><td class=IEntry><span class=ISymbol>defsLoaded</span>, <span class=IParent>Proj4js.Proj</span><div class=ISubIndex><a href="../files/proj4js-combined-js.html#Proj4js.Proj.defsLoaded" id=link17 onMouseOver="ShowTip(event, 'tt9', 'link17')" onMouseOut="HideTip('tt9')" class=IFile>proj4js-combined.js</a><a href="../files/proj4js-js.html#Proj4js.Proj.defsLoaded" id=link18 onMouseOver="ShowTip(event, 'tt9', 'link18')" onMouseOut="HideTip('tt9')" class=IFile>proj4js.js</a></div></td></tr><tr><td class=ISymbolPrefix> </td><td class=IEntry><span class=ISymbol>defsLookupService</span><div class=ISubIndex><a href="../files/proj4js-combined-js.html#defsLookupService" id=link19 onMouseOver="ShowTip(event, 'tt10', 'link19')" onMouseOut="HideTip('tt10')" class=IFile>proj4js-combined.js</a><a href="../files/proj4js-js.html#defsLookupService" id=link20 onMouseOver="ShowTip(event, 'tt10', 'link20')" onMouseOut="HideTip('tt10')" class=IFile>proj4js.js</a></div></td></tr><tr><td class=ISymbolPrefix id=ILastSymbolPrefix> </td><td class=IEntry><span class=ISymbol>deriveConstants</span>, <span class=IParent>Proj4js.Proj</span><div class=ISubIndex><a href="../files/proj4js-combined-js.html#Proj4js.Proj.deriveConstants" id=link21 onMouseOver="ShowTip(event, 'tt11', 'link21')" onMouseOut="HideTip('tt11')" class=IFile>proj4js-combined.js</a><a href="../files/proj4js-js.html#Proj4js.Proj.deriveConstants" id=link22 onMouseOver="ShowTip(event, 'tt11', 'link22')" onMouseOut="HideTip('tt11')" class=IFile>proj4js.js</a></div></td></tr><tr><td class=IHeading><a name="E"></a>E</td><td></td></tr><tr><td class=ISymbolPrefix id=IOnlySymbolPrefix> </td><td class=IEntry><span class=ISymbol>extend</span><div class=ISubIndex><a href="../files/proj4js-combined-js.html#extend" id=link23 onMouseOver="ShowTip(event, 'tt12', 'link23')" onMouseOut="HideTip('tt12')" class=IFile>proj4js-combined.js</a><a href="../files/proj4js-js.html#extend" id=link24 onMouseOver="ShowTip(event, 'tt12', 'link24')" onMouseOut="HideTip('tt12')" class=IFile>proj4js.js</a></div></td></tr><tr><td class=IHeading><a name="F"></a>F</td><td></td></tr><tr><td class=ISymbolPrefix id=IFirstSymbolPrefix> </td><td class=IEntry><span class=ISymbol>Functions</span><div class=ISubIndex><span class=IParent>Proj4js</span><div class=ISubIndex><a href="../files/proj4js-combined-js.html#Proj4js.Functions" class=IFile>proj4js-combined.js</a><a href="../files/proj4js-js.html#Proj4js.Functions" class=IFile>proj4js.js</a></div><span class=IParent>Proj4js.Proj</span><div class=ISubIndex><a href="../files/proj4js-combined-js.html#Proj4js.Proj.Functions" class=IFile>proj4js-combined.js</a><a href="../files/proj4js-js.html#Proj4js.Proj.Functions" class=IFile>proj4js.js</a></div></div></td></tr><tr><td class=ISymbolPrefix id=ILastSymbolPrefix> </td><td class=IEntry><span class=ISymbol>Functions and Properties</span><div class=ISubIndex><a href="../files/proj4js-combined-js.html#Functions_and_Properties" class=IFile>proj4js-combined.js</a><a href="../files/proj4js-js.html#Functions_and_Properties" class=IFile>proj4js.js</a></div></td></tr><tr><td class=IHeading><a name="G"></a>G</td><td></td></tr><tr><td class=ISymbolPrefix id=IOnlySymbolPrefix> </td><td class=IEntry><span class=ISymbol>getScriptLocation</span><div class=ISubIndex><a href="../files/proj4js-combined-js.html#getScriptLocation" id=link25 onMouseOver="ShowTip(event, 'tt13', 'link25')" onMouseOut="HideTip('tt13')" class=IFile>proj4js-combined.js</a><a href="../files/proj4js-js.html#getScriptLocation" id=link26 onMouseOver="ShowTip(event, 'tt13', 'link26')" onMouseOut="HideTip('tt13')" class=IFile>proj4js.js</a></div></td></tr><tr><td class=IHeading><a name="I"></a>I</td><td></td></tr><tr><td class=ISymbolPrefix id=IFirstSymbolPrefix> </td><td class=IEntry><span class=ISymbol>initialize</span>, <span class=IParent>Proj4js.Proj</span><div class=ISubIndex><a href="../files/proj4js-combined-js.html#Proj4js.Proj.initialize" id=link27 onMouseOver="ShowTip(event, 'tt14', 'link27')" onMouseOut="HideTip('tt14')" class=IFile>proj4js-combined.js</a><a href="../files/proj4js-js.html#Proj4js.Proj.initialize" id=link28 onMouseOver="ShowTip(event, 'tt14', 'link28')" onMouseOut="HideTip('tt14')" class=IFile>proj4js.js</a></div></td></tr><tr><td class=ISymbolPrefix id=ILastSymbolPrefix> </td><td class=IEntry><span class=ISymbol>initTransforms</span>, <span class=IParent>Proj4js.Proj</span><div class=ISubIndex><a href="../files/proj4js-combined-js.html#Proj4js.Proj.initTransforms" id=link29 onMouseOver="ShowTip(event, 'tt15', 'link29')" onMouseOut="HideTip('tt15')" class=IFile>proj4js-combined.js</a><a href="../files/proj4js-js.html#Proj4js.Proj.initTransforms" id=link30 onMouseOver="ShowTip(event, 'tt15', 'link30')" onMouseOut="HideTip('tt15')" class=IFile>proj4js.js</a></div></td></tr><tr><td class=IHeading><a name="L"></a>L</td><td></td></tr><tr><td class=ISymbolPrefix id=IFirstSymbolPrefix> </td><td class=IEntry><span class=ISymbol>libPath</span><div class=ISubIndex><a href="../files/proj4js-combined-js.html#libPath" id=link31 onMouseOver="ShowTip(event, 'tt16', 'link31')" onMouseOut="HideTip('tt16')" class=IFile>proj4js-combined.js</a><a href="../files/proj4js-js.html#libPath" id=link32 onMouseOver="ShowTip(event, 'tt16', 'link32')" onMouseOut="HideTip('tt16')" class=IFile>proj4js.js</a></div></td></tr><tr><td class=ISymbolPrefix> </td><td class=IEntry><span class=ISymbol>loadFromService</span>, <span class=IParent>Proj4js.Proj</span><div class=ISubIndex><a href="../files/proj4js-combined-js.html#Proj4js.Proj.loadFromService" id=link33 onMouseOver="ShowTip(event, 'tt17', 'link33')" onMouseOut="HideTip('tt17')" class=IFile>proj4js-combined.js</a><a href="../files/proj4js-js.html#Proj4js.Proj.loadFromService" id=link34 onMouseOver="ShowTip(event, 'tt17', 'link34')" onMouseOut="HideTip('tt17')" class=IFile>proj4js.js</a></div></td></tr><tr><td class=ISymbolPrefix> </td><td class=IEntry><span class=ISymbol>loadProjCode</span>, <span class=IParent>Proj4js.Proj</span><div class=ISubIndex><a href="../files/proj4js-combined-js.html#Proj4js.Proj.loadProjCode" id=link35 onMouseOver="ShowTip(event, 'tt18', 'link35')" onMouseOut="HideTip('tt18')" class=IFile>proj4js-combined.js</a><a href="../files/proj4js-js.html#Proj4js.Proj.loadProjCode" id=link36 onMouseOver="ShowTip(event, 'tt18', 'link36')" onMouseOut="HideTip('tt18')" class=IFile>proj4js.js</a></div></td></tr><tr><td class=ISymbolPrefix> </td><td class=IEntry><span class=ISymbol>loadProjCodeSuccess</span>, <span class=IParent>Proj4js.Proj</span><div class=ISubIndex><a href="../files/proj4js-combined-js.html#Proj4js.Proj.loadProjCodeSuccess" id=link37 onMouseOver="ShowTip(event, 'tt19', 'link37')" onMouseOut="HideTip('tt19')" class=IFile>proj4js-combined.js</a><a href="../files/proj4js-js.html#Proj4js.Proj.loadProjCodeSuccess" id=link38 onMouseOver="ShowTip(event, 'tt19', 'link38')" onMouseOut="HideTip('tt19')" class=IFile>proj4js.js</a></div></td></tr><tr><td class=ISymbolPrefix> </td><td class=IEntry><span class=ISymbol>loadProjDefinition</span>, <span class=IParent>Proj4js.Proj</span><div class=ISubIndex><a href="../files/proj4js-combined-js.html#Proj4js.Proj.loadProjDefinition" id=link39 onMouseOver="ShowTip(event, 'tt20', 'link39')" onMouseOut="HideTip('tt20')" class=IFile>proj4js-combined.js</a><a href="../files/proj4js-js.html#Proj4js.Proj.loadProjDefinition" id=link40 onMouseOver="ShowTip(event, 'tt20', 'link40')" onMouseOut="HideTip('tt20')" class=IFile>proj4js.js</a></div></td></tr><tr><td class=ISymbolPrefix id=ILastSymbolPrefix> </td><td class=IEntry><span class=ISymbol>loadScript</span><div class=ISubIndex><a href="../files/proj4js-combined-js.html#loadScript" id=link41 onMouseOver="ShowTip(event, 'tt21', 'link41')" onMouseOut="HideTip('tt21')" class=IFile>proj4js-combined.js</a><a href="../files/proj4js-js.html#loadScript" id=link42 onMouseOver="ShowTip(event, 'tt21', 'link42')" onMouseOut="HideTip('tt21')" class=IFile>proj4js.js</a></div></td></tr><tr><td class=IHeading><a name="P"></a>P</td><td></td></tr><tr><td class=ISymbolPrefix id=IFirstSymbolPrefix> </td><td class=IEntry><span class=ISymbol>parseDefs</span>, <span class=IParent>Proj4js.Proj</span><div class=ISubIndex><a href="../files/proj4js-combined-js.html#Proj4js.Proj.parseDefs" id=link43 onMouseOver="ShowTip(event, 'tt22', 'link43')" onMouseOut="HideTip('tt22')" class=IFile>proj4js-combined.js</a><a href="../files/proj4js-js.html#Proj4js.Proj.parseDefs" id=link44 onMouseOver="ShowTip(event, 'tt22', 'link44')" onMouseOut="HideTip('tt22')" class=IFile>proj4js.js</a></div></td></tr><tr><td class=ISymbolPrefix> </td><td class=IEntry><span class=ISymbol>Private Methods</span><div class=ISubIndex><a href="../files/proj4js-combined-js.html#Private_Methods" id=link45 onMouseOver="ShowTip(event, 'tt23', 'link45')" onMouseOut="HideTip('tt23')" class=IFile>proj4js-combined.js</a><a href="../files/proj4js-js.html#Private_Methods" id=link46 onMouseOver="ShowTip(event, 'tt23', 'link46')" onMouseOut="HideTip('tt23')" class=IFile>proj4js.js</a></div></td></tr><tr><td class=ISymbolPrefix> </td><td class=IEntry><span class=ISymbol>Proj4js</span><div class=ISubIndex><a href="../files/proj4js-combined-js.html#Proj4js" id=link47 onMouseOver="ShowTip(event, 'tt24', 'link47')" onMouseOut="HideTip('tt24')" class=IFile>proj4js-combined.js</a><a href="../files/proj4js-js.html#Proj4js" id=link48 onMouseOver="ShowTip(event, 'tt24', 'link48')" onMouseOut="HideTip('tt24')" class=IFile>proj4js.js</a></div></td></tr><tr><td class=ISymbolPrefix> </td><td class=IEntry><span class=ISymbol>Proj4js.Proj</span><div class=ISubIndex><a href="../files/proj4js-combined-js.html#Proj4js.Proj" id=link49 onMouseOver="ShowTip(event, 'tt25', 'link49')" onMouseOut="HideTip('tt25')" class=IFile>proj4js-combined.js</a><a href="../files/proj4js-js.html#Proj4js.Proj" id=link50 onMouseOver="ShowTip(event, 'tt25', 'link50')" onMouseOut="HideTip('tt25')" class=IFile>proj4js.js</a></div></td></tr><tr><td class=ISymbolPrefix> </td><td class=IEntry><span class=ISymbol>projName</span>, <span class=IParent>Proj4js.Proj</span><div class=ISubIndex><a href="../files/proj4js-combined-js.html#Proj4js.Proj.projName" id=link51 onMouseOver="ShowTip(event, 'tt26', 'link51')" onMouseOut="HideTip('tt26')" class=IFile>proj4js-combined.js</a><a href="../files/proj4js-js.html#Proj4js.Proj.projName" id=link52 onMouseOver="ShowTip(event, 'tt26', 'link52')" onMouseOut="HideTip('tt26')" class=IFile>proj4js.js</a></div></td></tr><tr><td class=ISymbolPrefix id=ILastSymbolPrefix> </td><td class=IEntry><span class=ISymbol>Properties</span><div class=ISubIndex><span class=IParent>Proj4js</span><div class=ISubIndex><a href="../files/proj4js-combined-js.html#Proj4js.Properties" class=IFile>proj4js-combined.js</a><a href="../files/proj4js-js.html#Proj4js.Properties" class=IFile>proj4js.js</a></div><span class=IParent>Proj4js.Proj</span><div class=ISubIndex><a href="../files/proj4js-combined-js.html#Proj4js.Proj.Properties" class=IFile>proj4js-combined.js</a><a href="../files/proj4js-js.html#Proj4js.Proj.Properties" class=IFile>proj4js.js</a></div></div></td></tr><tr><td class=IHeading><a name="R"></a>R</td><td></td></tr><tr><td class=ISymbolPrefix id=IFirstSymbolPrefix> </td><td class=IEntry><span class=ISymbol>readyToUse</span>, <span class=IParent>Proj4js.Proj</span><div class=ISubIndex><a href="../files/proj4js-combined-js.html#Proj4js.Proj.readyToUse" id=link53 onMouseOver="ShowTip(event, 'tt27', 'link53')" onMouseOut="HideTip('tt27')" class=IFile>proj4js-combined.js</a><a href="../files/proj4js-js.html#Proj4js.Proj.readyToUse" id=link54 onMouseOver="ShowTip(event, 'tt27', 'link54')" onMouseOut="HideTip('tt27')" class=IFile>proj4js.js</a></div></td></tr><tr><td class=ISymbolPrefix id=ILastSymbolPrefix> </td><td class=IEntry><span class=ISymbol>reportError</span>, <span class=IParent>Proj4js</span><div class=ISubIndex><a href="../files/proj4js-combined-js.html#Proj4js.reportError" id=link55 onMouseOver="ShowTip(event, 'tt28', 'link55')" onMouseOut="HideTip('tt28')" class=IFile>proj4js-combined.js</a><a href="../files/proj4js-js.html#Proj4js.reportError" id=link56 onMouseOver="ShowTip(event, 'tt28', 'link56')" onMouseOut="HideTip('tt28')" class=IFile>proj4js.js</a></div></td></tr><tr><td class=IHeading><a name="T"></a>T</td><td></td></tr><tr><td class=ISymbolPrefix id=IFirstSymbolPrefix> </td><td class=IEntry><span class=ISymbol>title</span>, <span class=IParent>Proj4js.Proj</span><div class=ISubIndex><a href="../files/proj4js-combined-js.html#Proj4js.Proj.title" id=link57 onMouseOver="ShowTip(event, 'tt29', 'link57')" onMouseOut="HideTip('tt29')" class=IFile>proj4js-combined.js</a><a href="../files/proj4js-js.html#Proj4js.Proj.title" id=link58 onMouseOver="ShowTip(event, 'tt29', 'link58')" onMouseOut="HideTip('tt29')" class=IFile>proj4js.js</a></div></td></tr><tr><td class=ISymbolPrefix id=ILastSymbolPrefix> </td><td class=IEntry><span class=ISymbol>transform(source,dest,point)</span>, <span class=IParent>Proj4js</span><div class=ISubIndex><a href="../files/proj4js-combined-js.html#Proj4js.transform(source,dest,point)" id=link59 onMouseOver="ShowTip(event, 'tt30', 'link59')" onMouseOut="HideTip('tt30')" class=IFile>proj4js-combined.js</a><a href="../files/proj4js-js.html#Proj4js.transform(source,dest,point)" id=link60 onMouseOver="ShowTip(event, 'tt30', 'link60')" onMouseOut="HideTip('tt30')" class=IFile>proj4js.js</a></div></td></tr><tr><td class=IHeading><a name="U"></a>U</td><td></td></tr><tr><td class=ISymbolPrefix id=IOnlySymbolPrefix> </td><td class=IEntry><span class=ISymbol>units</span>, <span class=IParent>Proj4js.Proj</span><div class=ISubIndex><a href="../files/proj4js-combined-js.html#Proj4js.Proj.units" id=link61 onMouseOver="ShowTip(event, 'tt31', 'link61')" onMouseOut="HideTip('tt31')" class=IFile>proj4js-combined.js</a><a href="../files/proj4js-js.html#Proj4js.Proj.units" id=link62 onMouseOver="ShowTip(event, 'tt31', 'link62')" onMouseOut="HideTip('tt31')" class=IFile>proj4js.js</a></div></td></tr></table>
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>bind: function(</td><td class=PParameter nowrap>func,</td></tr><tr><td></td><td class=PParameter nowrap>object</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote>Bind a function to an object. </div></div><!--END_ND_TOOLTIPS-->
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt2"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>checkCodeLoaded: function(</td><td class=PParameter nowrap>projName</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote>This is the loadCheck method to see if the projection code is loaded</div></div><div class=CToolTip id="tt3"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>checkDefsLoaded: function()</td></tr></table></blockquote>This is the loadCheck method to see if the def object exists</div></div><div class=CToolTip id="tt4"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>checkReadyState: function()</td></tr></table></blockquote>IE workaround since there is no onerror handler. </div></div><div class=CToolTip id="tt5"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>Class: function()</td></tr></table></blockquote>Base class used to construct all other classes. </div></div><!--END_ND_TOOLTIPS-->
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt6"><div class=CProperty>The datum specified for the projection</div></div><div class=CToolTip id="tt7"><div class=CProperty>The datum to use when no others a specified</div></div><div class=CToolTip id="tt8"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>defsFailed: function()</td></tr></table></blockquote>Report an error in loading the defs file, but continue on using WGS84</div></div><div class=CToolTip id="tt9"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>defsLoaded: function()</td></tr></table></blockquote>Continues the Proj object initilization once the def file is loaded</div></div><div class=CToolTip id="tt10"><div class=CProperty>AJAX service to retreive projection definition parameters from</div></div><div class=CToolTip id="tt11"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>deriveConstants: function()</td></tr></table></blockquote>Sets several derived constant values and initialization of datum and ellipse parameters.</div></div><!--END_ND_TOOLTIPS-->
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt12"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>extend: function(</td><td class=PParameter nowrap>destination,</td></tr><tr><td></td><td class=PParameter nowrap>source</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote>Copy all properties of a source object to a destination object. </div></div><!--END_ND_TOOLTIPS-->
+
+
+<!--START_ND_TOOLTIPS-->
+<!--END_ND_TOOLTIPS-->
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt13"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>getScriptLocation: function ()</td></tr></table></blockquote>Return the path to this script.</div></div><!--END_ND_TOOLTIPS-->
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt14"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>initialize: function(</td><td class=PParameter nowrap>srsCode</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote>Constructor for Proj4js.Proj objects</div></div><div class=CToolTip id="tt15"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>initTransforms: function()</td></tr></table></blockquote>Finalize the initialization of the Proj object</div></div><!--END_ND_TOOLTIPS-->
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt16"><div class=CProperty>internal: http server path to library code.</div></div><div class=CToolTip id="tt17"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>loadFromService: function()</td></tr></table></blockquote>Creates the REST URL for loading the definition from a web service and loads it.</div></div><div class=CToolTip id="tt18"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>loadProjCode: function(</td><td class=PParameter nowrap>projName</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote>Loads projection class code dynamically if required. </div></div><div class=CToolTip id="tt19"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>loadProjCodeSuccess: function(</td><td class=PParameter nowrap>projName</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote>Loads any proj dependencies or continue on to final initialization.</div></div><div class=CToolTip id="tt20"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>loadProjDefinition: function()</td></tr></table></blockquote>Loads the coordinate system initialization string if required. </div></div><div class=CToolTip id="tt21"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>loadScript: function(</td><td class=PParameter nowrap>url,</td></tr><tr><td></td><td class=PParameter nowrap>onload,</td></tr><tr><td></td><td class=PParameter nowrap>onfail,</td></tr><tr><td></td><td class=PParameter nowrap>loadCheck</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote>Load a JS file from a URL into a script tag in the page.</div></div><!--END_ND_TOOLTIPS-->
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt22"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>parseDefs: function()</td></tr></table></blockquote>Parses the PROJ.4 initialization string and sets the associated properties.</div></div><div class=CToolTip id="tt23"><div class=CSection>The following properties and methods are intended for internal use only.</div></div><div class=CToolTip id="tt24"><div class=CClass>Proj4js is a JavaScript library to transform point coordinates from one coordinate system to another, including datum transformations.</div></div><div class=CToolTip id="tt25"><div class=CClass>Proj objects provide transformation methods for point coordinates between geodetic latitude/longitude and a projected coordinate system. </div></div><div class=CToolTip id="tt26"><div class=CProperty>The projection class for this projection, e.g. </div></div><!--END_ND_TOOLTIPS-->
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt27"><div class=CProperty>Flag to indicate if initialization is complete for this Proj object</div></div><div class=CToolTip id="tt28"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>reportError: function(</td><td class=PParameter nowrap>msg</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote>An internal method to report errors back to user. </div></div><!--END_ND_TOOLTIPS-->
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt29"><div class=CProperty>The title to describe the projection</div></div><div class=CToolTip id="tt30"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>transform: function(</td><td class=PParameter nowrap>source,</td></tr><tr><td></td><td class=PParameter nowrap>dest,</td></tr><tr><td></td><td class=PParameter nowrap>point</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote>Transform a point coordinate from one map projection to another. </div></div><!--END_ND_TOOLTIPS-->
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt31"><div class=CProperty>The units of the projection. </div></div><!--END_ND_TOOLTIPS-->
+
+</td></tr></table><div class=Footer><!--START_ND_FOOTER-->Generated by <a href="http://www.naturaldocs.org">Natural Docs</a><!--END_ND_FOOTER--></div><script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
Added: trunk/mapbender/http/extensions/proj4js/docs/NaturalDocs/index/Properties.html
===================================================================
--- trunk/mapbender/http/extensions/proj4js/docs/NaturalDocs/index/Properties.html (rev 0)
+++ trunk/mapbender/http/extensions/proj4js/docs/NaturalDocs/index/Properties.html 2009-08-31 13:30:38 UTC (rev 4581)
@@ -0,0 +1,36 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>Property Index</title><link rel="stylesheet" type="text/css" href="../styles/main.css"><script language=JavaScript src="../javascript/main.js"></script></head><body class=UnframedPage onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!-- Generated by Natural Docs, version 1.35 -->
+<!-- http://www.naturaldocs.org -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+<table border=0 cellspacing=0 cellpadding=0 width=100%><tr><td class=MenuSection valign=top><!--START_ND_MENU--><div class=MEntry><div class=MFile><a href="../files/proj4js-js.html">Proj4js</a></div></div><div class=MEntry><div class=MFile><a href="../files/proj4js-combined-js.html">Proj4js</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">Index</a><div class=MGroupContent id=MGroupContent1><div class=MEntry><div class=MIndex><a href="General.html">Everything</a></div></div><div class=MEntry><div class=MIndex><a href="Classes.html">Classes</a></div></div><div class=MEntry><div class=MIndex><a href="Functions.html">Functions</a></div></div><div class=MEntry><div class=MIndex id=MSelected>Properties</div></div></div></div></div><!--END_ND_MENU--></td><td class=IndexSection valign=top><div class=IPageTitle>Property Index</div><div class=INavigationBar>$#! · 0-9 · A · B · C · <a href="#D">D</a> · E · F · G · H · I · J · K · <a href="#L">L</a> · M · N · O · <a href="#P">P</a> · Q · <a href="#R">R</a> · S · <a href="#T">T</a> · <a href="#U">U</a> · V · W · X · Y · Z</div><table border=0 cellspacing=0 cellpadding=0><tr><td class=IHeading id=IFirstHeading><a name="D"></a>D</td><td></td></tr><tr><td class=ISymbolPrefix id=IFirstSymbolPrefix> </td><td class=IEntry><span class=ISymbol>datum</span>, <span class=IParent>Proj4js.Proj</span><div class=ISubIndex><a href="../files/proj4js-combined-js.html#Proj4js.Proj.datum" id=link1 onMouseOver="ShowTip(event, 'tt1', 'link1')" onMouseOut="HideTip('tt1')" class=IFile>proj4js-combined.js</a><a href="../files/proj4js-js.html#Proj4js.Proj.datum" id=link2 onMouseOver="ShowTip(event, 'tt1', 'link2')" onMouseOut="HideTip('tt1')" class=IFile>proj4js.js</a></div></td></tr><tr><td class=ISymbolPrefix> </td><td class=IEntry><span class=ISymbol>defaultDatum</span>, <span class=IParent>Proj4js</span><div class=ISubIndex><a href="../files/proj4js-combined-js.html#Proj4js.defaultDatum" id=link3 onMouseOver="ShowTip(event, 'tt2', 'link3')" onMouseOut="HideTip('tt2')" class=IFile>proj4js-combined.js</a><a href="../files/proj4js-js.html#Proj4js.defaultDatum" id=link4 onMouseOver="ShowTip(event, 'tt2', 'link4')" onMouseOut="HideTip('tt2')" class=IFile>proj4js.js</a></div></td></tr><tr><td class=ISymbolPrefix id=ILastSymbolPrefix> </td><td class=IEntry><span class=ISymbol>defsLookupService</span><div class=ISubIndex><a href="../files/proj4js-combined-js.html#defsLookupService" id=link5 onMouseOver="ShowTip(event, 'tt3', 'link5')" onMouseOut="HideTip('tt3')" class=IFile>proj4js-combined.js</a><a href="../files/proj4js-js.html#defsLookupService" id=link6 onMouseOver="ShowTip(event, 'tt3', 'link6')" onMouseOut="HideTip('tt3')" class=IFile>proj4js.js</a></div></td></tr><tr><td class=IHeading><a name="L"></a>L</td><td></td></tr><tr><td class=ISymbolPrefix id=IOnlySymbolPrefix> </td><td class=IEntry><span class=ISymbol>libPath</span><div class=ISubIndex><a href="../files/proj4js-combined-js.html#libPath" id=link7 onMouseOver="ShowTip(event, 'tt4', 'link7')" onMouseOut="HideTip('tt4')" class=IFile>proj4js-combined.js</a><a href="../files/proj4js-js.html#libPath" id=link8 onMouseOver="ShowTip(event, 'tt4', 'link8')" onMouseOut="HideTip('tt4')" class=IFile>proj4js.js</a></div></td></tr><tr><td class=IHeading><a name="P"></a>P</td><td></td></tr><tr><td class=ISymbolPrefix id=IOnlySymbolPrefix> </td><td class=IEntry><span class=ISymbol>projName</span>, <span class=IParent>Proj4js.Proj</span><div class=ISubIndex><a href="../files/proj4js-combined-js.html#Proj4js.Proj.projName" id=link9 onMouseOver="ShowTip(event, 'tt5', 'link9')" onMouseOut="HideTip('tt5')" class=IFile>proj4js-combined.js</a><a href="../files/proj4js-js.html#Proj4js.Proj.projName" id=link10 onMouseOver="ShowTip(event, 'tt5', 'link10')" onMouseOut="HideTip('tt5')" class=IFile>proj4js.js</a></div></td></tr><tr><td class=IHeading><a name="R"></a>R</td><td></td></tr><tr><td class=ISymbolPrefix id=IOnlySymbolPrefix> </td><td class=IEntry><span class=ISymbol>readyToUse</span>, <span class=IParent>Proj4js.Proj</span><div class=ISubIndex><a href="../files/proj4js-combined-js.html#Proj4js.Proj.readyToUse" id=link11 onMouseOver="ShowTip(event, 'tt6', 'link11')" onMouseOut="HideTip('tt6')" class=IFile>proj4js-combined.js</a><a href="../files/proj4js-js.html#Proj4js.Proj.readyToUse" id=link12 onMouseOver="ShowTip(event, 'tt6', 'link12')" onMouseOut="HideTip('tt6')" class=IFile>proj4js.js</a></div></td></tr><tr><td class=IHeading><a name="T"></a>T</td><td></td></tr><tr><td class=ISymbolPrefix id=IOnlySymbolPrefix> </td><td class=IEntry><span class=ISymbol>title</span>, <span class=IParent>Proj4js.Proj</span><div class=ISubIndex><a href="../files/proj4js-combined-js.html#Proj4js.Proj.title" id=link13 onMouseOver="ShowTip(event, 'tt7', 'link13')" onMouseOut="HideTip('tt7')" class=IFile>proj4js-combined.js</a><a href="../files/proj4js-js.html#Proj4js.Proj.title" id=link14 onMouseOver="ShowTip(event, 'tt7', 'link14')" onMouseOut="HideTip('tt7')" class=IFile>proj4js.js</a></div></td></tr><tr><td class=IHeading><a name="U"></a>U</td><td></td></tr><tr><td class=ISymbolPrefix id=IOnlySymbolPrefix> </td><td class=IEntry><span class=ISymbol>units</span>, <span class=IParent>Proj4js.Proj</span><div class=ISubIndex><a href="../files/proj4js-combined-js.html#Proj4js.Proj.units" id=link15 onMouseOver="ShowTip(event, 'tt8', 'link15')" onMouseOut="HideTip('tt8')" class=IFile>proj4js-combined.js</a><a href="../files/proj4js-js.html#Proj4js.Proj.units" id=link16 onMouseOver="ShowTip(event, 'tt8', 'link16')" onMouseOut="HideTip('tt8')" class=IFile>proj4js.js</a></div></td></tr></table>
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CProperty>The datum specified for the projection</div></div><div class=CToolTip id="tt2"><div class=CProperty>The datum to use when no others a specified</div></div><div class=CToolTip id="tt3"><div class=CProperty>AJAX service to retreive projection definition parameters from</div></div><!--END_ND_TOOLTIPS-->
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt4"><div class=CProperty>internal: http server path to library code.</div></div><!--END_ND_TOOLTIPS-->
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt5"><div class=CProperty>The projection class for this projection, e.g. </div></div><!--END_ND_TOOLTIPS-->
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt6"><div class=CProperty>Flag to indicate if initialization is complete for this Proj object</div></div><!--END_ND_TOOLTIPS-->
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt7"><div class=CProperty>The title to describe the projection</div></div><!--END_ND_TOOLTIPS-->
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt8"><div class=CProperty>The units of the projection. </div></div><!--END_ND_TOOLTIPS-->
+
+</td></tr></table><div class=Footer><!--START_ND_FOOTER-->Generated by <a href="http://www.naturaldocs.org">Natural Docs</a><!--END_ND_FOOTER--></div><script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
Added: trunk/mapbender/http/extensions/proj4js/docs/NaturalDocs/index.html
===================================================================
--- trunk/mapbender/http/extensions/proj4js/docs/NaturalDocs/index.html (rev 0)
+++ trunk/mapbender/http/extensions/proj4js/docs/NaturalDocs/index.html 2009-08-31 13:30:38 UTC (rev 4581)
@@ -0,0 +1 @@
+<html><head><meta http-equiv="Refresh" CONTENT="0; URL=files/proj4js-js.html"></head></html>
\ No newline at end of file
Added: trunk/mapbender/http/extensions/proj4js/docs/NaturalDocs/javascript/main.js
===================================================================
--- trunk/mapbender/http/extensions/proj4js/docs/NaturalDocs/javascript/main.js (rev 0)
+++ trunk/mapbender/http/extensions/proj4js/docs/NaturalDocs/javascript/main.js 2009-08-31 13:30:38 UTC (rev 4581)
@@ -0,0 +1,276 @@
+// This file is part of Natural Docs, which is Copyright (C) 2003-2005 Greg Valure
+// Natural Docs is licensed under the GPL
+
+//
+// Browser Styles
+// ____________________________________________________________________________
+
+var agt=navigator.userAgent.toLowerCase();
+var browserType;
+var browserVer;
+
+if (agt.indexOf("opera") != -1)
+ {
+ browserType = "Opera";
+
+ if (agt.indexOf("opera 5") != -1 || agt.indexOf("opera/5") != -1)
+ { browserVer = "Opera5"; }
+ else if (agt.indexOf("opera 6") != -1 || agt.indexOf("opera/6") != -1)
+ { browserVer = "Opera6"; }
+ else if (agt.indexOf("opera 7") != -1 || agt.indexOf("opera/7") != -1)
+ { browserVer = "Opera7"; }
+ }
+
+else if (agt.indexOf("khtml") != -1 || agt.indexOf("konq") != -1 || agt.indexOf("safari") != -1)
+ {
+ browserType = "KHTML";
+ }
+
+else if (agt.indexOf("msie") != -1)
+ {
+ browserType = "IE";
+
+ if (agt.indexOf("msie 4") != -1)
+ { browserVer = "IE4"; }
+ else if (agt.indexOf("msie 5") != -1)
+ { browserVer = "IE5"; }
+ else if (agt.indexOf("msie 6") != -1)
+ { browserVer = "IE6"; }
+ }
+
+else if (agt.indexOf("gecko") != -1)
+ {
+ browserType = "Gecko";
+ }
+
+// Opera already taken care of.
+else if (agt.indexOf("mozilla") != -1 && agt.indexOf("compatible") == -1 && agt.indexOf("spoofer") == -1 &&
+ agt.indexOf("webtv") == -1 && agt.indexOf("hotjava") == -1)
+ {
+ browserType = "Netscape";
+
+ if (agt.indexOf("mozilla/4") != -1)
+ { browserVer = "Netscape4"; }
+ }
+
+
+//
+// Menu
+// ____________________________________________________________________________
+
+
+function ToggleMenu(id)
+ {
+ if (!window.document.getElementById)
+ { return; };
+
+ var display = window.document.getElementById(id).style.display;
+
+ if (display == "none")
+ { display = "block"; }
+ else
+ { display = "none"; }
+
+ window.document.getElementById(id).style.display = display;
+ }
+
+
+//
+// Tooltips
+// ____________________________________________________________________________
+
+
+var tooltipTimer = 0;
+
+function ShowTip(event, tooltipID, linkID)
+ {
+ if (tooltipTimer)
+ { clearTimeout(tooltipTimer); };
+
+ var docX = event.clientX + window.pageXOffset;
+ var docY = event.clientY + window.pageYOffset;
+
+ var showCommand = "ReallyShowTip('" + tooltipID + "', '" + linkID + "', " + docX + ", " + docY + ")";
+
+ // KHTML cant handle showing on a timer right now.
+
+ if (browserType != "KHTML")
+ { tooltipTimer = setTimeout(showCommand, 1000); }
+ else
+ { eval(showCommand); };
+ }
+
+function ReallyShowTip(tooltipID, linkID, docX, docY)
+ {
+ tooltipTimer = 0;
+
+ var tooltip;
+ var link;
+
+ if (document.getElementById)
+ {
+ tooltip = document.getElementById(tooltipID);
+ link = document.getElementById(linkID);
+ }
+ else if (document.all)
+ {
+ tooltip = eval("document.all['" + tooltipID + "']");
+ link = eval("document.all['" + linkID + "']");
+ }
+
+ if (tooltip)
+ {
+ var left = 0;
+ var top = 0;
+
+ // Not everything supports offsetTop/Left/Width, and some, like Konqueror and Opera 5, think they do but do it badly.
+
+ if (link && link.offsetWidth != null && browserType != "KHTML" && browserVer != "Opera5")
+ {
+ var item = link;
+ while (item != document.body)
+ {
+ left += item.offsetLeft;
+ item = item.offsetParent;
+ }
+
+ item = link;
+ while (item != document.body)
+ {
+ top += item.offsetTop;
+ item = item.offsetParent;
+ }
+ top += link.offsetHeight;
+ }
+
+ // The fallback method is to use the mouse X and Y relative to the document. We use a separate if and test if its a number
+ // in case some browser snuck through the above if statement but didn't support everything.
+
+ if (!isFinite(top) || top == 0)
+ {
+ left = docX;
+ top = docY;
+ }
+
+ // Some spacing to get it out from under the cursor.
+
+ top += 10;
+
+ // Make sure the tooltip doesnt get smushed by being too close to the edge, or in some browsers, go off the edge of the
+ // page. We do it here because Konqueror does get offsetWidth right even if it doesnt get the positioning right.
+
+ if (tooltip.offsetWidth != null)
+ {
+ var width = tooltip.offsetWidth;
+ var docWidth = document.body.clientWidth;
+
+ if (left + width > docWidth)
+ { left = docWidth - width - 1; }
+ }
+
+ // Opera 5 chokes on the px extension, so it can use the Microsoft one instead.
+
+ if (tooltip.style.left != null && browserVer != "Opera5")
+ {
+ tooltip.style.left = left + "px";
+ tooltip.style.top = top + "px";
+ }
+ else if (tooltip.style.pixelLeft != null)
+ {
+ tooltip.style.pixelLeft = left;
+ tooltip.style.pixelTop = top;
+ }
+
+ tooltip.style.visibility = "visible";
+ }
+ }
+
+function HideTip(tooltipID)
+ {
+ if (tooltipTimer)
+ {
+ clearTimeout(tooltipTimer);
+ tooltipTimer = 0;
+ }
+
+ var tooltip;
+
+ if (document.getElementById)
+ { tooltip = document.getElementById(tooltipID); }
+ else if (document.all)
+ { tooltip = eval("document.all['" + tooltipID + "']"); }
+
+ if (tooltip)
+ { tooltip.style.visibility = "hidden"; }
+ }
+
+
+//
+// Event Handlers
+// ____________________________________________________________________________
+
+
+function NDOnLoad()
+ {
+ if (browserType == "IE")
+ {
+ var scrollboxes = document.getElementsByTagName('blockquote');
+
+ if (scrollboxes.item(0))
+ {
+ var width = scrollboxes.item(0).parentNode.offsetWidth - scrollboxes.item(0).offsetLeft;
+
+ var i = 0;
+ var item;
+
+ while (item = scrollboxes.item(i))
+ {
+ item.style.width = width;
+ i++;
+ };
+
+ window.onresize=NDOnResize;
+ };
+ };
+ }
+
+
+var resizeTimer = 0;
+
+function NDOnResize()
+ {
+ if (browserType == "IE")
+ {
+ if (resizeTimer != 0)
+ { clearTimeout(resizeTimer); };
+
+ resizeTimer = setTimeout(NDDoResize, 500);
+ };
+ };
+
+function NDDoResize()
+ {
+ var scrollboxes = document.getElementsByTagName('blockquote');
+
+ var i;
+ var item;
+
+ i = 0;
+ while (item = scrollboxes.item(i))
+ {
+ item.style.width = "100px";
+ i++;
+ };
+
+ var width = scrollboxes.item(0).parentNode.offsetWidth - scrollboxes.item(0).offsetLeft;
+
+ i = 0;
+ while (item = scrollboxes.item(i))
+ {
+ item.style.width = width;
+ i++;
+ };
+
+ clearTimeout(resizeTimer);
+ resizeTimer = 0;
+ }
Added: trunk/mapbender/http/extensions/proj4js/docs/NaturalDocs/styles/main.css
===================================================================
--- trunk/mapbender/http/extensions/proj4js/docs/NaturalDocs/styles/main.css (rev 0)
+++ trunk/mapbender/http/extensions/proj4js/docs/NaturalDocs/styles/main.css 2009-08-31 13:30:38 UTC (rev 4581)
@@ -0,0 +1,540 @@
+/*
+ IMPORTANT: If you're editing this file in the output directory of one of
+ your projects, your changes will be overwritten the next time you run
+ Natural Docs. Instead, copy this file to your project directory, make your
+ changes, and you can use it with -s. Even better would be to make a CSS
+ file in your project directory with only your changes, which you can then
+ use with -s [original style] [your changes].
+
+ On the other hand, if you're editing this file in the Natural Docs styles
+ directory, the changes will automatically be applied to all your projects
+ that use this style the next time Natural Docs is run on them.
+
+ This file is part of Natural Docs, which is Copyright (C) 2003-2005 Greg Valure
+ Natural Docs is licensed under the GPL
+*/
+
+body {
+ font-family: Verdana, Arial, sans-serif;
+ color: #000000;
+ margin: 0px; padding: 0px }
+
+body.UnframedPage {
+ background-color: #E8E8E8 }
+
+
+a:link,
+a:visited { color: #900000; text-decoration: none }
+a:hover { color: #900000; text-decoration: underline }
+a:active { color: #FF0000; text-decoration: underline }
+
+td {
+ vertical-align: top }
+
+/*
+ Comment out this line to use web-style paragraphs (blank line between
+ paragraphs, no indent) instead of print-style paragraphs (no blank line,
+ indented.)
+*/
+p {
+ text-indent: 5ex; margin: 0 }
+
+
+/* Can't use something like display: none or it won't break. */
+.HB {
+ font-size: 1px;
+ visibility: hidden;
+ }
+
+/* Blockquotes are used as containers for things that may need to scroll. */
+blockquote {
+ padding: 0;
+ margin: 0;
+ overflow: auto;
+ }
+/* This will be fixed in JavaScript. We just need a default if it's turned off. */
+.IE blockquote {
+ width: 400px; }
+
+.Gecko blockquote {
+ padding-bottom: .5em;
+ }
+
+/* Turn off scrolling when printing. */
+ at media print {
+ blockquote {
+ overflow: visible;
+ }
+ .IE blockquote {
+ width: auto;
+ }
+ }
+
+
+
+body.FramedMenuPage,
+.MenuSection {
+ font-size: 9pt;
+ background-color: #E8E8E8;
+ padding: 10px 0 0 0 }
+
+.MenuSection {
+ width: 27ex }
+
+
+ .MTitle {
+ font-size: 16pt; font-weight: bold; font-variant: small-caps;
+ text-align: center;
+ padding: 5px 10px 15px 10px;
+ border-bottom: 1px dotted #000000;
+ margin-bottom: 15px }
+
+ .MSubTitle {
+ font-size: 9pt; font-weight: normal; font-variant: normal;
+ margin-top: 1ex; margin-bottom: 5px }
+
+
+ .MEntry a:link,
+ .MEntry a:hover,
+ .MEntry a:visited { color: #606060; margin-right: 0 }
+ .MEntry a:active { color: #A00000; margin-right: 0 }
+
+
+ .MGroup {
+ font-variant: small-caps; font-weight: bold;
+ margin: 1em 0 1em 10px }
+
+ /* Konqueror just can't do margins. */
+ .KHTML .MGroup {
+ margin-bottom: 0; padding-bottom: 1em }
+
+ .MGroupContent {
+ font-variant: normal; font-weight: normal }
+
+ .MGroup a:link,
+ .MGroup a:hover,
+ .MGroup a:visited { color: #545454; margin-right: 10px }
+ .MGroup a:active { color: #A00000; margin-right: 10px }
+
+
+ .MFile,
+ .MText,
+ .MLink,
+ .MIndex {
+ padding: 1px 17px 2px 10px;
+ margin: .25em 0 .25em 0 }
+
+ .MText {
+ font-size: 8pt; font-style: italic }
+
+ .MLink {
+ font-style: italic }
+
+ #MSelected {
+ color: #000000; background-color: #FFFFFF;
+ /* Replace padding with border. */
+ padding: 0 10px 0 10px;
+ border-width: 1px 2px 2px 0; border-style: solid; border-color: #000000;
+ margin-right: 5px }
+
+ /* Close off the left side when its in a group. */
+ .MGroup #MSelected {
+ padding-left: 9px; border-left-width: 1px }
+
+ /* A treat for Mozilla users. Blatantly non-standard. Will be replaced with CSS 3 attributes when finalized/supported. */
+ .Gecko #MSelected {
+ -moz-border-radius-topright: 10px;
+ -moz-border-radius-bottomright: 10px }
+ .Gecko .MGroup #MSelected {
+ -moz-border-radius-topleft: 10px;
+ -moz-border-radius-bottomleft: 10px }
+
+
+
+
+body.FramedContentPage,
+.ContentSection {
+ background-color: #FFFFFF;
+ padding-bottom: 15px }
+
+.ContentSection {
+ border-width: 0 0 1px 1px; border-style: solid; border-color: #000000 }
+
+
+ .CTopic {
+ font-size: 10pt;
+ /* This should be a margin but Konq 3.1.1 sucks. */
+ padding-bottom: 3em }
+
+
+ .CTitle {
+ font-size: 12pt; font-weight: bold;
+ border-width: 0 0 1px 0; border-style: solid; border-color: #A0A0A0;
+ margin: 0 15px .5em 15px }
+
+ .CGroup .CTitle {
+ font-size: 16pt; font-variant: small-caps;
+ padding-left: 15px; padding-right: 15px;
+ border-width: 0 0 2px 0; border-color: #000000;
+ margin-left: 0; margin-right: 0 }
+
+ .CClass .CTitle,
+ .CInterface .CTitle,
+ .CDatabase .CTitle,
+ .CDatabaseTable .CTitle,
+ .CSection .CTitle {
+ font-size: 18pt;
+ color: #FFFFFF; background-color: #A0A0A0;
+ padding: 10px 15px 10px 15px;
+ border-width: 2px 0; border-color: #000000;
+ margin-left: 0; margin-right: 0 }
+
+ #MainTopic .CTitle {
+ font-size: 20pt;
+ color: #FFFFFF; background-color: #7070C0;
+ padding: 10px 15px 10px 15px;
+ border-width: 0 0 3px 0; border-color: #000000;
+ margin-left: 0; margin-right: 0 }
+
+ .CBody {
+ margin-left: 15px; margin-right: 15px }
+
+
+ .CToolTip {
+ position: absolute; visibility: hidden;
+ left: 0; top: 0; max-width: 50%;
+ background-color: #FFFFE0;
+ padding: 5px;
+ border-width: 1px 2px 2px 1px; border-style: solid; border-color: #000000;
+ font-size: 8pt }
+
+ /* Opera 6 gives it a huge height otherwise. */
+ .Opera6 .CTooltip, .Opera5 .CTooltip {
+ max-width: 100% }
+
+ /* Scrollbars would be useless. */
+ .CToolTip blockquote {
+ overflow: hidden;
+ }
+
+ .CHeading {
+ font-weight: bold; font-size: 10pt;
+ margin-top: 1.5em; margin-bottom: .5em }
+
+ .CCode {
+ font: 10pt "Courier New", Courier, monospace;
+ }
+
+ .CBulletList {
+ /* I don't know why CBody's margin doesn't apply, but it's consistent across browsers so whatever.
+ Reapply it here as padding. */
+ padding-left: 15px; padding-right: 15px;
+ margin: .5em 5ex .5em 5ex;
+ }
+
+ .CDescriptionList {
+ margin: .5em 5ex 0 5ex }
+
+ /* IE 4 and Konqueror always makes it too long. */
+ .IE4 .CDescriptionList,
+ .KHTML .CDescriptionList {
+ width: 85% }
+
+ .CDLEntry {
+ font: 10pt "Courier New", Courier, monospace; color: #808080;
+ padding-bottom: .25em;
+ white-space: nowrap }
+
+ .CDLDescription {
+ font-size: 10pt; /* For browsers that don't inherit correctly, like Opera 5. */
+ padding-bottom: .5em; padding-left: 5ex }
+
+
+
+
+.Prototype {
+ font: 10pt "Courier New", Courier, monospace;
+ padding: 5px 3ex;
+ border-width: 1px; border-style: solid;
+ margin: 0 5ex 1.5em 5ex;
+ }
+
+ .Prototype td {
+ font-size: 10pt;
+ }
+
+ .PDefaultValue,
+ .PDefaultValuePrefix,
+ .PTypePrefix {
+ color: #8F8F8F;
+ }
+ .PTypePrefix {
+ text-align: right;
+ }
+ .PAfterParameters {
+ vertical-align: bottom;
+ }
+
+ .IE .Prototype table {
+ padding: 0;
+ }
+
+ .CFunction .Prototype {
+ background-color: #F4F4F4; border-color: #D0D0D0 }
+ .CProperty .Prototype {
+ background-color: #F4F4FF; border-color: #C0C0E8 }
+ .CVariable .Prototype {
+ background-color: #FFFFF0; border-color: #E0E0A0 }
+
+ .CDatabaseIndex .Prototype,
+ .CConstant .Prototype {
+ background-color: #D0D0D0; border-color: #000000 }
+ .CType .Prototype {
+ background-color: #FFF8F8; border-color: #E8C8C8 }
+ .CDatabaseTrigger .Prototype,
+ .CEvent .Prototype,
+ .CDelegate .Prototype {
+ background-color: #F0FCF0; border-color: #B8E4B8 }
+
+ .CToolTip .Prototype {
+ margin: 0 0 .5em 0;
+ white-space: nowrap;
+ }
+
+
+
+
+
+.Summary {
+ margin: 1.5em 5ex 0 5ex }
+
+ .STitle {
+ font-size: 12pt; font-weight: bold;
+ margin-bottom: .5em }
+
+
+ .SBorder {
+ background-color: #FFFFF0;
+ padding: 15px;
+ border: 1px solid #C0C060 }
+
+ /* Let's observe the evolution of IE's brokeness, shall we?
+ IE 4 always makes them too long, there's no way around it. */
+ .IE4 .SBorder {
+ width: 85% }
+ /* IE 5 will make them too long unless you set the width to 100%. Isn't this implied for a div? */
+ .IE5 .SBorder {
+ width: 100% }
+ /* IE 6 behaves like 5 when it's in a frame, but without frames it will be correct without a width or slightly too long
+ (but not enough to scroll) with a width. This arbitrary weirdness simply astounds me. */
+ body.FramedContentPage .IE6 .SBorder {
+ width: 100% }
+
+ /* A treat for Mozilla users. Blatantly non-standard. Will be replaced with CSS 3 attributes when finalized/supported. */
+ .Gecko .SBorder {
+ -moz-border-radius: 20px }
+
+
+ .STable {
+ font-size: 9pt; width: 100% }
+
+ .SEntrySize {
+ width: 30% }
+ .SDescriptionSize {
+ width: 70% }
+
+
+ .SMarked {
+ background-color: #F8F8D8 }
+
+
+ .SEntry .SIndent1 {
+ margin-left: 1.5ex }
+ .SEntry .SIndent2 {
+ margin-left: 3ex }
+ .SEntry .SIndent3 {
+ margin-left: 4.5ex }
+ .SEntry .SIndent4 {
+ margin-left: 6ex }
+ .SEntry .SIndent5 {
+ margin-left: 7.5ex }
+
+ .SDescription {
+ padding-left: 3ex }
+
+ .SDescription a { color: #800000}
+ .SDescription a:active { color: #A00000 }
+
+
+ .SGroup {
+ margin-top: .5em; margin-bottom: .25em }
+
+ .SGroup .SEntry {
+ font-weight: bold; font-variant: small-caps }
+
+ .SGroup .SEntry a { color: #800000 }
+ .SGroup .SEntry a:active { color: #F00000 }
+
+
+ .SMain .SEntry,
+ .SClass .SEntry,
+ .SDatabase .SEntry,
+ .SDatabaseTable .SEntry,
+ .SSection .SEntry {
+ font-weight: bold; font-size: 10pt;
+ margin-bottom: .25em }
+
+ .SClass,
+ .SDatabase,
+ .SDatabaseTable,
+ .SSection {
+ margin-top: 1em }
+
+ .SMain .SEntry a,
+ .SClass .SEntry a,
+ .SDatabase .SEntry a,
+ .SDatabaseTable .SEntry a,
+ .SSection .SEntry a { color: #000000 }
+
+ .SMain .SEntry a:active,
+ .SClass .SEntry a:active,
+ .SDatabase .SEntry a:active,
+ .SDatabaseTable .SEntry a:active,
+ .SSection .SEntry a:active { color: #A00000 }
+
+
+
+
+
+.ClassHierarchy {
+ margin: 0 15px 1em 15px }
+
+ .CHEntry {
+ border-width: 1px 2px 2px 1px; border-style: solid; border-color: #A0A0A0;
+ margin-bottom: 3px;
+ padding: 2px 2ex;
+ font-size: 10pt;
+ background-color: #F4F4F4; color: #606060;
+ }
+
+ .Gecko .CHEntry {
+ -moz-border-radius: 4px;
+ }
+
+ .CHCurrent .CHEntry {
+ font-weight: bold;
+ border-color: #000000;
+ color: #000000;
+ }
+
+ .CHChildNote .CHEntry {
+ font-style: italic;
+ font-size: 8pt;
+ }
+
+ .CHIndent {
+ margin-left: 3ex;
+ }
+
+ .CHEntry a:link,
+ .CHEntry a:visited,
+ .CHEntry a:hover {
+ color: #606060;
+ }
+ .CHEntry a:active {
+ color: #800000;
+ }
+
+
+
+
+
+body.FramedIndexPage,
+.IndexSection {
+ background-color: #FFFFFF;
+ font-size: 10pt;
+ padding: 15px }
+
+.IndexSection {
+ border-width: 0 0 1px 1px; border-style: solid; border-color: #000000 }
+
+ .IPageTitle {
+ font-size: 20pt; font-weight: bold;
+ color: #FFFFFF; background-color: #7070C0;
+ padding: 10px 15px 10px 15px;
+ border-width: 0 0 3px 0; border-color: #000000; border-style: solid;
+ margin: -15px -15px 0 -15px }
+
+ .INavigationBar {
+ text-align: center;
+ background-color: #FFFFF0;
+ padding: 5px;
+ border-bottom: solid 1px black;
+ margin: 0 -15px 15px -15px }
+
+ .INavigationBar a {
+ font-weight: bold }
+
+ .IHeading {
+ font-size: 16pt; font-weight: bold;
+ padding: 2.5em 0 .5em 0;
+ text-align: center;
+ width: 3.5ex;
+ }
+ #IFirstHeading {
+ padding-top: 0;
+ }
+
+ .IEntry {
+ padding-left: 1ex; }
+
+ .ISubIndex {
+ padding-left: 3ex; padding-bottom: .5em }
+
+ /* While it may cause some entries to look like links when they aren't, I found it's much easier to read the
+ index if everything's the same color. */
+ .ISymbol {
+ font-weight: bold; color: #900000 }
+
+ .ISymbolPrefix {
+ text-align: right;
+ color: #C47C7C;
+ background-color: #F8F8F8;
+ border-right: 3px solid #E0E0E0;
+ border-left: 1px solid #E0E0E0;
+ padding: 0 1px 0 2px;
+ }
+ #IFirstSymbolPrefix {
+ border-top: 1px solid #E0E0E0;
+ }
+ #ILastSymbolPrefix {
+ border-bottom: 1px solid #E0E0E0;
+ }
+ #IOnlySymbolPrefix {
+ border-top: 1px solid #E0E0E0;
+ border-bottom: 1px solid #E0E0E0;
+ }
+
+ a.IParent,
+ a.IFile {
+ display: block;
+ }
+
+
+
+
+.Footer {
+ font-size: 8pt; color: #909090 }
+
+body.UnframedPage .Footer {
+ text-align: right;
+ margin: 2px }
+
+body.FramedMenuPage .Footer {
+ text-align: center;
+ margin: 5em 10px 0 10px}
+
+ .Footer a:link,
+ .Footer a:hover,
+ .Footer a:visited { color: #909090 }
+ .Footer a:active { color: #A00000 }
Added: trunk/mapbender/http/extensions/proj4js/index.html
===================================================================
--- trunk/mapbender/http/extensions/proj4js/index.html (rev 0)
+++ trunk/mapbender/http/extensions/proj4js/index.html 2009-08-31 13:30:38 UTC (rev 4581)
@@ -0,0 +1,172 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
+<head>
+ <title>Proj4js</title>
+
+ <style type="text/css">
+ @import url(test/base.css);
+
+ #descSource, #descDest {
+ font-style: italic;
+ color: #999;
+ }
+
+ #xySource, #xyDest {
+ width: 100%;
+ }
+
+ </style>
+
+ <script src="lib/proj4js.js"></script>
+
+ <script src="lib/defs/EPSG27200.js"></script>
+ <script src="lib/defs/EPSG4272.js"></script>
+ <script src="lib/defs/EPSG54009.js"></script>
+ <script src="lib/defs/EPSG42304.js"></script>
+ <script src="lib/defs/EPSG25833.js"></script>
+ <script src="lib/defs/EPSG27563.js"></script>
+ <script src="lib/defs/EPSG4139.js"></script>
+ <script src="lib/defs/EPSG4302.js"></script>
+ <script src="lib/defs/EPSG31285.js"></script>
+ <script src="lib/defs/EPSG900913.js"></script>
+
+ <script type="text/javascript">
+
+ var projHash = {};
+ function initProj4js() {
+ var crsSource = document.getElementById('crsSource');
+ var crsDest = document.getElementById('crsDest');
+ var optIndex = 0;
+ for (var def in Proj4js.defs) {
+ projHash[def] = new Proj4js.Proj(def); //create a Proj for each definition
+ var label = def+" - "+ (projHash[def].title ? projHash[def].title : '');
+ var opt = new Option(label, def);
+ crsSource.options[optIndex]= opt;
+ var opt = new Option(label, def);
+ crsDest.options[optIndex]= opt;
+ ++optIndex;
+ } // for
+ updateCrs('Source');
+ updateCrs('Dest');
+ }
+
+ function updateCrs(id) {
+ var crs = document.getElementById('crs'+id);
+ if (crs.value) {
+ var proj = projHash[crs.value];
+ var str = 'projection: ' + proj.projName + ' - datum: ' + proj.datumName;
+ var desc = document.getElementById('desc'+id);
+ desc.innerHTML = str;
+ var units = document.getElementById('units'+id);
+ units.innerHTML = proj.units;
+ }
+ }
+
+ function transform() {
+ var crsSource = document.getElementById('crsSource');
+ var projSource = null;
+ if (crsSource.value) {
+ projSource = projHash[crsSource.value];
+ } else {
+ alert("Select a source coordinate system");
+ return;
+ }
+ var crsDest = document.getElementById('crsDest');
+ var projDest = null;
+ if (crsDest.value) {
+ projDest = projHash[crsDest.value];
+ } else {
+ alert("Select a destination coordinate system");
+ return;
+ }
+ var pointInput = document.getElementById('xySource');
+ if (pointInput.value) {
+ var pointSource = new Proj4js.Point(pointInput.value);
+ var pointDest = Proj4js.transform(projSource, projDest, pointSource);
+ document.getElementById('xyDest').value = pointDest.toShortString();
+ } else {
+ alert("Enter source coordinates");
+ return;
+ }
+ }
+
+ </script>
+</head>
+
+<body onload="initProj4js()">
+ <div id="header">
+ <h1>Proj4js Home Page</h1>
+ </div>
+ <div id="navbar">
+ <a href="http://trac.osgeo.org/proj4js">Proj4js Wiki/Trac</a> |
+ <a href="http://wiki.osgeo.org/wiki/MetaCRS">OSGeo MetaCRS</a> |
+ <a href="http://spatialreference.org/">spatialreference.org</a> |
+ <a href="http://communitymapbuilder.org/">MapBuilder</a> |
+ <a href="http://openlayers.org/">OpenLayers</a> |
+ </div>
+ <h1>Welcome to Proj4js</h1>
+ <p>
+This is a JavaScript library that provides methods for coordinate
+transformations between map projections and longitude/latitude,
+including datum transformations, in a web client.
+ </p>
+
+ <p>
+To use the Proj4js, you first create a source and destination Proj4js.Proj
+objects, passing in a projection code (e.g. EPSG:4326).
+You can then use the Proj4js.transform() method, passing in map XY as a point
+object and the source and destination projection objects,
+and it returns the point coordinate in the destination projection.
+ </p>
+ <form>
+ <table>
+ <tbody>
+ <tr>
+ <th colspan="3">source</th>
+ <th></th>
+ <th colspan="3">dest</th>
+ </tr>
+ <tr>
+ <td>CRS:</td>
+ <td colspan="2">
+ <select name="crsSource" id="crsSource" onchange="updateCrs('Source')">
+ <option value selected="selected">Select a CRS</option>
+ </select>
+ </td>
+ <td></td>
+ <td>CRS:</td>
+ <td colspan="2">
+ <select name="crsDest" id="crsDest" onchange="updateCrs('Dest')">
+ <option value selected="selected">Select a CRS</option>
+ </select>
+ </td>
+ </tr>
+ <tr>
+ <td></td>
+ <td colspan="2" id="descSource">Projection - datum</td>
+ <td></td>
+ <td></td>
+ <td colspan="2" id="descDest">Projection - datum</td>
+ </tr>
+ <tr>
+ <td>x,y</td>
+ <td><input name="xySource" id="xySource" type="text"/></td>
+ <td id="unitsSource">units</td>
+ <td><input type="button" value="--> transform -->" onclick="transform();"/></td>
+ <td>x,y</td>
+ <td><input name="xyDest" id="xyDest" type="text"></td>
+ <td id="unitsDest">units</td>
+ </tr>
+ <tr>
+ <td colspan="7" align="center"><input type="reset" value="reset"/></td>
+ </tr>
+ </tbody>
+ </table>
+ </form>
+ <p>
+For more information on Proj4js and to report bugs, please visit the
+<a href="http://trac.osgeo.org/proj4js">Proj4js Trac and Wiki</a> at OSGeo.
+ </p>
+
+</body>
+</html>
\ No newline at end of file
Added: trunk/mapbender/http/extensions/proj4js/lib/defs/EPSG102757.js
===================================================================
--- trunk/mapbender/http/extensions/proj4js/lib/defs/EPSG102757.js (rev 0)
+++ trunk/mapbender/http/extensions/proj4js/lib/defs/EPSG102757.js 2009-08-31 13:30:38 UTC (rev 4581)
@@ -0,0 +1 @@
+Proj4js.defs["EPSG:102757"] = "+title=NAD 1983 StatePlane Wyoming West Central FIPS 4903 Feet +proj=tmerc +lat_0=40.5 +lon_0=-108.75 +x_0=600000.0 +y_0=0 +k=0.999938 +a=6378137.0 +b=6356752.3141403 +to_meter=0.3048006096012192";
Added: trunk/mapbender/http/extensions/proj4js/lib/defs/EPSG102758.js
===================================================================
--- trunk/mapbender/http/extensions/proj4js/lib/defs/EPSG102758.js (rev 0)
+++ trunk/mapbender/http/extensions/proj4js/lib/defs/EPSG102758.js 2009-08-31 13:30:38 UTC (rev 4581)
@@ -0,0 +1 @@
+Proj4js.defs["EPSG:102758"] = "+title=NAD 1983 StatePlane Wyoming West FIPS 4904 Feet +proj=tmerc +lat_0=40.5 +lon_0=-110.0833333333333 +x_0=800000 +y_0=100000 +k=0.999938 +a=6378137.0 +b=6356752.3141403 +to_meter=0.3048006096012192";
Added: trunk/mapbender/http/extensions/proj4js/lib/defs/EPSG21781.js
===================================================================
--- trunk/mapbender/http/extensions/proj4js/lib/defs/EPSG21781.js (rev 0)
+++ trunk/mapbender/http/extensions/proj4js/lib/defs/EPSG21781.js 2009-08-31 13:30:38 UTC (rev 4581)
@@ -0,0 +1 @@
+Proj4js.defs["EPSG:21781"] = "+title=CH1903 / LV03 +proj=somerc +lat_0=46.95240555555556 +lon_0=7.439583333333333 +x_0=600000 +y_0=200000 +ellps=bessel +towgs84=674.374,15.056,405.346,0,0,0,0 +units=m +no_defs";
Added: trunk/mapbender/http/extensions/proj4js/lib/defs/EPSG26591.js
===================================================================
--- trunk/mapbender/http/extensions/proj4js/lib/defs/EPSG26591.js (rev 0)
+++ trunk/mapbender/http/extensions/proj4js/lib/defs/EPSG26591.js 2009-08-31 13:30:38 UTC (rev 4581)
@@ -0,0 +1 @@
+Proj4js.defs["EPSG:26591"] = "+title= Monte Mario (Rome) / Italy zone 1 EPSG:26591 +proj=tmerc +lat_0=0 +lon_0=-3.45233333333333 +from_greenwich=12.45233333333333 +k=0.999600 +x_0=1500000 +y_0=0 +a=6378388.0, +b=6356911.94612795 +units=m";
Added: trunk/mapbender/http/extensions/proj4js/lib/defs/EPSG26912.js
===================================================================
--- trunk/mapbender/http/extensions/proj4js/lib/defs/EPSG26912.js (rev 0)
+++ trunk/mapbender/http/extensions/proj4js/lib/defs/EPSG26912.js 2009-08-31 13:30:38 UTC (rev 4581)
@@ -0,0 +1 @@
+Proj4js.defs["EPSG26912"] = "+title=NAD83 / UTM zone 12N +proj=utm +zone=12 +a=6378137.0 +b=6356752.3141403";
Added: trunk/mapbender/http/extensions/proj4js/lib/defs/EPSG27200.js
===================================================================
--- trunk/mapbender/http/extensions/proj4js/lib/defs/EPSG27200.js (rev 0)
+++ trunk/mapbender/http/extensions/proj4js/lib/defs/EPSG27200.js 2009-08-31 13:30:38 UTC (rev 4581)
@@ -0,0 +1,5 @@
+Proj4js.defs["EPSG:27200"] = "+title=New Zealand Map Grid\
+ +proj=nzmg \
+ +lat_0=-41 +lon_0=173 \
+ +x_0=2510000 +y_0=6023150 \
+ +ellps=intl +datum=nzgd49 +units=m +no_defs"
Added: trunk/mapbender/http/extensions/proj4js/lib/defs/EPSG27563.js
===================================================================
--- trunk/mapbender/http/extensions/proj4js/lib/defs/EPSG27563.js (rev 0)
+++ trunk/mapbender/http/extensions/proj4js/lib/defs/EPSG27563.js 2009-08-31 13:30:38 UTC (rev 4581)
@@ -0,0 +1 @@
+Proj4js.defs["EPSG:27563"]="+title=NTF (Paris)/Lambert Sud France +proj=lcc +lat_1=44.10000000000001 +lat_0=44.10000000000001 +lon_0=0 +k_0=0.9998774990000001 +x_0=600000 +y_0=200000 +a=6378249.2 +b=6356515 +towgs84=-168,-60,320,0,0,0,0 +pm=paris +units=m +no_defs ";
Added: trunk/mapbender/http/extensions/proj4js/lib/defs/EPSG41001.js
===================================================================
--- trunk/mapbender/http/extensions/proj4js/lib/defs/EPSG41001.js (rev 0)
+++ trunk/mapbender/http/extensions/proj4js/lib/defs/EPSG41001.js 2009-08-31 13:30:38 UTC (rev 4581)
@@ -0,0 +1 @@
+Proj4js.defs["EPSG:41001"] = "+title=simple mercator EPSG:41001 +proj=merc +lat_ts=0 +lon_0=0 +k=1.000000 +x_0=0 +y_0=0 +ellps=WGS84 +datum=WGS84 +units=m";
Added: trunk/mapbender/http/extensions/proj4js/lib/defs/EPSG4139.js
===================================================================
--- trunk/mapbender/http/extensions/proj4js/lib/defs/EPSG4139.js (rev 0)
+++ trunk/mapbender/http/extensions/proj4js/lib/defs/EPSG4139.js 2009-08-31 13:30:38 UTC (rev 4581)
@@ -0,0 +1 @@
+Proj4js.defs["EPSG:4139"] = "+title=Puerto Rico EPSG:4139 (3 param datum shift) +proj=longlat +towgs84 = 11,72,-101,0,0,0,0 +a=6378206.4 +b=6356583.8";
Added: trunk/mapbender/http/extensions/proj4js/lib/defs/EPSG4181.js
===================================================================
--- trunk/mapbender/http/extensions/proj4js/lib/defs/EPSG4181.js (rev 0)
+++ trunk/mapbender/http/extensions/proj4js/lib/defs/EPSG4181.js 2009-08-31 13:30:38 UTC (rev 4581)
@@ -0,0 +1 @@
+Proj4js.defs["EPSG:4181"] = "+title=Luxembourg 1930 EPSG:4181 (7 param datum shift) +proj=longlat +towgs84=-193,13.7,-39.3,-0.41,-2.933,2.688,0.43 +a=6378388.0, +b=6356911.94612795";
Added: trunk/mapbender/http/extensions/proj4js/lib/defs/EPSG42304.js
===================================================================
--- trunk/mapbender/http/extensions/proj4js/lib/defs/EPSG42304.js (rev 0)
+++ trunk/mapbender/http/extensions/proj4js/lib/defs/EPSG42304.js 2009-08-31 13:30:38 UTC (rev 4581)
@@ -0,0 +1 @@
+Proj4js.defs["EPSG:42304"]="+title=Atlas of Canada, LCC +proj=lcc +lat_1=49 +lat_2=77 +lat_0=49 +lon_0=-95 +x_0=0 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m +no_defs";
\ No newline at end of file
Added: trunk/mapbender/http/extensions/proj4js/lib/defs/EPSG4272.js
===================================================================
--- trunk/mapbender/http/extensions/proj4js/lib/defs/EPSG4272.js (rev 0)
+++ trunk/mapbender/http/extensions/proj4js/lib/defs/EPSG4272.js 2009-08-31 13:30:38 UTC (rev 4581)
@@ -0,0 +1 @@
+Proj4js.defs["EPSG:4272"] = "+title=NZGD49 +proj=longlat +ellps=intl +datum=nzgd49 +no_defs ";
Added: trunk/mapbender/http/extensions/proj4js/lib/defs/EPSG4302.js
===================================================================
--- trunk/mapbender/http/extensions/proj4js/lib/defs/EPSG4302.js (rev 0)
+++ trunk/mapbender/http/extensions/proj4js/lib/defs/EPSG4302.js 2009-08-31 13:30:38 UTC (rev 4581)
@@ -0,0 +1,2 @@
+Proj4js.defs["EPSG:4302"] = "+title=Trinidad 1903 EPSG:4302 (7 param datum shift) +proj=longlat +a=6378293.63683822 +b=6356617.979337744 +towgs84=-61.702,284.488,472.052,0,0,0,0";
+
Added: trunk/mapbender/http/extensions/proj4js/lib/defs/EPSG900913.js
===================================================================
--- trunk/mapbender/http/extensions/proj4js/lib/defs/EPSG900913.js (rev 0)
+++ trunk/mapbender/http/extensions/proj4js/lib/defs/EPSG900913.js 2009-08-31 13:30:38 UTC (rev 4581)
@@ -0,0 +1,5 @@
+// Google Mercator projection
+// Used in combination with GoogleMercator layer type in OpenLayers
+//+proj=merc +a=6378137 +b=6378137 +lat_ts=0.0 +lon_0=0.0 +x_0=0.0 +y_0=0 +k=1.0 +units=m +nadgrids=@null +no_defs
+
+Proj4js.defs["EPSG:900913"]= "+title= Google Mercator EPSG:900913 +proj=merc +a=6378137 +b=6378137 +lat_ts=0.0 +lon_0=0.0 +x_0=0.0 +y_0=0 +k=1.0 +units=m +nadgrids=@null +no_defs";
Added: trunk/mapbender/http/extensions/proj4js/lib/defs/EPSG900913.txt
===================================================================
--- trunk/mapbender/http/extensions/proj4js/lib/defs/EPSG900913.txt (rev 0)
+++ trunk/mapbender/http/extensions/proj4js/lib/defs/EPSG900913.txt 2009-08-31 13:30:38 UTC (rev 4581)
@@ -0,0 +1,11 @@
+// Google Mercator projection
+// Used in combination with GoogleMercator layer type in OpenLayers
+//+proj=merc +a=6378137 +b=6378137 +lat_ts=0.0 +lon_0=0.0 +x_0=0.0 +y_0=0 +k=1.0 +units=m +nadgrids=@null +no_defs
+
+csList.EPSG900913= "\
+ +title= Google Mercator EPSG:900913\
+ +proj=merc +a=6378137 +b=6378137 \
+ +lat_ts=0.0 +lon_0=0.0 \
+ +x_0=0.0 +y_0=0 +k=1.0 \
+ +units=m +nadgrids=@null +no_defs \
+";
Added: trunk/mapbender/http/extensions/proj4js/lib/defs/GOOGLE.js
===================================================================
--- trunk/mapbender/http/extensions/proj4js/lib/defs/GOOGLE.js (rev 0)
+++ trunk/mapbender/http/extensions/proj4js/lib/defs/GOOGLE.js 2009-08-31 13:30:38 UTC (rev 4581)
@@ -0,0 +1,2 @@
+Proj4js.defs["GOOGLE"]="+proj=merc +a=6378137 +b=6378137 +lat_ts=0.0 +lon_0=0.0 +x_0=0.0 +y_0=0 +k=1.0 +units=m +nadgrids=@null +no_defs";
+Proj4js.defs["EPSG:900913"]=Proj4js.defs["GOOGLE"];
Added: trunk/mapbender/http/extensions/proj4js/lib/proj4js-combined.js
===================================================================
--- trunk/mapbender/http/extensions/proj4js/lib/proj4js-combined.js (rev 0)
+++ trunk/mapbender/http/extensions/proj4js/lib/proj4js-combined.js 2009-08-31 13:30:38 UTC (rev 4581)
@@ -0,0 +1,4597 @@
+/*
+ proj4js.js -- Javascript reprojection library.
+
+ Authors: Mike Adair madairATdmsolutions.ca
+ Richard Greenwood richATgreenwoodmap.com
+ Didier Richard
+ Stephen Irons
+ License: LGPL as per: http://www.gnu.org/copyleft/lesser.html
+ Note: This program is an almost direct port of the C library
+ Proj4.
+*/
+/* ======================================================================
+ proj4js.js
+ ====================================================================== */
+
+/*
+Author: Mike Adair madairATdmsolutions.ca
+ Richard Greenwood rich at greenwoodmap.com
+License: LGPL as per: http://www.gnu.org/copyleft/lesser.html
+
+$Id: Proj.js 2956 2007-07-09 12:17:52Z steven $
+*/
+
+/**
+ * Namespace: Proj4js
+ *
+ * Proj4js is a JavaScript library to transform point coordinates from one
+ * coordinate system to another, including datum transformations.
+ *
+ * This library is a port of both the Proj.4 and GCTCP C libraries to JavaScript.
+ * Enabling these transformations in the browser allows geographic data stored
+ * in different projections to be combined in browser-based web mapping
+ * applications.
+ *
+ * Proj4js must have access to coordinate system initialization strings (which
+ * are the same as for PROJ.4 command line). Thes can be included in your
+ * application using a <script> tag or Proj4js can load CS initialization
+ * strings from a local directory or a web service such as spatialreference.org.
+ *
+ * Similarly, Proj4js must have access to projection transform code. These can
+ * be included individually using a <script> tag in your page, built into a
+ * custom build of Proj4js or loaded dynamically at run-time. Using the
+ * -combined and -compressed versions of Proj4js includes all projection class
+ * code by default.
+ *
+ * Note that dynamic loading of defs and code happens ascynchrously, check the
+ * Proj.readyToUse flag before using the Proj object. If the defs and code
+ * required by your application are loaded through script tags, dynamic loading
+ * is not required and the Proj object will be readyToUse on return from the
+ * constructor.
+ *
+ * All coordinates are handled as points which have a .x and a .y property
+ * which will be modified in place.
+ *
+ * Override Proj4js.reportError for output of alerts and warnings.
+ *
+ * See http://trac.osgeo.org/proj4js/wiki/UserGuide for full details.
+*/
+
+/**
+ * Global namespace object for Proj4js library
+ */
+Proj4js = {
+
+ /**
+ * Property: defaultDatum
+ * The datum to use when no others a specified
+ */
+ defaultDatum: 'WGS84', //default datum
+
+ /**
+ * Method: transform(source, dest, point)
+ * Transform a point coordinate from one map projection to another. This is
+ * really the only public method you should need to use.
+ *
+ * Parameters:
+ * source - {Proj4js.Proj} source map projection for the transformation
+ * dest - {Proj4js.Proj} destination map projection for the transformation
+ * point - {Object} point to transform, may be geodetic (long, lat) or
+ * projected Cartesian (x,y), but should always have x,y properties.
+ */
+ transform: function(source, dest, point) {
+ if (!source.readyToUse || !dest.readyToUse) {
+ this.reportError("Proj4js initialization for "+source.srsCode+" not yet complete");
+ return point;
+ }
+
+ // Workaround for Spherical Mercator
+ if ((source.srsProjNumber =="900913" && dest.datumCode != "WGS84") ||
+ (dest.srsProjNumber == "900913" && source.datumCode != "WGS84")) {
+ var wgs84 = Proj4js.WGS84;
+ this.transform(source, wgs84, point);
+ source = wgs84;
+ }
+
+ // Transform source points to long/lat, if they aren't already.
+ if ( source.projName=="longlat") {
+ point.x *= Proj4js.common.D2R; // convert degrees to radians
+ point.y *= Proj4js.common.D2R;
+ } else {
+ if (source.to_meter) {
+ point.x *= source.to_meter;
+ point.y *= source.to_meter;
+ }
+ source.inverse(point); // Convert Cartesian to longlat
+ }
+
+ // Adjust for the prime meridian if necessary
+ if (source.from_greenwich) {
+ point.x += source.from_greenwich;
+ }
+
+ // Convert datums if needed, and if possible.
+ point = this.datum_transform( source.datum, dest.datum, point );
+
+ // Adjust for the prime meridian if necessary
+ if (dest.from_greenwich) {
+ point.x -= dest.from_greenwich;
+ }
+
+ if( dest.projName=="longlat" ) {
+ // convert radians to decimal degrees
+ point.x *= Proj4js.common.R2D;
+ point.y *= Proj4js.common.R2D;
+ } else { // else project
+ dest.forward(point);
+ if (dest.to_meter) {
+ point.x /= dest.to_meter;
+ point.y /= dest.to_meter;
+ }
+ }
+ return point;
+ }, // transform()
+
+ /** datum_transform()
+ source coordinate system definition,
+ destination coordinate system definition,
+ point to transform in geodetic coordinates (long, lat, height)
+ */
+ datum_transform : function( source, dest, point ) {
+
+ // Short cut if the datums are identical.
+ if( source.compare_datums( dest ) ) {
+ return point; // in this case, zero is sucess,
+ // whereas cs_compare_datums returns 1 to indicate TRUE
+ // confusing, should fix this
+ }
+
+ // Explicitly skip datum transform by setting 'datum=none' as parameter for either source or dest
+ if( source.datum_type == Proj4js.common.PJD_NODATUM
+ || dest.datum_type == Proj4js.common.PJD_NODATUM) {
+ return point;
+ }
+
+ // If this datum requires grid shifts, then apply it to geodetic coordinates.
+ if( source.datum_type == Proj4js.common.PJD_GRIDSHIFT )
+ {
+ alert("ERROR: Grid shift transformations are not implemented yet.");
+ /*
+ pj_apply_gridshift( pj_param(source.params,"snadgrids").s, 0,
+ point_count, point_offset, x, y, z );
+ CHECK_RETURN;
+
+ src_a = SRS_WGS84_SEMIMAJOR;
+ src_es = 0.006694379990;
+ */
+ }
+
+ if( dest.datum_type == Proj4js.common.PJD_GRIDSHIFT )
+ {
+ alert("ERROR: Grid shift transformations are not implemented yet.");
+ /*
+ dst_a = ;
+ dst_es = 0.006694379990;
+ */
+ }
+
+ // Do we need to go through geocentric coordinates?
+ if( source.es != dest.es || source.a != dest.a
+ || source.datum_type == Proj4js.common.PJD_3PARAM
+ || source.datum_type == Proj4js.common.PJD_7PARAM
+ || dest.datum_type == Proj4js.common.PJD_3PARAM
+ || dest.datum_type == Proj4js.common.PJD_7PARAM)
+ {
+
+ // Convert to geocentric coordinates.
+ source.geodetic_to_geocentric( point );
+ // CHECK_RETURN;
+
+ // Convert between datums
+ if( source.datum_type == Proj4js.common.PJD_3PARAM || source.datum_type == Proj4js.common.PJD_7PARAM ) {
+ source.geocentric_to_wgs84(point);
+ // CHECK_RETURN;
+ }
+
+ if( dest.datum_type == Proj4js.common.PJD_3PARAM || dest.datum_type == Proj4js.common.PJD_7PARAM ) {
+ dest.geocentric_from_wgs84(point);
+ // CHECK_RETURN;
+ }
+
+ // Convert back to geodetic coordinates
+ dest.geocentric_to_geodetic( point );
+ // CHECK_RETURN;
+ }
+
+ // Apply grid shift to destination if required
+ if( dest.datum_type == Proj4js.common.PJD_GRIDSHIFT )
+ {
+ alert("ERROR: Grid shift transformations are not implemented yet.");
+ // pj_apply_gridshift( pj_param(dest.params,"snadgrids").s, 1, point);
+ // CHECK_RETURN;
+ }
+ return point;
+ }, // cs_datum_transform
+
+ /**
+ * Function: reportError
+ * An internal method to report errors back to user.
+ * Override this in applications to report error messages or throw exceptions.
+ */
+ reportError: function(msg) {
+ //console.log(msg);
+ },
+
+/**
+ *
+ * Title: Private Methods
+ * The following properties and methods are intended for internal use only.
+ *
+ * This is a minimal implementation of JavaScript inheritance methods so that
+ * Proj4js can be used as a stand-alone library.
+ * These are copies of the equivalent OpenLayers methods at v2.7
+ */
+
+/**
+ * Function: extend
+ * Copy all properties of a source object to a destination object. Modifies
+ * the passed in destination object. Any properties on the source object
+ * that are set to undefined will not be (re)set on the destination object.
+ *
+ * Parameters:
+ * destination - {Object} The object that will be modified
+ * source - {Object} The object with properties to be set on the destination
+ *
+ * Returns:
+ * {Object} The destination object.
+ */
+ extend: function(destination, source) {
+ destination = destination || {};
+ if(source) {
+ for(var property in source) {
+ var value = source[property];
+ if(value !== undefined) {
+ destination[property] = value;
+ }
+ }
+ }
+ return destination;
+ },
+
+/**
+ * Constructor: Class
+ * Base class used to construct all other classes. Includes support for
+ * multiple inheritance.
+ *
+ */
+ Class: function() {
+ var Class = function() {
+ this.initialize.apply(this, arguments);
+ };
+
+ var extended = {};
+ var parent;
+ for(var i=0; i<arguments.length; ++i) {
+ if(typeof arguments[i] == "function") {
+ // get the prototype of the superclass
+ parent = arguments[i].prototype;
+ } else {
+ // in this case we're extending with the prototype
+ parent = arguments[i];
+ }
+ Proj4js.extend(extended, parent);
+ }
+ Class.prototype = extended;
+
+ return Class;
+ },
+
+ /**
+ * Function: bind
+ * Bind a function to an object. Method to easily create closures with
+ * 'this' altered.
+ *
+ * Parameters:
+ * func - {Function} Input function.
+ * object - {Object} The object to bind to the input function (as this).
+ *
+ * Returns:
+ * {Function} A closure with 'this' set to the passed in object.
+ */
+ bind: function(func, object) {
+ // create a reference to all arguments past the second one
+ var args = Array.prototype.slice.apply(arguments, [2]);
+ return function() {
+ // Push on any additional arguments from the actual function call.
+ // These will come after those sent to the bind call.
+ var newArgs = args.concat(
+ Array.prototype.slice.apply(arguments, [0])
+ );
+ return func.apply(object, newArgs);
+ };
+ },
+
+/**
+ * The following properties and methods handle dynamic loading of JSON objects.
+ *
+ /**
+ * Property: scriptName
+ * {String} The filename of this script without any path.
+ */
+ scriptName: "proj4js.js",
+
+ /**
+ * Property: defsLookupService
+ * AJAX service to retreive projection definition parameters from
+ */
+ defsLookupService: 'http://spatialreference.org/ref',
+
+ /**
+ * Property: libPath
+ * internal: http server path to library code.
+ */
+ libPath: null,
+
+ /**
+ * Function: getScriptLocation
+ * Return the path to this script.
+ *
+ * Returns:
+ * Path to this script
+ */
+ getScriptLocation: function () {
+ if (this.libPath) return this.libPath;
+ var scriptName = this.scriptName;
+ var scriptNameLen = scriptName.length;
+
+ var scripts = document.getElementsByTagName('script');
+ for (var i = 0; i < scripts.length; i++) {
+ var src = scripts[i].getAttribute('src');
+ if (src) {
+ var index = src.lastIndexOf(scriptName);
+ // is it found, at the end of the URL?
+ if ((index > -1) && (index + scriptNameLen == src.length)) {
+ this.libPath = src.slice(0, -scriptNameLen);
+ break;
+ }
+ }
+ }
+ return this.libPath||"";
+ },
+
+ /**
+ * Function: loadScript
+ * Load a JS file from a URL into a <script> tag in the page.
+ *
+ * Parameters:
+ * url - {String} The URL containing the script to load
+ * onload - {Function} A method to be executed when the script loads successfully
+ * onfail - {Function} A method to be executed when there is an error loading the script
+ * loadCheck - {Function} A boolean method that checks to see if the script
+ * has loaded. Typically this just checks for the existance of
+ * an object in the file just loaded.
+ */
+ loadScript: function(url, onload, onfail, loadCheck) {
+ var script = document.createElement('script');
+ script.defer = false;
+ script.type = "text/javascript";
+ script.id = url;
+ script.src = url;
+ script.onload = onload;
+ script.onerror = onfail;
+ script.loadCheck = loadCheck;
+ if (/MSIE/.test(navigator.userAgent)) {
+ script.onreadystatechange = this.checkReadyState;
+ }
+ document.getElementsByTagName('head')[0].appendChild(script);
+ },
+
+ /**
+ * Function: checkReadyState
+ * IE workaround since there is no onerror handler. Calls the user defined
+ * loadCheck method to determine if the script is loaded.
+ *
+ */
+ checkReadyState: function() {
+ if (this.readyState == 'loaded') {
+ if (!this.loadCheck()) {
+ this.onerror();
+ } else {
+ this.onload();
+ }
+ }
+ }
+};
+
+/**
+ * Class: Proj4js.Proj
+ *
+ * Proj objects provide transformation methods for point coordinates
+ * between geodetic latitude/longitude and a projected coordinate system.
+ * once they have been initialized with a projection code.
+ *
+ * Initialization of Proj objects is with a projection code, usually EPSG codes,
+ * which is the key that will be used with the Proj4js.defs array.
+ *
+ * The code passed in will be stripped of colons and converted to uppercase
+ * to locate projection definition files.
+ *
+ * A projection object has properties for units and title strings.
+ */
+Proj4js.Proj = Proj4js.Class({
+
+ /**
+ * Property: readyToUse
+ * Flag to indicate if initialization is complete for this Proj object
+ */
+ readyToUse: false,
+
+ /**
+ * Property: title
+ * The title to describe the projection
+ */
+ title: null,
+
+ /**
+ * Property: projName
+ * The projection class for this projection, e.g. lcc (lambert conformal conic,
+ * or merc for mercator. These are exactly equicvalent to their Proj4
+ * counterparts.
+ */
+ projName: null,
+ /**
+ * Property: units
+ * The units of the projection. Values include 'm' and 'degrees'
+ */
+ units: null,
+ /**
+ * Property: datum
+ * The datum specified for the projection
+ */
+ datum: null,
+
+ /**
+ * Constructor: initialize
+ * Constructor for Proj4js.Proj objects
+ *
+ * Parameters:
+ * srsCode - a code for map projection definition parameters. These are usually
+ * (but not always) EPSG codes.
+ */
+ initialize: function(srsCode) {
+ this.srsCode = srsCode.toUpperCase();
+ if (this.srsCode.indexOf("EPSG") == 0) {
+ this.srsCode = this.srsCode;
+ this.srsAuth = 'epsg';
+ this.srsProjNumber = this.srsCode.substring(5);
+ // DGR 2007-11-20 : authority IGNF
+ } else if (this.srsCode.indexOf("IGNF") == 0) {
+ this.srsCode = this.srsCode;
+ this.srsAuth = 'IGNF';
+ this.srsProjNumber = this.srsCode.substring(5);
+ // DGR 2008-06-19 : pseudo-authority CRS for WMS
+ } else if (this.srsCode.indexOf("CRS") == 0) {
+ this.srsCode = this.srsCode;
+ this.srsAuth = 'CRS';
+ this.srsProjNumber = this.srsCode.substring(4);
+ } else {
+ this.srsAuth = '';
+ this.srsProjNumber = this.srsCode;
+ }
+ this.loadProjDefinition();
+ },
+
+/**
+ * Function: loadProjDefinition
+ * Loads the coordinate system initialization string if required.
+ * Note that dynamic loading happens asynchronously so an application must
+ * wait for the readyToUse property is set to true.
+ * To prevent dynamic loading, include the defs through a script tag in
+ * your application.
+ *
+ */
+ loadProjDefinition: function() {
+ //check in memory
+ if (Proj4js.defs[this.srsCode]) {
+ this.defsLoaded();
+ return;
+ }
+
+ //else check for def on the server
+ var url = Proj4js.getScriptLocation() + 'defs/' + this.srsAuth.toUpperCase() + this.srsProjNumber + '.js';
+ Proj4js.loadScript(url,
+ Proj4js.bind(this.defsLoaded, this),
+ Proj4js.bind(this.loadFromService, this),
+ Proj4js.bind(this.checkDefsLoaded, this) );
+ },
+
+/**
+ * Function: loadFromService
+ * Creates the REST URL for loading the definition from a web service and
+ * loads it.
+ *
+ */
+ loadFromService: function() {
+ //else load from web service
+ var url = Proj4js.defsLookupService +'/' + this.srsAuth +'/'+ this.srsProjNumber + '/proj4js';
+ Proj4js.loadScript(url,
+ Proj4js.bind(this.defsLoaded, this),
+ Proj4js.bind(this.defsFailed, this),
+ Proj4js.bind(this.checkDefsLoaded, this) );
+ },
+
+/**
+ * Function: defsLoaded
+ * Continues the Proj object initilization once the def file is loaded
+ *
+ */
+ defsLoaded: function() {
+ this.parseDefs();
+ this.loadProjCode(this.projName);
+ },
+
+/**
+ * Function: checkDefsLoaded
+ * This is the loadCheck method to see if the def object exists
+ *
+ */
+ checkDefsLoaded: function() {
+ if (Proj4js.defs[this.srsCode]) {
+ return true;
+ } else {
+ return false;
+ }
+ },
+
+ /**
+ * Function: defsFailed
+ * Report an error in loading the defs file, but continue on using WGS84
+ *
+ */
+ defsFailed: function() {
+ Proj4js.reportError('failed to load projection definition for: '+this.srsCode);
+ Proj4js.extend(Proj4js.defs[this.srsCode], Proj4js.defs['WGS84']); //set it to something so it can at least continue
+ this.defsLoaded();
+ },
+
+/**
+ * Function: loadProjCode
+ * Loads projection class code dynamically if required.
+ * Projection code may be included either through a script tag or in
+ * a built version of proj4js
+ *
+ */
+ loadProjCode: function(projName) {
+ if (Proj4js.Proj[projName]) {
+ this.initTransforms();
+ return;
+ }
+
+ //the URL for the projection code
+ var url = Proj4js.getScriptLocation() + 'projCode/' + projName + '.js';
+ Proj4js.loadScript(url,
+ Proj4js.bind(this.loadProjCodeSuccess, this, projName),
+ Proj4js.bind(this.loadProjCodeFailure, this, projName),
+ Proj4js.bind(this.checkCodeLoaded, this, projName) );
+ },
+
+ /**
+ * Function: loadProjCodeSuccess
+ * Loads any proj dependencies or continue on to final initialization.
+ *
+ */
+ loadProjCodeSuccess: function(projName) {
+ if (Proj4js.Proj[projName].dependsOn){
+ this.loadProjCode(Proj4js.Proj[projName].dependsOn);
+ } else {
+ this.initTransforms();
+ }
+ },
+
+ /**
+ * Function: defsFailed
+ * Report an error in loading the proj file. Initialization of the Proj
+ * object has failed and the readyToUse flag will never be set.
+ *
+ */
+ loadProjCodeFailure: function(projName) {
+ Proj4js.reportError("failed to find projection file for: " + projName);
+ //TBD initialize with identity transforms so proj will still work?
+ },
+
+/**
+ * Function: checkCodeLoaded
+ * This is the loadCheck method to see if the projection code is loaded
+ *
+ */
+ checkCodeLoaded: function(projName) {
+ if (Proj4js.Proj[projName]) {
+ return true;
+ } else {
+ return false;
+ }
+ },
+
+/**
+ * Function: initTransforms
+ * Finalize the initialization of the Proj object
+ *
+ */
+ initTransforms: function() {
+ Proj4js.extend(this, Proj4js.Proj[this.projName]);
+ this.init();
+ this.readyToUse = true;
+ },
+
+/**
+ * Function: parseDefs
+ * Parses the PROJ.4 initialization string and sets the associated properties.
+ *
+ */
+ parseDefs: function() {
+ this.defData = Proj4js.defs[this.srsCode];
+ var paramName, paramVal;
+ var paramArray=this.defData.split("+");
+
+ for (var prop=0; prop<paramArray.length; prop++) {
+ var property = paramArray[prop].split("=");
+ paramName = property[0].toLowerCase();
+ paramVal = property[1];
+
+ switch (paramName.replace(/\s/gi,"")) { // trim out spaces
+ case "": break; // throw away nameless parameter
+ case "title": this.title = paramVal; break;
+ case "proj": this.projName = paramVal.replace(/\s/gi,""); break;
+ case "units": this.units = paramVal.replace(/\s/gi,""); break;
+ case "datum": this.datumCode = paramVal.replace(/\s/gi,""); break;
+ case "nadgrids": this.nagrids = paramVal.replace(/\s/gi,""); break;
+ case "ellps": this.ellps = paramVal.replace(/\s/gi,""); break;
+ case "a": this.a = parseFloat(paramVal); break; // semi-major radius
+ case "b": this.b = parseFloat(paramVal); break; // semi-minor radius
+ // DGR 2007-11-20
+ case "rf": this.rf = parseFloat(paramVal); break; // inverse flattening rf= a/(a-b)
+ case "lat_0": this.lat0 = paramVal*Proj4js.common.D2R; break; // phi0, central latitude
+ case "lat_1": this.lat1 = paramVal*Proj4js.common.D2R; break; //standard parallel 1
+ case "lat_2": this.lat2 = paramVal*Proj4js.common.D2R; break; //standard parallel 2
+ case "lat_ts": this.lat_ts = paramVal*Proj4js.common.D2R; break; // used in merc and eqc
+ case "lon_0": this.long0 = paramVal*Proj4js.common.D2R; break; // lam0, central longitude
+ case "alpha": this.alpha = parseFloat(paramVal)*Proj4js.common.D2R; break; //for somerc projection
+ case "lonc": this.longc = paramVal*Proj4js.common.D2R; break; //for somerc projection
+ case "x_0": this.x0 = parseFloat(paramVal); break; // false easting
+ case "y_0": this.y0 = parseFloat(paramVal); break; // false northing
+ case "k_0": this.k0 = parseFloat(paramVal); break; // projection scale factor
+ case "k": this.k0 = parseFloat(paramVal); break; // both forms returned
+ case "R_A": this.R = true; break; //Spheroid radius
+ case "zone": this.zone = parseInt(paramVal); break; // UTM Zone
+ case "south": this.utmSouth = true; break; // UTM north/south
+ case "towgs84":this.datum_params = paramVal.split(","); break;
+ case "to_meter": this.to_meter = parseFloat(paramVal); break; // cartesian scaling
+ case "from_greenwich": this.from_greenwich = paramVal*Proj4js.common.D2R; break;
+ // DGR 2008-07-09 : if pm is not a well-known prime meridian take
+ // the value instead of 0.0, then convert to radians
+ case "pm": paramVal = paramVal.replace(/\s/gi,"");
+ this.from_greenwich = Proj4js.PrimeMeridian[paramVal] ?
+ Proj4js.PrimeMeridian[paramVal] : parseFloat(paramVal);
+ this.from_greenwich *= Proj4js.common.D2R;
+ break;
+ case "no_defs": break;
+ default: //alert("Unrecognized parameter: " + paramName);
+ } // switch()
+ } // for paramArray
+ this.deriveConstants();
+ },
+
+/**
+ * Function: deriveConstants
+ * Sets several derived constant values and initialization of datum and ellipse
+ * parameters.
+ *
+ */
+ deriveConstants: function() {
+ if (this.nagrids == '@null') this.datumCode = 'none';
+ if (this.datumCode && this.datumCode != 'none') {
+ var datumDef = Proj4js.Datum[this.datumCode];
+ if (datumDef) {
+ this.datum_params = datumDef.towgs84.split(',');
+ this.ellps = datumDef.ellipse;
+ this.datumName = datumDef.datumName ? datumDef.datumName : this.datumCode;
+ }
+ }
+ if (!this.a) { // do we have an ellipsoid?
+ var ellipse = Proj4js.Ellipsoid[this.ellps] ? Proj4js.Ellipsoid[this.ellps] : Proj4js.Ellipsoid['WGS84'];
+ Proj4js.extend(this, ellipse);
+ }
+ if (this.rf && !this.b) this.b = (1.0 - 1.0/this.rf) * this.a;
+ if (Math.abs(this.a - this.b)<Proj4js.common.EPSLN) {
+ this.sphere = true;
+ this.b= this.a;
+ }
+ this.a2 = this.a * this.a; // used in geocentric
+ this.b2 = this.b * this.b; // used in geocentric
+ this.es = (this.a2-this.b2)/this.a2; // e ^ 2
+ this.e = Math.sqrt(this.es); // eccentricity
+ if (this.R_A) {
+ this.a *= 1. - this.es * (Proj4js.common.SIXTH + this.es * (Proj4js.RA4 + this.es * Proj4js.RA6));
+ this.a2 = this.a * this.a;
+ this.b2 = this.b * this.b;
+ this.es = 0.;
+ }
+ this.ep2=(this.a2-this.b2)/this.b2; // used in geocentric
+ if (!this.k0) this.k0 = 1.0; //default value
+
+ this.datum = new Proj4js.datum(this);
+ }
+});
+
+Proj4js.Proj.longlat = {
+ init: function() {
+ //no-op for longlat
+ },
+ forward: function(pt) {
+ //identity transform
+ return pt;
+ },
+ inverse: function(pt) {
+ //identity transform
+ return pt;
+ }
+};
+
+/**
+ Proj4js.defs is a collection of coordinate system definition objects in the
+ PROJ.4 command line format.
+ Generally a def is added by means of a separate .js file for example:
+
+ <SCRIPT type="text/javascript" src="defs/EPSG26912.js"></SCRIPT>
+
+ def is a CS definition in PROJ.4 WKT format, for example:
+ +proj="tmerc" //longlat, etc.
+ +a=majorRadius
+ +b=minorRadius
+ +lat0=somenumber
+ +long=somenumber
+*/
+Proj4js.defs = {
+ // These are so widely used, we'll go ahead and throw them in
+ // without requiring a separate .js file
+ 'WGS84': "+title=long/lat:WGS84 +proj=longlat +ellps=WGS84 +datum=WGS84 +units=degrees",
+ 'EPSG:4326': "+title=long/lat:WGS84 +proj=longlat +a=6378137.0 +b=6356752.31424518 +ellps=WGS84 +datum=WGS84 +units=degrees",
+ 'EPSG:4269': "+title=long/lat:NAD83 +proj=longlat +a=6378137.0 +b=6356752.31414036 +ellps=GRS80 +datum=NAD83 +units=degrees"
+};
+//+a=6378137.0 +b=6356752.31424518 +ellps=WGS84 +datum=WGS84",
+Proj4js.common = {
+ PI : 3.141592653589793238, //Math.PI,
+ HALF_PI : 1.570796326794896619, //Math.PI*0.5,
+ TWO_PI : 6.283185307179586477, //Math.PI*2,
+ FORTPI : 0.78539816339744833,
+ R2D : 57.29577951308232088,
+ D2R : 0.01745329251994329577,
+ SEC_TO_RAD : 4.84813681109535993589914102357e-6, /* SEC_TO_RAD = Pi/180/3600 */
+ EPSLN : 1.0e-10,
+ MAX_ITER : 20,
+ // following constants from geocent.c
+ COS_67P5 : 0.38268343236508977, /* cosine of 67.5 degrees */
+ AD_C : 1.0026000, /* Toms region 1 constant */
+
+ /* datum_type values */
+ PJD_UNKNOWN : 0,
+ PJD_3PARAM : 1,
+ PJD_7PARAM : 2,
+ PJD_GRIDSHIFT: 3,
+ PJD_WGS84 : 4, // WGS84 or equivalent
+ PJD_NODATUM : 5, // WGS84 or equivalent
+ SRS_WGS84_SEMIMAJOR : 6378137.0, // only used in grid shift transforms
+
+ // ellipoid pj_set_ell.c
+ SIXTH : .1666666666666666667, /* 1/6 */
+ RA4 : .04722222222222222222, /* 17/360 */
+ RA6 : .02215608465608465608, /* 67/3024 */
+ RV4 : .06944444444444444444, /* 5/72 */
+ RV6 : .04243827160493827160, /* 55/1296 */
+
+// Function to compute the constant small m which is the radius of
+// a parallel of latitude, phi, divided by the semimajor axis.
+// -----------------------------------------------------------------
+ msfnz : function(eccent, sinphi, cosphi) {
+ var con = eccent * sinphi;
+ return cosphi/(Math.sqrt(1.0 - con * con));
+ },
+
+// Function to compute the constant small t for use in the forward
+// computations in the Lambert Conformal Conic and the Polar
+// Stereographic projections.
+// -----------------------------------------------------------------
+ tsfnz : function(eccent, phi, sinphi) {
+ var con = eccent * sinphi;
+ var com = .5 * eccent;
+ con = Math.pow(((1.0 - con) / (1.0 + con)), com);
+ return (Math.tan(.5 * (this.HALF_PI - phi))/con);
+ },
+
+// Function to compute the latitude angle, phi2, for the inverse of the
+// Lambert Conformal Conic and Polar Stereographic projections.
+// ----------------------------------------------------------------
+ phi2z : function(eccent, ts) {
+ var eccnth = .5 * eccent;
+ var con, dphi;
+ var phi = this.HALF_PI - 2 * Math.atan(ts);
+ for (i = 0; i <= 15; i++) {
+ con = eccent * Math.sin(phi);
+ dphi = this.HALF_PI - 2 * Math.atan(ts *(Math.pow(((1.0 - con)/(1.0 + con)),eccnth))) - phi;
+ phi += dphi;
+ if (Math.abs(dphi) <= .0000000001) return phi;
+ }
+ alert("phi2z has NoConvergence");
+ return (-9999);
+ },
+
+/* Function to compute constant small q which is the radius of a
+ parallel of latitude, phi, divided by the semimajor axis.
+------------------------------------------------------------*/
+ qsfnz : function(eccent,sinphi,cosphi) {
+ var con;
+ if (eccent > 1.0e-7) {
+ con = eccent * sinphi;
+ return (( 1.0- eccent * eccent) * (sinphi /(1.0 - con * con) - (.5/eccent)*Math.log((1.0 - con)/(1.0 + con))));
+ } else {
+ return(2.0 * sinphi);
+ }
+ },
+
+/* Function to eliminate roundoff errors in asin
+----------------------------------------------*/
+ asinz : function(x) {
+ if (Math.abs(x)>1.0) {
+ x=(x>1.0)?1.0:-1.0;
+ }
+ return Math.asin(x);
+ },
+
+// following functions from gctpc cproj.c for transverse mercator projections
+ e0fn : function(x) {return(1.0-0.25*x*(1.0+x/16.0*(3.0+1.25*x)));},
+ e1fn : function(x) {return(0.375*x*(1.0+0.25*x*(1.0+0.46875*x)));},
+ e2fn : function(x) {return(0.05859375*x*x*(1.0+0.75*x));},
+ e3fn : function(x) {return(x*x*x*(35.0/3072.0));},
+ mlfn : function(e0,e1,e2,e3,phi) {return(e0*phi-e1*Math.sin(2.0*phi)+e2*Math.sin(4.0*phi)-e3*Math.sin(6.0*phi));},
+
+ srat : function(esinp, exp) {
+ return(Math.pow((1.0-esinp)/(1.0+esinp), exp));
+ },
+
+// Function to return the sign of an argument
+ sign : function(x) { if (x < 0.0) return(-1); else return(1);},
+
+// Function to adjust longitude to -180 to 180; input in radians
+ adjust_lon : function(x) {
+ x = (Math.abs(x) < this.PI) ? x: (x - (this.sign(x)*this.TWO_PI) );
+ return x;
+ },
+
+// IGNF - DGR : algorithms used by IGN France
+
+// Function to adjust latitude to -90 to 90; input in radians
+ adjust_lat : function(x) {
+ x= (Math.abs(x) < this.HALF_PI) ? x: (x - (this.sign(x)*this.PI) );
+ return x;
+ },
+
+// Latitude Isometrique - close to tsfnz ...
+ latiso : function(eccent, phi, sinphi)
+ {
+ if (Math.abs(phi) > this.HALF_PI) return +Number.NaN;
+ if (phi==this.HALF_PI) return Number.POSITIVE_INFINITY;
+ if (phi==-1.0*this.HALF_PI) return -1.0*Number.POSITIVE_INFINITY;
+
+ var con= eccent*sinphi;
+ return Math.log(Math.tan((this.HALF_PI+phi)/2.0))+eccent*Math.log((1.0-con)/(1.0+con))/2.0;
+ },
+
+ fL : function(x,L) {
+ return 2.0*Math.atan(x*Math.exp(L)) - this.HALF_PI;
+ },
+
+// Inverse Latitude Isometrique - close to ph2z
+ invlatiso : function(eccent, ts) {
+ var phi= this.fL(1.0,ts);
+ var Iphi= 0.0;
+ var con= 0.0;
+ do {
+ Iphi= phi;
+ con= eccent*Math.sin(Iphi);
+ phi= this.fL(Math.exp(eccent*Math.log((1.0+con)/(1.0-con))/2.0),ts)
+ } while (Math.abs(phi-Iphi)>1.0e-12);
+ return phi;
+ },
+
+// Needed for Gauss Laborde
+// Original: Denis Makarov (info at binarythings.com)
+// Web Site: http://www.binarythings.com
+ sinh : function(x)
+ {
+ var r= Math.exp(x);
+ r= (r-1.0/r)/2.0;
+ return r;
+ },
+
+ cosh : function(x)
+ {
+ var r= Math.exp(x);
+ r= (r+1.0/r)/2.0;
+ return r;
+ },
+
+ tanh : function(x)
+ {
+ var r= Math.exp(x);
+ r= (r-1.0/r)/(r+1.0/r);
+ return r;
+ },
+
+ asinh : function(x)
+ {
+ var s= (x>= 0? 1.0:-1.0);
+ return s*(Math.log( Math.abs(x) + Math.sqrt(x*x+1.0) ));
+ },
+
+ acosh : function(x)
+ {
+ return 2.0*Math.log(Math.sqrt((x+1.0)/2.0) + Math.sqrt((x-1.0)/2.0));
+ },
+
+ atanh : function(x)
+ {
+ return Math.log((x-1.0)/(x+1.0))/2.0;
+ },
+
+// Grande Normale
+ gN : function(a,e,sinphi)
+ {
+ var temp= e*sinphi;
+ return a/Math.sqrt(1.0 - temp*temp);
+ }
+
+};
+
+/** datum object
+*/
+Proj4js.datum = Proj4js.Class({
+
+ initialize : function(proj) {
+ this.datum_type = Proj4js.common.PJD_WGS84; //default setting
+ if (proj.datumCode && proj.datumCode == 'none') {
+ this.datum_type = Proj4js.common.PJD_NODATUM;
+ }
+ if (proj && proj.datum_params) {
+ for (var i=0; i<proj.datum_params.length; i++) {
+ proj.datum_params[i]=parseFloat(proj.datum_params[i]);
+ }
+ if (proj.datum_params[0] != 0 || proj.datum_params[1] != 0 || proj.datum_params[2] != 0 ) {
+ this.datum_type = Proj4js.common.PJD_3PARAM;
+ }
+ if (proj.datum_params.length > 3) {
+ if (proj.datum_params[3] != 0 || proj.datum_params[4] != 0 ||
+ proj.datum_params[5] != 0 || proj.datum_params[6] != 0 ) {
+ this.datum_type = Proj4js.common.PJD_7PARAM;
+ proj.datum_params[3] *= Proj4js.common.SEC_TO_RAD;
+ proj.datum_params[4] *= Proj4js.common.SEC_TO_RAD;
+ proj.datum_params[5] *= Proj4js.common.SEC_TO_RAD;
+ proj.datum_params[6] = (proj.datum_params[6]/1000000.0) + 1.0;
+ }
+ }
+ }
+ if (proj) {
+ this.a = proj.a; //datum object also uses these values
+ this.b = proj.b;
+ this.es = proj.es;
+ this.ep2 = proj.ep2;
+ this.datum_params = proj.datum_params;
+ }
+ },
+
+ /****************************************************************/
+ // cs_compare_datums()
+ // Returns 1 (TRUE) if the two datums match, otherwise 0 (FALSE).
+ compare_datums : function( dest ) {
+ if( this.datum_type != dest.datum_type ) {
+ return false; // false, datums are not equal
+ } else if( this.a != dest.a || Math.abs(this.es-dest.es) > 0.000000000050 ) {
+ // the tolerence for es is to ensure that GRS80 and WGS84
+ // are considered identical
+ return false;
+ } else if( this.datum_type == Proj4js.common.PJD_3PARAM ) {
+ return (this.datum_params[0] == dest.datum_params[0]
+ && this.datum_params[1] == dest.datum_params[1]
+ && this.datum_params[2] == dest.datum_params[2]);
+ } else if( this.datum_type == Proj4js.common.PJD_7PARAM ) {
+ return (this.datum_params[0] == dest.datum_params[0]
+ && this.datum_params[1] == dest.datum_params[1]
+ && this.datum_params[2] == dest.datum_params[2]
+ && this.datum_params[3] == dest.datum_params[3]
+ && this.datum_params[4] == dest.datum_params[4]
+ && this.datum_params[5] == dest.datum_params[5]
+ && this.datum_params[6] == dest.datum_params[6]);
+ } else if( this.datum_type == Proj4js.common.PJD_GRIDSHIFT ) {
+ return strcmp( pj_param(this.params,"snadgrids").s,
+ pj_param(dest.params,"snadgrids").s ) == 0;
+ } else {
+ return true; // datums are equal
+ }
+ }, // cs_compare_datums()
+
+ /*
+ * The function Convert_Geodetic_To_Geocentric converts geodetic coordinates
+ * (latitude, longitude, and height) to geocentric coordinates (X, Y, Z),
+ * according to the current ellipsoid parameters.
+ *
+ * Latitude : Geodetic latitude in radians (input)
+ * Longitude : Geodetic longitude in radians (input)
+ * Height : Geodetic height, in meters (input)
+ * X : Calculated Geocentric X coordinate, in meters (output)
+ * Y : Calculated Geocentric Y coordinate, in meters (output)
+ * Z : Calculated Geocentric Z coordinate, in meters (output)
+ *
+ */
+ geodetic_to_geocentric : function(p) {
+ var Longitude = p.x;
+ var Latitude = p.y;
+ var Height = p.z ? p.z : 0; //Z value not always supplied
+ var X; // output
+ var Y;
+ var Z;
+
+ var Error_Code=0; // GEOCENT_NO_ERROR;
+ var Rn; /* Earth radius at location */
+ var Sin_Lat; /* Math.sin(Latitude) */
+ var Sin2_Lat; /* Square of Math.sin(Latitude) */
+ var Cos_Lat; /* Math.cos(Latitude) */
+
+ /*
+ ** Don't blow up if Latitude is just a little out of the value
+ ** range as it may just be a rounding issue. Also removed longitude
+ ** test, it should be wrapped by Math.cos() and Math.sin(). NFW for PROJ.4, Sep/2001.
+ */
+ if( Latitude < -Proj4js.common.HALF_PI && Latitude > -1.001 * Proj4js.common.HALF_PI ) {
+ Latitude = -Proj4js.common.HALF_PI;
+ } else if( Latitude > Proj4js.common.HALF_PI && Latitude < 1.001 * Proj4js.common.HALF_PI ) {
+ Latitude = Proj4js.common.HALF_PI;
+ } else if ((Latitude < -Proj4js.common.HALF_PI) || (Latitude > Proj4js.common.HALF_PI)) {
+ /* Latitude out of range */
+ Proj4js.reportError('geocent:lat out of range:'+Latitude);
+ return null;
+ }
+
+ if (Longitude > Proj4js.common.PI) Longitude -= (2*Proj4js.common.PI);
+ Sin_Lat = Math.sin(Latitude);
+ Cos_Lat = Math.cos(Latitude);
+ Sin2_Lat = Sin_Lat * Sin_Lat;
+ Rn = this.a / (Math.sqrt(1.0e0 - this.es * Sin2_Lat));
+ X = (Rn + Height) * Cos_Lat * Math.cos(Longitude);
+ Y = (Rn + Height) * Cos_Lat * Math.sin(Longitude);
+ Z = ((Rn * (1 - this.es)) + Height) * Sin_Lat;
+
+ p.x = X;
+ p.y = Y;
+ p.z = Z;
+ return Error_Code;
+ }, // cs_geodetic_to_geocentric()
+
+
+ geocentric_to_geodetic : function (p) {
+/* local defintions and variables */
+/* end-criterium of loop, accuracy of sin(Latitude) */
+var genau = 1.E-12;
+var genau2 = (genau*genau);
+var maxiter = 30;
+
+ var P; /* distance between semi-minor axis and location */
+ var RR; /* distance between center and location */
+ var CT; /* sin of geocentric latitude */
+ var ST; /* cos of geocentric latitude */
+ var RX;
+ var RK;
+ var RN; /* Earth radius at location */
+ var CPHI0; /* cos of start or old geodetic latitude in iterations */
+ var SPHI0; /* sin of start or old geodetic latitude in iterations */
+ var CPHI; /* cos of searched geodetic latitude */
+ var SPHI; /* sin of searched geodetic latitude */
+ var SDPHI; /* end-criterium: addition-theorem of sin(Latitude(iter)-Latitude(iter-1)) */
+ var At_Pole; /* indicates location is in polar region */
+ var iter; /* # of continous iteration, max. 30 is always enough (s.a.) */
+
+ var X = p.x;
+ var Y = p.y;
+ var Z = p.z ? p.z : 0.0; //Z value not always supplied
+ var Longitude;
+ var Latitude;
+ var Height;
+
+ At_Pole = false;
+ P = Math.sqrt(X*X+Y*Y);
+ RR = Math.sqrt(X*X+Y*Y+Z*Z);
+
+/* special cases for latitude and longitude */
+ if (P/this.a < genau) {
+
+/* special case, if P=0. (X=0., Y=0.) */
+ At_Pole = true;
+ Longitude = 0.0;
+
+/* if (X,Y,Z)=(0.,0.,0.) then Height becomes semi-minor axis
+ * of ellipsoid (=center of mass), Latitude becomes PI/2 */
+ if (RR/this.a < genau) {
+ Latitude = Proj4js.common.HALF_PI;
+ Height = -this.b;
+ return;
+ }
+ } else {
+/* ellipsoidal (geodetic) longitude
+ * interval: -PI < Longitude <= +PI */
+ Longitude=Math.atan2(Y,X);
+ }
+
+/* --------------------------------------------------------------
+ * Following iterative algorithm was developped by
+ * "Institut für Erdmessung", University of Hannover, July 1988.
+ * Internet: www.ife.uni-hannover.de
+ * Iterative computation of CPHI,SPHI and Height.
+ * Iteration of CPHI and SPHI to 10**-12 radian resp.
+ * 2*10**-7 arcsec.
+ * --------------------------------------------------------------
+ */
+ CT = Z/RR;
+ ST = P/RR;
+ RX = 1.0/Math.sqrt(1.0-this.es*(2.0-this.es)*ST*ST);
+ CPHI0 = ST*(1.0-this.es)*RX;
+ SPHI0 = CT*RX;
+ iter = 0;
+
+/* loop to find sin(Latitude) resp. Latitude
+ * until |sin(Latitude(iter)-Latitude(iter-1))| < genau */
+ do
+ {
+ iter++;
+ RN = this.a/Math.sqrt(1.0-this.es*SPHI0*SPHI0);
+
+/* ellipsoidal (geodetic) height */
+ Height = P*CPHI0+Z*SPHI0-RN*(1.0-this.es*SPHI0*SPHI0);
+
+ RK = this.es*RN/(RN+Height);
+ RX = 1.0/Math.sqrt(1.0-RK*(2.0-RK)*ST*ST);
+ CPHI = ST*(1.0-RK)*RX;
+ SPHI = CT*RX;
+ SDPHI = SPHI*CPHI0-CPHI*SPHI0;
+ CPHI0 = CPHI;
+ SPHI0 = SPHI;
+ }
+ while (SDPHI*SDPHI > genau2 && iter < maxiter);
+
+/* ellipsoidal (geodetic) latitude */
+ Latitude=Math.atan(SPHI/Math.abs(CPHI));
+
+ p.x = Longitude;
+ p.y = Latitude;
+ p.z = Height;
+ return p;
+ }, // cs_geocentric_to_geodetic()
+
+ /** Convert_Geocentric_To_Geodetic
+ * The method used here is derived from 'An Improved Algorithm for
+ * Geocentric to Geodetic Coordinate Conversion', by Ralph Toms, Feb 1996
+ */
+ geocentric_to_geodetic_noniter : function (p) {
+ var X = p.x;
+ var Y = p.y;
+ var Z = p.z ? p.z : 0; //Z value not always supplied
+ var Longitude;
+ var Latitude;
+ var Height;
+
+ var W; /* distance from Z axis */
+ var W2; /* square of distance from Z axis */
+ var T0; /* initial estimate of vertical component */
+ var T1; /* corrected estimate of vertical component */
+ var S0; /* initial estimate of horizontal component */
+ var S1; /* corrected estimate of horizontal component */
+ var Sin_B0; /* Math.sin(B0), B0 is estimate of Bowring aux variable */
+ var Sin3_B0; /* cube of Math.sin(B0) */
+ var Cos_B0; /* Math.cos(B0) */
+ var Sin_p1; /* Math.sin(phi1), phi1 is estimated latitude */
+ var Cos_p1; /* Math.cos(phi1) */
+ var Rn; /* Earth radius at location */
+ var Sum; /* numerator of Math.cos(phi1) */
+ var At_Pole; /* indicates location is in polar region */
+
+ X = parseFloat(X); // cast from string to float
+ Y = parseFloat(Y);
+ Z = parseFloat(Z);
+
+ At_Pole = false;
+ if (X != 0.0)
+ {
+ Longitude = Math.atan2(Y,X);
+ }
+ else
+ {
+ if (Y > 0)
+ {
+ Longitude = Proj4js.common.HALF_PI;
+ }
+ else if (Y < 0)
+ {
+ Longitude = -Proj4js.common.HALF_PI;
+ }
+ else
+ {
+ At_Pole = true;
+ Longitude = 0.0;
+ if (Z > 0.0)
+ { /* north pole */
+ Latitude = Proj4js.common.HALF_PI;
+ }
+ else if (Z < 0.0)
+ { /* south pole */
+ Latitude = -Proj4js.common.HALF_PI;
+ }
+ else
+ { /* center of earth */
+ Latitude = Proj4js.common.HALF_PI;
+ Height = -this.b;
+ return;
+ }
+ }
+ }
+ W2 = X*X + Y*Y;
+ W = Math.sqrt(W2);
+ T0 = Z * Proj4js.common.AD_C;
+ S0 = Math.sqrt(T0 * T0 + W2);
+ Sin_B0 = T0 / S0;
+ Cos_B0 = W / S0;
+ Sin3_B0 = Sin_B0 * Sin_B0 * Sin_B0;
+ T1 = Z + this.b * this.ep2 * Sin3_B0;
+ Sum = W - this.a * this.es * Cos_B0 * Cos_B0 * Cos_B0;
+ S1 = Math.sqrt(T1*T1 + Sum * Sum);
+ Sin_p1 = T1 / S1;
+ Cos_p1 = Sum / S1;
+ Rn = this.a / Math.sqrt(1.0 - this.es * Sin_p1 * Sin_p1);
+ if (Cos_p1 >= Proj4js.common.COS_67P5)
+ {
+ Height = W / Cos_p1 - Rn;
+ }
+ else if (Cos_p1 <= -Proj4js.common.COS_67P5)
+ {
+ Height = W / -Cos_p1 - Rn;
+ }
+ else
+ {
+ Height = Z / Sin_p1 + Rn * (this.es - 1.0);
+ }
+ if (At_Pole == false)
+ {
+ Latitude = Math.atan(Sin_p1 / Cos_p1);
+ }
+
+ p.x = Longitude;
+ p.y = Latitude;
+ p.z = Height;
+ return p;
+ }, // geocentric_to_geodetic_noniter()
+
+ /****************************************************************/
+ // pj_geocentic_to_wgs84( p )
+ // p = point to transform in geocentric coordinates (x,y,z)
+ geocentric_to_wgs84 : function ( p ) {
+
+ if( this.datum_type == Proj4js.common.PJD_3PARAM )
+ {
+ // if( x[io] == HUGE_VAL )
+ // continue;
+ p.x += this.datum_params[0];
+ p.y += this.datum_params[1];
+ p.z += this.datum_params[2];
+
+ }
+ else if (this.datum_type == Proj4js.common.PJD_7PARAM)
+ {
+ var Dx_BF =this.datum_params[0];
+ var Dy_BF =this.datum_params[1];
+ var Dz_BF =this.datum_params[2];
+ var Rx_BF =this.datum_params[3];
+ var Ry_BF =this.datum_params[4];
+ var Rz_BF =this.datum_params[5];
+ var M_BF =this.datum_params[6];
+ // if( x[io] == HUGE_VAL )
+ // continue;
+ var x_out = M_BF*( p.x - Rz_BF*p.y + Ry_BF*p.z) + Dx_BF;
+ var y_out = M_BF*( Rz_BF*p.x + p.y - Rx_BF*p.z) + Dy_BF;
+ var z_out = M_BF*(-Ry_BF*p.x + Rx_BF*p.y + p.z) + Dz_BF;
+ p.x = x_out;
+ p.y = y_out;
+ p.z = z_out;
+ }
+ }, // cs_geocentric_to_wgs84
+
+ /****************************************************************/
+ // pj_geocentic_from_wgs84()
+ // coordinate system definition,
+ // point to transform in geocentric coordinates (x,y,z)
+ geocentric_from_wgs84 : function( p ) {
+
+ if( this.datum_type == Proj4js.common.PJD_3PARAM )
+ {
+ //if( x[io] == HUGE_VAL )
+ // continue;
+ p.x -= this.datum_params[0];
+ p.y -= this.datum_params[1];
+ p.z -= this.datum_params[2];
+
+ }
+ else if (this.datum_type == Proj4js.common.PJD_7PARAM)
+ {
+ var Dx_BF =this.datum_params[0];
+ var Dy_BF =this.datum_params[1];
+ var Dz_BF =this.datum_params[2];
+ var Rx_BF =this.datum_params[3];
+ var Ry_BF =this.datum_params[4];
+ var Rz_BF =this.datum_params[5];
+ var M_BF =this.datum_params[6];
+ var x_tmp = (p.x - Dx_BF) / M_BF;
+ var y_tmp = (p.y - Dy_BF) / M_BF;
+ var z_tmp = (p.z - Dz_BF) / M_BF;
+ //if( x[io] == HUGE_VAL )
+ // continue;
+
+ p.x = x_tmp + Rz_BF*y_tmp - Ry_BF*z_tmp;
+ p.y = -Rz_BF*x_tmp + y_tmp + Rx_BF*z_tmp;
+ p.z = Ry_BF*x_tmp - Rx_BF*y_tmp + z_tmp;
+ } //cs_geocentric_from_wgs84()
+ }
+});
+
+/** point object, nothing fancy, just allows values to be
+ passed back and forth by reference rather than by value.
+ Other point classes may be used as long as they have
+ x and y properties, which will get modified in the transform method.
+*/
+Proj4js.Point = Proj4js.Class({
+
+ /**
+ * Constructor! Proj4js.Point
+ *
+ * Parameters:
+ * - x {float} or {Array} either the first coordinates component or
+ * the full coordinates
+ * - y {float} the second component
+ * - z {float} the third component, optional.
+ */
+ initialize : function(x,y,z) {
+ if (typeof x == 'object') {
+ this.x = x[0];
+ this.y = x[1];
+ this.z = x[2] || 0.0;
+ } else if (typeof x == 'string') {
+ var coords = x.split(',');
+ this.x = parseFloat(coords[0]);
+ this.y = parseFloat(coords[1]);
+ this.z = parseFloat(coords[2]) || 0.0;
+ } else {
+ this.x = x;
+ this.y = y;
+ this.z = z || 0.0;
+ }
+ },
+
+ /**
+ * APIMethod: clone
+ * Build a copy of a Proj4js.Point object.
+ *
+ * Return:
+ * {Proj4js}.Point the cloned point.
+ */
+ clone : function() {
+ return new Proj4js.Point(this.x, this.y, this.z);
+ },
+
+ /**
+ * APIMethod: toString
+ * Return a readable string version of the point
+ *
+ * Return:
+ * {String} String representation of Proj4js.Point object.
+ * (ex. <i>"x=5,y=42"</i>)
+ */
+ toString : function() {
+ return ("x=" + this.x + ",y=" + this.y);
+ },
+
+ /**
+ * APIMethod: toShortString
+ * Return a short string version of the point.
+ *
+ * Return:
+ * {String} Shortened String representation of Proj4js.Point object.
+ * (ex. <i>"5, 42"</i>)
+ */
+ toShortString : function() {
+ return (this.x + ", " + this.y);
+ }
+});
+
+Proj4js.PrimeMeridian = {
+ "greenwich": 0.0, //"0dE",
+ "lisbon": -9.131906111111, //"9d07'54.862\"W",
+ "paris": 2.337229166667, //"2d20'14.025\"E",
+ "bogota": -74.080916666667, //"74d04'51.3\"W",
+ "madrid": -3.687938888889, //"3d41'16.58\"W",
+ "rome": 12.452333333333, //"12d27'8.4\"E",
+ "bern": 7.439583333333, //"7d26'22.5\"E",
+ "jakarta": 106.807719444444, //"106d48'27.79\"E",
+ "ferro": -17.666666666667, //"17d40'W",
+ "brussels": 4.367975, //"4d22'4.71\"E",
+ "stockholm": 18.058277777778, //"18d3'29.8\"E",
+ "athens": 23.7163375, //"23d42'58.815\"E",
+ "oslo": 10.722916666667 //"10d43'22.5\"E"
+};
+
+Proj4js.Ellipsoid = {
+ "MERIT": {a:6378137.0, rf:298.257, ellipseName:"MERIT 1983"},
+ "SGS85": {a:6378136.0, rf:298.257, ellipseName:"Soviet Geodetic System 85"},
+ "GRS80": {a:6378137.0, rf:298.257222101, ellipseName:"GRS 1980(IUGG, 1980)"},
+ "IAU76": {a:6378140.0, rf:298.257, ellipseName:"IAU 1976"},
+ "airy": {a:6377563.396, b:6356256.910, ellipseName:"Airy 1830"},
+ "APL4.": {a:6378137, rf:298.25, ellipseName:"Appl. Physics. 1965"},
+ "NWL9D": {a:6378145.0, rf:298.25, ellipseName:"Naval Weapons Lab., 1965"},
+ "mod_airy": {a:6377340.189, b:6356034.446, ellipseName:"Modified Airy"},
+ "andrae": {a:6377104.43, rf:300.0, ellipseName:"Andrae 1876 (Den., Iclnd.)"},
+ "aust_SA": {a:6378160.0, rf:298.25, ellipseName:"Australian Natl & S. Amer. 1969"},
+ "GRS67": {a:6378160.0, rf:298.2471674270, ellipseName:"GRS 67(IUGG 1967)"},
+ "bessel": {a:6377397.155, rf:299.1528128, ellipseName:"Bessel 1841"},
+ "bess_nam": {a:6377483.865, rf:299.1528128, ellipseName:"Bessel 1841 (Namibia)"},
+ "clrk66": {a:6378206.4, b:6356583.8, ellipseName:"Clarke 1866"},
+ "clrk80": {a:6378249.145, rf:293.4663, ellipseName:"Clarke 1880 mod."},
+ "CPM": {a:6375738.7, rf:334.29, ellipseName:"Comm. des Poids et Mesures 1799"},
+ "delmbr": {a:6376428.0, rf:311.5, ellipseName:"Delambre 1810 (Belgium)"},
+ "engelis": {a:6378136.05, rf:298.2566, ellipseName:"Engelis 1985"},
+ "evrst30": {a:6377276.345, rf:300.8017, ellipseName:"Everest 1830"},
+ "evrst48": {a:6377304.063, rf:300.8017, ellipseName:"Everest 1948"},
+ "evrst56": {a:6377301.243, rf:300.8017, ellipseName:"Everest 1956"},
+ "evrst69": {a:6377295.664, rf:300.8017, ellipseName:"Everest 1969"},
+ "evrstSS": {a:6377298.556, rf:300.8017, ellipseName:"Everest (Sabah & Sarawak)"},
+ "fschr60": {a:6378166.0, rf:298.3, ellipseName:"Fischer (Mercury Datum) 1960"},
+ "fschr60m": {a:6378155.0, rf:298.3, ellipseName:"Fischer 1960"},
+ "fschr68": {a:6378150.0, rf:298.3, ellipseName:"Fischer 1968"},
+ "helmert": {a:6378200.0, rf:298.3, ellipseName:"Helmert 1906"},
+ "hough": {a:6378270.0, rf:297.0, ellipseName:"Hough"},
+ "intl": {a:6378388.0, rf:297.0, ellipseName:"International 1909 (Hayford)"},
+ "kaula": {a:6378163.0, rf:298.24, ellipseName:"Kaula 1961"},
+ "lerch": {a:6378139.0, rf:298.257, ellipseName:"Lerch 1979"},
+ "mprts": {a:6397300.0, rf:191.0, ellipseName:"Maupertius 1738"},
+ "new_intl": {a:6378157.5, b:6356772.2, ellipseName:"New International 1967"},
+ "plessis": {a:6376523.0, rf:6355863.0, ellipseName:"Plessis 1817 (France)"},
+ "krass": {a:6378245.0, rf:298.3, ellipseName:"Krassovsky, 1942"},
+ "SEasia": {a:6378155.0, b:6356773.3205, ellipseName:"Southeast Asia"},
+ "walbeck": {a:6376896.0, b:6355834.8467, ellipseName:"Walbeck"},
+ "WGS60": {a:6378165.0, rf:298.3, ellipseName:"WGS 60"},
+ "WGS66": {a:6378145.0, rf:298.25, ellipseName:"WGS 66"},
+ "WGS72": {a:6378135.0, rf:298.26, ellipseName:"WGS 72"},
+ "WGS84": {a:6378137.0, rf:298.257223563, ellipseName:"WGS 84"},
+ "sphere": {a:6370997.0, b:6370997.0, ellipseName:"Normal Sphere (r=6370997)"}
+};
+
+Proj4js.Datum = {
+ "WGS84": {towgs84: "0,0,0", ellipse: "WGS84", datumName: "WGS84"},
+ "GGRS87": {towgs84: "-199.87,74.79,246.62", ellipse: "GRS80", datumName: "Greek_Geodetic_Reference_System_1987"},
+ "NAD83": {towgs84: "0,0,0", ellipse: "GRS80", datumName: "North_American_Datum_1983"},
+ "NAD27": {nadgrids: "@conus, at alaska, at ntv2_0.gsb, at ntv1_can.dat", ellipse: "clrk66", datumName: "North_American_Datum_1927"},
+ "potsdam": {towgs84: "606.0,23.0,413.0", ellipse: "bessel", datumName: "Potsdam Rauenberg 1950 DHDN"},
+ "carthage": {towgs84: "-263.0,6.0,431.0", ellipse: "clark80", datumName: "Carthage 1934 Tunisia"},
+ "hermannskogel": {towgs84: "653.0,-212.0,449.0", ellipse: "bessel", datumName: "Hermannskogel"},
+ "ire65": {towgs84: "482.530,-130.596,564.557,-1.042,-0.214,-0.631,8.15", ellipse: "mod_airy", datumName: "Ireland 1965"},
+ "nzgd49": {towgs84: "59.47,-5.04,187.44,0.47,-0.1,1.024,-4.5993", ellipse: "intl", datumName: "New Zealand Geodetic Datum 1949"},
+ "OSGB36": {towgs84: "446.448,-125.157,542.060,0.1502,0.2470,0.8421,-20.4894", ellipse: "airy", datumName: "Airy 1830"}
+};
+
+Proj4js.WGS84 = new Proj4js.Proj('WGS84');
+Proj4js.Datum['OSB36'] = Proj4js.Datum['OSGB36']; //as returned from spatialreference.org
+/* ======================================================================
+ projCode/aea.js
+ ====================================================================== */
+
+/*******************************************************************************
+NAME ALBERS CONICAL EQUAL AREA
+
+PURPOSE: Transforms input longitude and latitude to Easting and Northing
+ for the Albers Conical Equal Area projection. The longitude
+ and latitude must be in radians. The Easting and Northing
+ values will be returned in meters.
+
+PROGRAMMER DATE
+---------- ----
+T. Mittan, Feb, 1992
+
+ALGORITHM REFERENCES
+
+1. Snyder, John P., "Map Projections--A Working Manual", U.S. Geological
+ Survey Professional Paper 1395 (Supersedes USGS Bulletin 1532), United
+ State Government Printing Office, Washington D.C., 1987.
+
+2. Snyder, John P. and Voxland, Philip M., "An Album of Map Projections",
+ U.S. Geological Survey Professional Paper 1453 , United State Government
+ Printing Office, Washington D.C., 1989.
+*******************************************************************************/
+
+
+Proj4js.Proj.aea = {
+ init : function() {
+
+ if (Math.abs(this.lat1 + this.lat2) < Proj4js.common.EPSLN) {
+ Proj4js.reportError("aeaInitEqualLatitudes");
+ return;
+ }
+ this.temp = this.b / this.a;
+ this.es = 1.0 - Math.pow(this.temp,2);
+ this.e3 = Math.sqrt(this.es);
+
+ this.sin_po=Math.sin(this.lat1);
+ this.cos_po=Math.cos(this.lat1);
+ this.t1=this.sin_po
+ this.con = this.sin_po;
+ this.ms1 = Proj4js.common.msfnz(this.e3,this.sin_po,this.cos_po);
+ this.qs1 = Proj4js.common.qsfnz(this.e3,this.sin_po,this.cos_po);
+
+ this.sin_po=Math.sin(this.lat2);
+ this.cos_po=Math.cos(this.lat2);
+ this.t2=this.sin_po;
+ this.ms2 = Proj4js.common.msfnz(this.e3,this.sin_po,this.cos_po);
+ this.qs2 = Proj4js.common.qsfnz(this.e3,this.sin_po,this.cos_po);
+
+ this.sin_po=Math.sin(this.lat0);
+ this.cos_po=Math.cos(this.lat0);
+ this.t3=this.sin_po;
+ this.qs0 = Proj4js.common.qsfnz(this.e3,this.sin_po,this.cos_po);
+
+ if (Math.abs(this.lat1 - this.lat2) > Proj4js.common.EPSLN) {
+ this.ns0 = (this.ms1 * this.ms1 - this.ms2 *this.ms2)/ (this.qs2 - this.qs1);
+ } else {
+ this.ns0 = this.con;
+ }
+ this.c = this.ms1 * this.ms1 + this.ns0 * this.qs1;
+ this.rh = this.a * Math.sqrt(this.c - this.ns0 * this.qs0)/this.ns0;
+ },
+
+/* Albers Conical Equal Area forward equations--mapping lat,long to x,y
+ -------------------------------------------------------------------*/
+ forward: function(p){
+
+ var lon=p.x;
+ var lat=p.y;
+
+ this.sin_phi=Math.sin(lat);
+ this.cos_phi=Math.cos(lat);
+
+ var qs = Proj4js.common.qsfnz(this.e3,this.sin_phi,this.cos_phi);
+ var rh1 =this.a * Math.sqrt(this.c - this.ns0 * qs)/this.ns0;
+ var theta = this.ns0 * Proj4js.common.adjust_lon(lon - this.long0);
+ var x = rh1 * Math.sin(theta) + this.x0;
+ var y = this.rh - rh1 * Math.cos(theta) + this.y0;
+
+ p.x = x;
+ p.y = y;
+ return p;
+ },
+
+
+ inverse: function(p) {
+ var rh1,qs,con,theta,lon,lat;
+
+ p.x -= this.x0;
+ p.y = this.rh - p.y + this.y0;
+ if (this.ns0 >= 0) {
+ rh1 = Math.sqrt(p.x *p.x + p.y * p.y);
+ con = 1.0;
+ } else {
+ rh1 = -Math.sqrt(p.x * p.x + p.y *p.y);
+ con = -1.0;
+ }
+ theta = 0.0;
+ if (rh1 != 0.0) {
+ theta = Math.atan2(con * p.x, con * p.y);
+ }
+ con = rh1 * this.ns0 / this.a;
+ qs = (this.c - con * con) / this.ns0;
+ if (this.e3 >= 1e-10) {
+ con = 1 - .5 * (1.0 -this.es) * Math.log((1.0 - this.e3) / (1.0 + this.e3))/this.e3;
+ if (Math.abs(Math.abs(con) - Math.abs(qs)) > .0000000001 ) {
+ lat = this.phi1z(this.e3,qs);
+ } else {
+ if (qs >= 0) {
+ lat = .5 * PI;
+ } else {
+ lat = -.5 * PI;
+ }
+ }
+ } else {
+ lat = this.phi1z(e3,qs);
+ }
+
+ lon = Proj4js.common.adjust_lon(theta/this.ns0 + this.long0);
+ p.x = lon;
+ p.y = lat;
+ return p;
+ },
+
+/* Function to compute phi1, the latitude for the inverse of the
+ Albers Conical Equal-Area projection.
+-------------------------------------------*/
+ phi1z: function (eccent,qs) {
+ var con, com, dphi;
+ var phi = Proj4js.common.asinz(.5 * qs);
+ if (eccent < Proj4js.common.EPSLN) return phi;
+
+ var eccnts = eccent * eccent;
+ for (var i = 1; i <= 25; i++) {
+ sinphi = Math.sin(phi);
+ cosphi = Math.cos(phi);
+ con = eccent * sinphi;
+ com = 1.0 - con * con;
+ dphi = .5 * com * com / cosphi * (qs / (1.0 - eccnts) - sinphi / com + .5 / eccent * Math.log((1.0 - con) / (1.0 + con)));
+ phi = phi + dphi;
+ if (Math.abs(dphi) <= 1e-7) return phi;
+ }
+ Proj4js.reportError("aea:phi1z:Convergence error");
+ return null;
+ }
+
+};
+
+
+
+/* ======================================================================
+ projCode/sterea.js
+ ====================================================================== */
+
+
+Proj4js.Proj.sterea = {
+ dependsOn : 'gauss',
+
+ init : function() {
+ Proj4js.Proj['gauss'].init.apply(this);
+ if (!this.rc) {
+ Proj4js.reportError("sterea:init:E_ERROR_0");
+ return;
+ }
+ this.sinc0 = Math.sin(this.phic0);
+ this.cosc0 = Math.cos(this.phic0);
+ this.R2 = 2.0 * this.rc;
+ if (!this.title) this.title = "Oblique Stereographic Alternative";
+ },
+
+ forward : function(p) {
+ p.x = Proj4js.common.adjust_lon(p.x-this.long0); /* adjust del longitude */
+ Proj4js.Proj['gauss'].forward.apply(this, [p]);
+ sinc = Math.sin(p.y);
+ cosc = Math.cos(p.y);
+ cosl = Math.cos(p.x);
+ k = this.k0 * this.R2 / (1.0 + this.sinc0 * sinc + this.cosc0 * cosc * cosl);
+ p.x = k * cosc * Math.sin(p.x);
+ p.y = k * (this.cosc0 * sinc - this.sinc0 * cosc * cosl);
+ p.x = this.a * p.x + this.x0;
+ p.y = this.a * p.y + this.y0;
+ return p;
+ },
+
+ inverse : function(p) {
+ var lon,lat;
+ p.x = (p.x - this.x0) / this.a; /* descale and de-offset */
+ p.y = (p.y - this.y0) / this.a;
+
+ p.x /= this.k0;
+ p.y /= this.k0;
+ if ( (rho = Math.sqrt(p.x*p.x + p.y*p.y)) ) {
+ c = 2.0 * Math.atan2(rho, this.R2);
+ sinc = Math.sin(c);
+ cosc = Math.cos(c);
+ lat = Math.asin(cosc * this.sinc0 + p.y * sinc * this.cosc0 / rho);
+ lon = Math.atan2(p.x * sinc, rho * this.cosc0 * cosc - p.y * this.sinc0 * sinc);
+ } else {
+ lat = this.phic0;
+ lon = 0.;
+ }
+
+ p.x = lon;
+ p.y = lat;
+ Proj4js.Proj['gauss'].inverse.apply(this,[p]);
+ p.x = Proj4js.common.adjust_lon(p.x + this.long0); /* adjust longitude to CM */
+ return p;
+ }
+};
+
+/* ======================================================================
+ projCode/poly.js
+ ====================================================================== */
+
+/* Function to compute, phi4, the latitude for the inverse of the
+ Polyconic projection.
+------------------------------------------------------------*/
+function phi4z (eccent,e0,e1,e2,e3,a,b,c,phi) {
+ var sinphi, sin2ph, tanph, ml, mlp, con1, con2, con3, dphi, i;
+
+ phi = a;
+ for (i = 1; i <= 15; i++) {
+ sinphi = Math.sin(phi);
+ tanphi = Math.tan(phi);
+ c = tanphi * Math.sqrt (1.0 - eccent * sinphi * sinphi);
+ sin2ph = Math.sin (2.0 * phi);
+ /*
+ ml = e0 * *phi - e1 * sin2ph + e2 * sin (4.0 * *phi);
+ mlp = e0 - 2.0 * e1 * cos (2.0 * *phi) + 4.0 * e2 * cos (4.0 * *phi);
+ */
+ ml = e0 * phi - e1 * sin2ph + e2 * Math.sin (4.0 * phi) - e3 * Math.sin (6.0 * phi);
+ mlp = e0 - 2.0 * e1 * Math.cos (2.0 * phi) + 4.0 * e2 * Math.cos (4.0 * phi) - 6.0 * e3 * Math.cos (6.0 * phi);
+ con1 = 2.0 * ml + c * (ml * ml + b) - 2.0 * a * (c * ml + 1.0);
+ con2 = eccent * sin2ph * (ml * ml + b - 2.0 * a * ml) / (2.0 *c);
+ con3 = 2.0 * (a - ml) * (c * mlp - 2.0 / sin2ph) - 2.0 * mlp;
+ dphi = con1 / (con2 + con3);
+ phi += dphi;
+ if (Math.abs(dphi) <= .0000000001 ) return(phi);
+ }
+ Proj4js.reportError("phi4z: No convergence");
+ return null;
+}
+
+
+/* Function to compute the constant e4 from the input of the eccentricity
+ of the spheroid, x. This constant is used in the Polar Stereographic
+ projection.
+--------------------------------------------------------------------*/
+function e4fn(x) {
+ var con, com;
+ con = 1.0 + x;
+ com = 1.0 - x;
+ return (Math.sqrt((Math.pow(con,con))*(Math.pow(com,com))));
+}
+
+
+
+
+
+/*******************************************************************************
+NAME POLYCONIC
+
+PURPOSE: Transforms input longitude and latitude to Easting and
+ Northing for the Polyconic projection. The
+ longitude and latitude must be in radians. The Easting
+ and Northing values will be returned in meters.
+
+PROGRAMMER DATE
+---------- ----
+T. Mittan Mar, 1993
+
+ALGORITHM REFERENCES
+
+1. Snyder, John P., "Map Projections--A Working Manual", U.S. Geological
+ Survey Professional Paper 1395 (Supersedes USGS Bulletin 1532), United
+ State Government Printing Office, Washington D.C., 1987.
+
+2. Snyder, John P. and Voxland, Philip M., "An Album of Map Projections",
+ U.S. Geological Survey Professional Paper 1453 , United State Government
+ Printing Office, Washington D.C., 1989.
+*******************************************************************************/
+
+Proj4js.Proj.poly = {
+
+ /* Initialize the POLYCONIC projection
+ ----------------------------------*/
+ init: function() {
+ var temp; /* temporary variable */
+ if (this.lat0=0) this.lat0=90;//this.lat0 ca
+
+ /* Place parameters in static storage for common use
+ -------------------------------------------------*/
+ this.temp = this.b / this.a;
+ this.es = 1.0 - Math.pow(this.temp,2);// devait etre dans tmerc.js mais n y est pas donc je commente sinon retour de valeurs nulles
+ this.e = Math.sqrt(this.es);
+ this.e0 = Proj4js.common.e0fn(this.es);
+ this.e1 = Proj4js.common.e1fn(this.es);
+ this.e2 = Proj4js.common.e2fn(this.es);
+ this.e3 = Proj4js.common.e3fn(this.es);
+ this.ml0 = Proj4js.common.mlfn(this.e0, this.e1,this.e2, this.e3, this.lat0);//si que des zeros le calcul ne se fait pas
+ //if (!this.ml0) {this.ml0=0;}
+ },
+
+
+ /* Polyconic forward equations--mapping lat,long to x,y
+ ---------------------------------------------------*/
+ forward: function(p) {
+ var sinphi, cosphi; /* sin and cos value */
+ var al; /* temporary values */
+ var c; /* temporary values */
+ var con, ml; /* cone constant, small m */
+ var ms; /* small m */
+ var x,y;
+
+ var lon=p.x;
+ var lat=p.y;
+
+ con = Proj4js.common.adjust_lon(lon - this.long0);
+ if (Math.abs(lat) <= .0000001) {
+ x = this.x0 + this.a * con;
+ y = this.y0 - this.a * this.ml0;
+ } else {
+ sinphi = Math.sin(lat);
+ cosphi = Math.cos(lat);
+
+ ml = Proj4js.common.mlfn(this.e0, this.e1, this.e2, this.e3, lat);
+ ms = Proj4js.common.msfnz(this.e,sinphi,cosphi);
+ con = sinphi;
+ x = this.x0 + this.a * ms * Math.sin(con)/sinphi;
+ y = this.y0 + this.a * (ml - this.ml0 + ms * (1.0 - Math.cos(con))/sinphi);
+ }
+
+ p.x=x;
+ p.y=y;
+ return p;
+ },
+
+
+ /* Inverse equations
+ -----------------*/
+ inverse: function(p) {
+ var sin_phi, cos_phi; /* sin and cos value */
+ var al; /* temporary values */
+ var b; /* temporary values */
+ var c; /* temporary values */
+ var con, ml; /* cone constant, small m */
+ var iflg; /* error flag */
+ var lon,lat;
+ p.x -= this.x0;
+ p.y -= this.y0;
+ al = this.ml0 + p.y/this.a;
+ iflg = 0;
+
+ if (Math.abs(al) <= .0000001) {
+ lon = p.x/this.a + this.long0;
+ lat = 0.0;
+ } else {
+ b = al * al + (p.x/this.a) * (p.x/this.a);
+ iflg = phi4z(this.es,this.e0,this.e1,this.e2,this.e3,this.al,b,c,lat);
+ if (iflg != 1) return(iflg);
+ lon = Proj4js.common.adjust_lon((asinz(p.x * c / this.a) / Math.sin(lat)) + this.long0);
+ }
+
+ p.x=lon;
+ p.y=lat;
+ return p;
+ }
+};
+
+
+
+/* ======================================================================
+ projCode/equi.js
+ ====================================================================== */
+
+/*******************************************************************************
+NAME EQUIRECTANGULAR
+
+PURPOSE: Transforms input longitude and latitude to Easting and
+ Northing for the Equirectangular projection. The
+ longitude and latitude must be in radians. The Easting
+ and Northing values will be returned in meters.
+
+PROGRAMMER DATE
+---------- ----
+T. Mittan Mar, 1993
+
+ALGORITHM REFERENCES
+
+1. Snyder, John P., "Map Projections--A Working Manual", U.S. Geological
+ Survey Professional Paper 1395 (Supersedes USGS Bulletin 1532), United
+ State Government Printing Office, Washington D.C., 1987.
+
+2. Snyder, John P. and Voxland, Philip M., "An Album of Map Projections",
+ U.S. Geological Survey Professional Paper 1453 , United State Government
+ Printing Office, Washington D.C., 1989.
+*******************************************************************************/
+Proj4js.Proj.equi = {
+
+ init: function() {
+ if(!this.x0) this.x0=0;
+ if(!this.y0) this.y0=0;
+ if(!this.lat0) this.lat0=0;
+ if(!this.long0) this.long0=0;
+ ///this.t2;
+ },
+
+
+
+/* Equirectangular forward equations--mapping lat,long to x,y
+ ---------------------------------------------------------*/
+ forward: function(p) {
+
+ var lon=p.x;
+ var lat=p.y;
+
+ var dlon = Proj4js.common.adjust_lon(lon - this.long0);
+ var x = this.x0 +this. a * dlon *Math.cos(this.lat0);
+ var y = this.y0 + this.a * lat;
+
+ this.t1=x;
+ this.t2=Math.cos(this.lat0);
+ p.x=x;
+ p.y=y;
+ return p;
+ }, //equiFwd()
+
+
+
+/* Equirectangular inverse equations--mapping x,y to lat/long
+ ---------------------------------------------------------*/
+ inverse: function(p) {
+
+ p.x -= this.x0;
+ p.y -= this.y0;
+ var lat = p.y /this. a;
+
+ if ( Math.abs(lat) > Proj4js.common.HALF_PI) {
+ Proj4js.reportError("equi:Inv:DataError");
+ }
+ var lon = Proj4js.common.adjust_lon(this.long0 + p.x / (this.a * Math.cos(this.lat0)));
+ p.x=lon;
+ p.y=lat;
+ }//equiInv()
+};
+
+
+/* ======================================================================
+ projCode/merc.js
+ ====================================================================== */
+
+/*******************************************************************************
+NAME MERCATOR
+
+PURPOSE: Transforms input longitude and latitude to Easting and
+ Northing for the Mercator projection. The
+ longitude and latitude must be in radians. The Easting
+ and Northing values will be returned in meters.
+
+PROGRAMMER DATE
+---------- ----
+D. Steinwand, EROS Nov, 1991
+T. Mittan Mar, 1993
+
+ALGORITHM REFERENCES
+
+1. Snyder, John P., "Map Projections--A Working Manual", U.S. Geological
+ Survey Professional Paper 1395 (Supersedes USGS Bulletin 1532), United
+ State Government Printing Office, Washington D.C., 1987.
+
+2. Snyder, John P. and Voxland, Philip M., "An Album of Map Projections",
+ U.S. Geological Survey Professional Paper 1453 , United State Government
+ Printing Office, Washington D.C., 1989.
+*******************************************************************************/
+
+//static double r_major = a; /* major axis */
+//static double r_minor = b; /* minor axis */
+//static double lon_center = long0; /* Center longitude (projection center) */
+//static double lat_origin = lat0; /* center latitude */
+//static double e,es; /* eccentricity constants */
+//static double m1; /* small value m */
+//static double false_northing = y0; /* y offset in meters */
+//static double false_easting = x0; /* x offset in meters */
+//scale_fact = k0
+
+Proj4js.Proj.merc = {
+ init : function() {
+ //?this.temp = this.r_minor / this.r_major;
+ //this.temp = this.b / this.a;
+ //this.es = 1.0 - Math.sqrt(this.temp);
+ //this.e = Math.sqrt( this.es );
+ //?this.m1 = Math.cos(this.lat_origin) / (Math.sqrt( 1.0 - this.es * Math.sin(this.lat_origin) * Math.sin(this.lat_origin)));
+ //this.m1 = Math.cos(0.0) / (Math.sqrt( 1.0 - this.es * Math.sin(0.0) * Math.sin(0.0)));
+ if (this.lat_ts) {
+ if (this.sphere) {
+ this.k0 = Math.cos(this.lat_ts);
+ } else {
+ this.k0 = Proj4js.common.msfnz(this.es, Math.sin(this.lat_ts), Math.cos(this.lat_ts));
+ }
+ }
+ },
+
+/* Mercator forward equations--mapping lat,long to x,y
+ --------------------------------------------------*/
+
+ forward : function(p) {
+ //alert("ll2m coords : "+coords);
+ var lon = p.x;
+ var lat = p.y;
+ // convert to radians
+ if ( lat*Proj4js.common.R2D > 90.0 &&
+ lat*Proj4js.common.R2D < -90.0 &&
+ lon*Proj4js.common.R2D > 180.0 &&
+ lon*Proj4js.common.R2D < -180.0) {
+ Proj4js.reportError("merc:forward: llInputOutOfRange: "+ lon +" : " + lat);
+ return null;
+ }
+
+ var x,y;
+ if(Math.abs( Math.abs(lat) - Proj4js.common.HALF_PI) <= Proj4js.common.EPSLN) {
+ Proj4js.reportError("merc:forward: ll2mAtPoles");
+ return null;
+ } else {
+ if (this.sphere) {
+ x = this.x0 + this.a * this.k0 * Proj4js.common.adjust_lon(lon - this.long0);
+ y = this.y0 + this.a * this.k0 * Math.log(Math.tan(Proj4js.common.FORTPI + 0.5*lat));
+ } else {
+ var sinphi = Math.sin(lat);
+ var ts = Proj4js.common.tsfnz(this.e,lat,sinphi);
+ x = this.x0 + this.a * this.k0 * Proj4js.common.adjust_lon(lon - this.long0);
+ y = this.y0 - this.a * this.k0 * Math.log(ts);
+ }
+ p.x = x;
+ p.y = y;
+ return p;
+ }
+ },
+
+
+ /* Mercator inverse equations--mapping x,y to lat/long
+ --------------------------------------------------*/
+ inverse : function(p) {
+
+ var x = p.x - this.x0;
+ var y = p.y - this.y0;
+ var lon,lat;
+
+ if (this.sphere) {
+ lat = Proj4js.common.HALF_PI - 2.0 * Math.atan(Math.exp(-y / this.a * this.k0));
+ } else {
+ var ts = Math.exp(-y / (this.a * this.k0));
+ lat = Proj4js.common.phi2z(this.e,ts);
+ if(lat == -9999) {
+ Proj4js.reportError("merc:inverse: lat = -9999");
+ return null;
+ }
+ }
+ lon = Proj4js.common.adjust_lon(this.long0+ x / (this.a * this.k0));
+
+ p.x = lon;
+ p.y = lat;
+ return p;
+ }
+};
+
+
+/* ======================================================================
+ projCode/utm.js
+ ====================================================================== */
+
+/*******************************************************************************
+NAME TRANSVERSE MERCATOR
+
+PURPOSE: Transforms input longitude and latitude to Easting and
+ Northing for the Transverse Mercator projection. The
+ longitude and latitude must be in radians. The Easting
+ and Northing values will be returned in meters.
+
+ALGORITHM REFERENCES
+
+1. Snyder, John P., "Map Projections--A Working Manual", U.S. Geological
+ Survey Professional Paper 1395 (Supersedes USGS Bulletin 1532), United
+ State Government Printing Office, Washington D.C., 1987.
+
+2. Snyder, John P. and Voxland, Philip M., "An Album of Map Projections",
+ U.S. Geological Survey Professional Paper 1453 , United State Government
+ Printing Office, Washington D.C., 1989.
+*******************************************************************************/
+
+
+/**
+ Initialize Transverse Mercator projection
+*/
+
+Proj4js.Proj.utm = {
+ dependsOn : 'tmerc',
+
+ init : function() {
+ if (!this.zone) {
+ Proj4js.reportError("utm:init: zone must be specified for UTM");
+ return;
+ }
+ this.lat0 = 0.0;
+ this.long0 = ((6 * Math.abs(this.zone)) - 183) * Proj4js.common.D2R;
+ this.x0 = 500000.0;
+ this.y0 = this.utmSouth ? 10000000.0 : 0.0;
+ this.k0 = 0.9996;
+
+ Proj4js.Proj['tmerc'].init.apply(this);
+ this.forward = Proj4js.Proj['tmerc'].forward;
+ this.inverse = Proj4js.Proj['tmerc'].inverse;
+ }
+};
+/* ======================================================================
+ projCode/eqdc.js
+ ====================================================================== */
+
+/*******************************************************************************
+NAME EQUIDISTANT CONIC
+
+PURPOSE: Transforms input longitude and latitude to Easting and Northing
+ for the Equidistant Conic projection. The longitude and
+ latitude must be in radians. The Easting and Northing values
+ will be returned in meters.
+
+PROGRAMMER DATE
+---------- ----
+T. Mittan Mar, 1993
+
+ALGORITHM REFERENCES
+
+1. Snyder, John P., "Map Projections--A Working Manual", U.S. Geological
+ Survey Professional Paper 1395 (Supersedes USGS Bulletin 1532), United
+ State Government Printing Office, Washington D.C., 1987.
+
+2. Snyder, John P. and Voxland, Philip M., "An Album of Map Projections",
+ U.S. Geological Survey Professional Paper 1453 , United State Government
+ Printing Office, Washington D.C., 1989.
+*******************************************************************************/
+
+/* Variables common to all subroutines in this code file
+ -----------------------------------------------------*/
+
+Proj4js.Proj.eqdc = {
+
+/* Initialize the Equidistant Conic projection
+ ------------------------------------------*/
+ init: function() {
+
+ /* Place parameters in static storage for common use
+ -------------------------------------------------*/
+
+ if(!this.mode) this.mode=0;//chosen default mode
+ this.temp = this.b / this.a;
+ this.es = 1.0 - Math.pow(this.temp,2);
+ this.e = Math.sqrt(this.es);
+ this.e0 = Proj4js.common.e0fn(this.es);
+ this.e1 = Proj4js.common.e1fn(this.es);
+ this.e2 = Proj4js.common.e2fn(this.es);
+ this.e3 = Proj4js.common.e3fn(this.es);
+
+ this.sinphi=Math.sin(this.lat1);
+ this.cosphi=Math.cos(this.lat1);
+
+ this.ms1 = Proj4js.common.msfnz(this.e,this.sinphi,this.cosphi);
+ this.ml1 = Proj4js.common.mlfn(this.e0, this.e1, this.e2,this.e3, this.lat1);
+
+ /* format B
+ ---------*/
+ if (this.mode != 0) {
+ if (Math.abs(this.lat1 + this.lat2) < Proj4js.common.EPSLN) {
+ Proj4js.reportError("eqdc:Init:EqualLatitudes");
+ //return(81);
+ }
+ this.sinphi=Math.sin(this.lat2);
+ this.cosphi=Math.cos(this.lat2);
+
+ this.ms2 = Proj4js.common.msfnz(this.e,this.sinphi,this.cosphi);
+ this.ml2 = Proj4js.common.mlfn(this.e0, this.e1, this.e2, this.e3, this.lat2);
+ if (Math.abs(this.lat1 - this.lat2) >= Proj4js.common.EPSLN) {
+ this.ns = (this.ms1 - this.ms2) / (this.ml2 - this.ml1);
+ } else {
+ this.ns = this.sinphi;
+ }
+ } else {
+ this.ns = this.sinphi;
+ }
+ this.g = this.ml1 + this.ms1/this.ns;
+ this.ml0 = Proj4js.common.mlfn(this.e0, this.e1,this. e2, this.e3, this.lat0);
+ this.rh = this.a * (this.g - this.ml0);
+ },
+
+
+/* Equidistant Conic forward equations--mapping lat,long to x,y
+ -----------------------------------------------------------*/
+ forward: function(p) {
+ var lon=p.x;
+ var lat=p.y;
+
+ /* Forward equations
+ -----------------*/
+ var ml = Proj4js.common.mlfn(this.e0, this.e1, this.e2, this.e3, lat);
+ var rh1 = this.a * (this.g - ml);
+ var theta = this.ns * Proj4js.common.adjust_lon(lon - this.long0);
+
+ var x = this.x0 + rh1 * Math.sin(theta);
+ var y = this.y0 + this.rh - rh1 * Math.cos(theta);
+ p.x=x;
+ p.y=y;
+ return p;
+ },
+
+/* Inverse equations
+ -----------------*/
+ inverse: function(p) {
+ p.x -= this.x0;
+ p.y = this.rh - p.y + this.y0;
+ var con, rh1;
+ if (this.ns >= 0) {
+ var rh1 = Math.sqrt(p.x *p.x + p.y * p.y);
+ var con = 1.0;
+ } else {
+ rh1 = -Math.sqrt(p.x *p. x +p. y * p.y);
+ con = -1.0;
+ }
+ var theta = 0.0;
+ if (rh1 != 0.0) theta = Math.atan2(con *p.x, con *p.y);
+ var ml = this.g - rh1 /this.a;
+ var lat = this.phi3z(this.ml,this.e0,this.e1,this.e2,this.e3);
+ var lon = Proj4js.common.adjust_lon(this.long0 + theta / this.ns);
+
+ p.x=lon;
+ p.y=lat;
+ return p;
+ },
+
+/* Function to compute latitude, phi3, for the inverse of the Equidistant
+ Conic projection.
+-----------------------------------------------------------------*/
+ phi3z: function(ml,e0,e1,e2,e3) {
+ var phi;
+ var dphi;
+
+ phi = ml;
+ for (var i = 0; i < 15; i++) {
+ dphi = (ml + e1 * Math.sin(2.0 * phi) - e2 * Math.sin(4.0 * phi) + e3 * Math.sin(6.0 * phi))/ e0 - phi;
+ phi += dphi;
+ if (Math.abs(dphi) <= .0000000001) {
+ return phi;
+ }
+ }
+ Proj4js.reportError("PHI3Z-CONV:Latitude failed to converge after 15 iterations");
+ return null;
+ }
+
+
+};
+/* ======================================================================
+ projCode/tmerc.js
+ ====================================================================== */
+
+/*******************************************************************************
+NAME TRANSVERSE MERCATOR
+
+PURPOSE: Transforms input longitude and latitude to Easting and
+ Northing for the Transverse Mercator projection. The
+ longitude and latitude must be in radians. The Easting
+ and Northing values will be returned in meters.
+
+ALGORITHM REFERENCES
+
+1. Snyder, John P., "Map Projections--A Working Manual", U.S. Geological
+ Survey Professional Paper 1395 (Supersedes USGS Bulletin 1532), United
+ State Government Printing Office, Washington D.C., 1987.
+
+2. Snyder, John P. and Voxland, Philip M., "An Album of Map Projections",
+ U.S. Geological Survey Professional Paper 1453 , United State Government
+ Printing Office, Washington D.C., 1989.
+*******************************************************************************/
+
+
+/**
+ Initialize Transverse Mercator projection
+*/
+
+Proj4js.Proj.tmerc = {
+ init : function() {
+ this.e0 = Proj4js.common.e0fn(this.es);
+ this.e1 = Proj4js.common.e1fn(this.es);
+ this.e2 = Proj4js.common.e2fn(this.es);
+ this.e3 = Proj4js.common.e3fn(this.es);
+ this.ml0 = this.a * Proj4js.common.mlfn(this.e0, this.e1, this.e2, this.e3, this.lat0);
+ },
+
+ /**
+ Transverse Mercator Forward - long/lat to x/y
+ long/lat in radians
+ */
+ forward : function(p) {
+ var lon = p.x;
+ var lat = p.y;
+
+ var delta_lon = Proj4js.common.adjust_lon(lon - this.long0); // Delta longitude
+ var con; // cone constant
+ var x, y;
+ var sin_phi=Math.sin(lat);
+ var cos_phi=Math.cos(lat);
+
+ if (this.sphere) { /* spherical form */
+ var b = cos_phi * Math.sin(delta_lon);
+ if ((Math.abs(Math.abs(b) - 1.0)) < .0000000001) {
+ Proj4js.reportError("tmerc:forward: Point projects into infinity");
+ return(93);
+ } else {
+ x = .5 * this.a * this.k0 * Math.log((1.0 + b)/(1.0 - b));
+ con = Math.acos(cos_phi * Math.cos(delta_lon)/Math.sqrt(1.0 - b*b));
+ if (lat < 0) con = - con;
+ y = this.a * this.k0 * (con - this.lat0);
+ }
+ } else {
+ var al = cos_phi * delta_lon;
+ var als = Math.pow(al,2);
+ var c = this.ep2 * Math.pow(cos_phi,2);
+ var tq = Math.tan(lat);
+ var t = Math.pow(tq,2);
+ con = 1.0 - this.es * Math.pow(sin_phi,2);
+ var n = this.a / Math.sqrt(con);
+ var ml = this.a * Proj4js.common.mlfn(this.e0, this.e1, this.e2, this.e3, lat);
+
+ x = this.k0 * n * al * (1.0 + als / 6.0 * (1.0 - t + c + als / 20.0 * (5.0 - 18.0 * t + Math.pow(t,2) + 72.0 * c - 58.0 * this.ep2))) + this.x0;
+ y = this.k0 * (ml - this.ml0 + n * tq * (als * (0.5 + als / 24.0 * (5.0 - t + 9.0 * c + 4.0 * Math.pow(c,2) + als / 30.0 * (61.0 - 58.0 * t + Math.pow(t,2) + 600.0 * c - 330.0 * this.ep2))))) + this.y0;
+
+ }
+ p.x = x; p.y = y;
+ return p;
+ }, // tmercFwd()
+
+ /**
+ Transverse Mercator Inverse - x/y to long/lat
+ */
+ inverse : function(p) {
+ var con, phi; /* temporary angles */
+ var delta_phi; /* difference between longitudes */
+ var i;
+ var max_iter = 6; /* maximun number of iterations */
+ var lat, lon;
+
+ if (this.sphere) { /* spherical form */
+ var f = Math.exp(p.x/(this.a * this.k0));
+ var g = .5 * (f - 1/f);
+ var temp = this.lat0 + p.y/(this.a * this.k0);
+ var h = Math.cos(temp);
+ con = Math.sqrt((1.0 - h * h)/(1.0 + g * g));
+ lat = Math.asinz(con);
+ if (temp < 0)
+ lat = -lat;
+ if ((g == 0) && (h == 0)) {
+ lon = this.long0;
+ } else {
+ lon = Proj4js.common.adjust_lon(Math.atan2(g,h) + this.long0);
+ }
+ } else { // ellipsoidal form
+ var x = p.x - this.x0;
+ var y = p.y - this.y0;
+
+ con = (this.ml0 + y / this.k0) / this.a;
+ phi = con;
+ for (i=0;;i++) {
+ delta_phi=((con + this.e1 * Math.sin(2.0*phi) - this.e2 * Math.sin(4.0*phi) + this.e3 * Math.sin(6.0*phi)) / this.e0) - phi;
+ phi += delta_phi;
+ if (Math.abs(delta_phi) <= Proj4js.common.EPSLN) break;
+ if (i >= max_iter) {
+ Proj4js.reportError("tmerc:inverse: Latitude failed to converge");
+ return(95);
+ }
+ } // for()
+ if (Math.abs(phi) < Proj4js.common.HALF_PI) {
+ // sincos(phi, &sin_phi, &cos_phi);
+ var sin_phi=Math.sin(phi);
+ var cos_phi=Math.cos(phi);
+ var tan_phi = Math.tan(phi);
+ var c = this.ep2 * Math.pow(cos_phi,2);
+ var cs = Math.pow(c,2);
+ var t = Math.pow(tan_phi,2);
+ var ts = Math.pow(t,2);
+ con = 1.0 - this.es * Math.pow(sin_phi,2);
+ var n = this.a / Math.sqrt(con);
+ var r = n * (1.0 - this.es) / con;
+ var d = x / (n * this.k0);
+ var ds = Math.pow(d,2);
+ lat = phi - (n * tan_phi * ds / r) * (0.5 - ds / 24.0 * (5.0 + 3.0 * t + 10.0 * c - 4.0 * cs - 9.0 * this.ep2 - ds / 30.0 * (61.0 + 90.0 * t + 298.0 * c + 45.0 * ts - 252.0 * this.ep2 - 3.0 * cs)));
+ lon = Proj4js.common.adjust_lon(this.long0 + (d * (1.0 - ds / 6.0 * (1.0 + 2.0 * t + c - ds / 20.0 * (5.0 - 2.0 * c + 28.0 * t - 3.0 * cs + 8.0 * this.ep2 + 24.0 * ts))) / cos_phi));
+ } else {
+ lat = Proj4js.common.HALF_PI * Proj4js.common.sign(y);
+ lon = this.long0;
+ }
+ }
+ p.x = lon;
+ p.y = lat;
+ return p;
+ } // tmercInv()
+};
+/* ======================================================================
+ defs/GOOGLE.js
+ ====================================================================== */
+
+Proj4js.defs["GOOGLE"]="+proj=merc +a=6378137 +b=6378137 +lat_ts=0.0 +lon_0=0.0 +x_0=0.0 +y_0=0 +k=1.0 +units=m +nadgrids=@null +no_defs";
+Proj4js.defs["EPSG:900913"]=Proj4js.defs["GOOGLE"];
+/* ======================================================================
+ projCode/gstmerc.js
+ ====================================================================== */
+
+Proj4js.Proj.gstmerc = {
+ init : function() {
+
+ // array of: a, b, lon0, lat0, k0, x0, y0
+ var temp= this.b / this.a;
+ this.e= Math.sqrt(1.0 - temp*temp);
+ this.lc= this.long0;
+ this.rs= Math.sqrt(1.0+this.e*this.e*Math.pow(Math.cos(this.lat0),4.0)/(1.0-this.e*this.e));
+ var sinz= Math.sin(this.lat0);
+ var pc= Math.asin(sinz/this.rs);
+ var sinzpc= Math.sin(pc);
+ this.cp= Proj4js.common.latiso(0.0,pc,sinzpc)-this.rs*Proj4js.common.latiso(this.e,this.lat0,sinz);
+ this.n2= this.k0*this.a*Math.sqrt(1.0-this.e*this.e)/(1.0-this.e*this.e*sinz*sinz);
+ this.xs= this.x0;
+ this.ys= this.y0-this.n2*pc;
+
+ if (!this.title) this.title = "Gauss Schreiber transverse mercator";
+ },
+
+
+ // forward equations--mapping lat,long to x,y
+ // -----------------------------------------------------------------
+ forward : function(p) {
+
+ var lon= p.x;
+ var lat= p.y;
+
+ var L= this.rs*(lon-this.lc);
+ var Ls= this.cp+(this.rs*Proj4js.common.latiso(this.e,lat,Math.sin(lat)));
+ var lat1= Math.asin(Math.sin(L)/Proj4js.common.cosh(Ls));
+ var Ls1= Proj4js.common.latiso(0.0,lat1,Math.sin(lat1));
+ p.x= this.xs+(this.n2*Ls1);
+ p.y= this.ys+(this.n2*Math.atan(Proj4js.common.sinh(Ls)/Math.cos(L)));
+ return p;
+ },
+
+ // inverse equations--mapping x,y to lat/long
+ // -----------------------------------------------------------------
+ inverse : function(p) {
+
+ var x= p.x;
+ var y= p.y;
+
+ var L= Math.atan(Proj4js.common.sinh((x-this.xs)/this.n2)/Math.cos((y-this.ys)/this.n2));
+ var lat1= Math.asin(Math.sin((y-this.ys)/this.n2)/Proj4js.common.cosh((x-this.xs)/this.n2));
+ var LC= Proj4js.common.latiso(0.0,lat1,Math.sin(lat1));
+ p.x= this.lc+L/this.rs;
+ p.y= Proj4js.common.invlatiso(this.e,(LC-this.cp)/this.rs);
+ return p;
+ }
+
+};
+/* ======================================================================
+ projCode/ortho.js
+ ====================================================================== */
+
+/*******************************************************************************
+NAME ORTHOGRAPHIC
+
+PURPOSE: Transforms input longitude and latitude to Easting and
+ Northing for the Orthographic projection. The
+ longitude and latitude must be in radians. The Easting
+ and Northing values will be returned in meters.
+
+PROGRAMMER DATE
+---------- ----
+T. Mittan Mar, 1993
+
+ALGORITHM REFERENCES
+
+1. Snyder, John P., "Map Projections--A Working Manual", U.S. Geological
+ Survey Professional Paper 1395 (Supersedes USGS Bulletin 1532), United
+ State Government Printing Office, Washington D.C., 1987.
+
+2. Snyder, John P. and Voxland, Philip M., "An Album of Map Projections",
+ U.S. Geological Survey Professional Paper 1453 , United State Government
+ Printing Office, Washington D.C., 1989.
+*******************************************************************************/
+
+Proj4js.Proj.ortho = {
+
+ /* Initialize the Orthographic projection
+ -------------------------------------*/
+ init: function(def) {
+ //double temp; /* temporary variable */
+
+ /* Place parameters in static storage for common use
+ -------------------------------------------------*/;
+ this.sin_p14=Math.sin(this.lat0);
+ this.cos_p14=Math.cos(this.lat0);
+ },
+
+
+ /* Orthographic forward equations--mapping lat,long to x,y
+ ---------------------------------------------------*/
+ forward: function(p) {
+ var sinphi, cosphi; /* sin and cos value */
+ var dlon; /* delta longitude value */
+ var coslon; /* cos of longitude */
+ var ksp; /* scale factor */
+ var g;
+ var lon=p.x;
+ var lat=p.y;
+ /* Forward equations
+ -----------------*/
+ dlon = Proj4js.common.adjust_lon(lon - this.long0);
+
+ sinphi=Math.sin(lat);
+ cosphi=Math.cos(lat);
+
+ coslon = Math.cos(dlon);
+ g = this.sin_p14 * sinphi + this.cos_p14 * cosphi * coslon;
+ ksp = 1.0;
+ if ((g > 0) || (Math.abs(g) <= Proj4js.common.EPSLN)) {
+ var x = this.a * ksp * cosphi * Math.sin(dlon);
+ var y = this.y0 + this.a * ksp * (this.cos_p14 * sinphi - this.sin_p14 * cosphi * coslon);
+ } else {
+ Proj4js.reportError("orthoFwdPointError");
+ }
+ p.x=x;
+ p.y=y;
+ return p;
+ },
+
+
+ inverse: function(p) {
+ var rh; /* height above ellipsoid */
+ var z; /* angle */
+ var sinz,cosz; /* sin of z and cos of z */
+ var temp;
+ var con;
+ var lon , lat;
+ /* Inverse equations
+ -----------------*/
+ p.x -= this.x0;
+ p.y -= this.y0;
+ rh = Math.sqrt(p.x * p.x + p.y * p.y);
+ if (rh > this.a + .0000001) {
+ Proj4js.reportError("orthoInvDataError");
+ }
+ z = Proj4js.common.asinz(rh / this.a);
+
+ sinz=Math.sin(z);
+ cosi=Math.cos(z);
+
+ lon = this.long0;
+ if (Math.abs(rh) <= Proj4js.common.EPSLN) {
+ lat = this.lat0;
+ }
+ lat = Proj4js.common.asinz(cosz * this.sin_p14 + (y * sinz * this.cos_p14)/rh);
+ con = Math.abs(lat0) - Proj4js.common.HALF_PI;
+ if (Math.abs(con) <= Proj4js.common.EPSLN) {
+ if (this.lat0 >= 0) {
+ lon = Proj4js.common.adjust_lon(this.long0 + Math.atan2(p.x, -p.y));
+ } else {
+ lon = Proj4js.common.adjust_lon(this.long0 -Math.atan2(-p.x, p.y));
+ }
+ }
+ con = cosz - this.sin_p14 * Math.sin(lat);
+ if ((Math.abs(con) >= Proj4js.common.EPSLN) || (Math.abs(x) >= Proj4js.common.EPSLN)) {
+ lon = Proj4js.common.adjust_lon(this.long0 + Math.atan2((p.x * sinz * this.cos_p14), (con * rh)));
+ }
+ p.x=lon;
+ p.y=lat;
+ return p;
+ }
+};
+
+
+/* ======================================================================
+ projCode/somerc.js
+ ====================================================================== */
+
+/*******************************************************************************
+NAME SWISS OBLIQUE MERCATOR
+
+PURPOSE: Swiss projection.
+WARNING: X and Y are inverted (weird) in the swiss coordinate system. Not
+ here, since we want X to be horizontal and Y vertical.
+
+ALGORITHM REFERENCES
+1. "Formules et constantes pour le Calcul pour la
+ projection cylindrique conforme à axe oblique et pour la transformation entre
+ des systèmes de référence".
+ http://www.swisstopo.admin.ch/internet/swisstopo/fr/home/topics/survey/sys/refsys/switzerland.parsysrelated1.31216.downloadList.77004.DownloadFile.tmp/swissprojectionfr.pdf
+
+*******************************************************************************/
+
+Proj4js.Proj.somerc = {
+
+ init: function() {
+ var phy0 = this.lat0;
+ this.lambda0 = this.long0;
+ var sinPhy0 = Math.sin(phy0);
+ var semiMajorAxis = this.a;
+ var invF = this.rf;
+ var flattening = 1 / invF;
+ var e2 = 2 * flattening - Math.pow(flattening, 2);
+ var e = this.e = Math.sqrt(e2);
+ this.R = semiMajorAxis * Math.sqrt(1 - e2) / (1 - e2 * Math.pow(sinPhy0, 2.0));
+ this.alpha = Math.sqrt(1 + e2 / (1 - e2) * Math.pow(Math.cos(phy0), 4.0));
+ this.b0 = Math.asin(sinPhy0 / this.alpha);
+ this.K = Math.log(Math.tan(Math.PI / 4.0 + this.b0 / 2.0))
+ - this.alpha
+ * Math.log(Math.tan(Math.PI / 4.0 + phy0 / 2.0))
+ + this.alpha
+ * e / 2
+ * Math.log((1 + e * sinPhy0)
+ / (1 - e * sinPhy0));
+ },
+
+
+ forward: function(p) {
+ var Sa1 = Math.log(Math.tan(Math.PI / 4.0 - p.y / 2.0));
+ var Sa2 = this.e / 2.0
+ * Math.log((1 + this.e * Math.sin(p.y))
+ / (1 - this.e * Math.sin(p.y)));
+ var S = -this.alpha * (Sa1 + Sa2) + this.K;
+
+ // spheric latitude
+ var b = 2.0 * (Math.atan(Math.exp(S)) - Math.PI / 4.0);
+
+ // spheric longitude
+ var I = this.alpha * (p.x - this.lambda0);
+
+ // psoeudo equatorial rotation
+ var rotI = Math.atan(Math.sin(I)
+ / (Math.sin(this.b0) * Math.tan(b) +
+ Math.cos(this.b0) * Math.cos(I)));
+
+ var rotB = Math.asin(Math.cos(this.b0) * Math.sin(b) -
+ Math.sin(this.b0) * Math.cos(b) * Math.cos(I));
+
+ p.y = this.R / 2.0
+ * Math.log((1 + Math.sin(rotB)) / (1 - Math.sin(rotB)))
+ + this.y0;
+ p.x = this.R * rotI + this.x0;
+ return p;
+ },
+
+ inverse: function(p) {
+ var Y = p.x - this.x0;
+ var X = p.y - this.y0;
+
+ var rotI = Y / this.R;
+ var rotB = 2 * (Math.atan(Math.exp(X / this.R)) - Math.PI / 4.0);
+
+ var b = Math.asin(Math.cos(this.b0) * Math.sin(rotB)
+ + Math.sin(this.b0) * Math.cos(rotB) * Math.cos(rotI));
+ var I = Math.atan(Math.sin(rotI)
+ / (Math.cos(this.b0) * Math.cos(rotI) - Math.sin(this.b0)
+ * Math.tan(rotB)));
+
+ var lambda = this.lambda0 + I / this.alpha;
+
+ var S = 0.0;
+ var phy = b;
+ var prevPhy = -1000.0;
+ var iteration = 0;
+ while (Math.abs(phy - prevPhy) > 0.0000001)
+ {
+ if (++iteration > 20)
+ {
+ Proj4js.reportError("omercFwdInfinity");
+ return;
+ }
+ //S = Math.log(Math.tan(Math.PI / 4.0 + phy / 2.0));
+ S = 1.0
+ / this.alpha
+ * (Math.log(Math.tan(Math.PI / 4.0 + b / 2.0)) - this.K)
+ + this.e
+ * Math.log(Math.tan(Math.PI / 4.0
+ + Math.asin(this.e * Math.sin(phy))
+ / 2.0));
+ prevPhy = phy;
+ phy = 2.0 * Math.atan(Math.exp(S)) - Math.PI / 2.0;
+ }
+
+ p.x = lambda;
+ p.y = phy;
+ return p;
+ }
+};
+/* ======================================================================
+ projCode/stere.js
+ ====================================================================== */
+
+
+// Initialize the Stereographic projection
+
+Proj4js.Proj.stere = {
+ ssfn_: function(phit, sinphi, eccen) {
+ sinphi *= eccen;
+ return (Math.tan (.5 * (Proj4js.common.HALF_PI + phit)) * Math.pow((1. - sinphi) / (1. + sinphi), .5 * eccen));
+ },
+ TOL: 1.e-8,
+ NITER: 8,
+ CONV: 1.e-10,
+ S_POLE: 0,
+ N_POLE: 1,
+ OBLIQ: 2,
+ EQUIT: 3,
+
+ init : function() {
+ this.phits = this.lat_ts ? this.lat_ts : Proj4js.common.HALF_PI;
+ var t = Math.abs(this.lat0);
+ if ((Math.abs(t) - Proj4js.common.HALF_PI) < Proj4js.common.EPSLN) {
+ this.mode = this.lat0 < 0. ? this.S_POLE : this.N_POLE;
+ } else {
+ this.mode = t > Proj4js.common.EPSLN ? this.OBLIQ : this.EQUIT;
+ }
+ this.phits = Math.abs(this.phits);
+ if (this.es) {
+ var X;
+
+ switch (this.mode) {
+ case this.N_POLE:
+ case this.S_POLE:
+ if (Math.abs(this.phits - Proj4js.common.HALF_PI) < Proj4js.common.EPSLN) {
+ this.akm1 = 2. * this.k0 / Math.sqrt(Math.pow(1+this.e,1+this.e)*Math.pow(1-this.e,1-this.e));
+ } else {
+ t = Math.sin(this.phits);
+ this.akm1 = Math.cos(this.phits) / Proj4js.common.tsfnz(this.e, this.phits, t);
+ t *= this.e;
+ this.akm1 /= Math.sqrt(1. - t * t);
+ }
+ break;
+ case this.EQUIT:
+ this.akm1 = 2. * this.k0;
+ break;
+ case this.OBLIQ:
+ t = Math.sin(this.lat0);
+ X = 2. * Math.atan(this.ssfn_(this.lat0, t, this.e)) - Proj4js.common.HALF_PI;
+ t *= this.e;
+ this.akm1 = 2. * this.k0 * Math.cos(this.lat0) / Math.sqrt(1. - t * t);
+ this.sinX1 = Math.sin(X);
+ this.cosX1 = Math.cos(X);
+ break;
+ }
+ } else {
+ switch (this.mode) {
+ case this.OBLIQ:
+ this.sinph0 = Math.sin(this.lat0);
+ this.cosph0 = Math.cos(this.lat0);
+ case this.EQUIT:
+ this.akm1 = 2. * this.k0;
+ break;
+ case this.S_POLE:
+ case this.N_POLE:
+ this.akm1 = Math.abs(this.phits - Proj4js.common.HALF_PI) >= Proj4js.common.EPSLN ?
+ Math.cos(this.phits) / Math.tan(Proj4js.common.FORTPI - .5 * this.phits) :
+ 2. * this.k0 ;
+ break;
+ }
+ }
+ },
+
+// Stereographic forward equations--mapping lat,long to x,y
+ forward: function(p) {
+ var lon = p.x;
+ var lat = p.y;
+ var x, y
+
+ if (this.sphere) {
+ var sinphi, cosphi, coslam, sinlam;
+
+ sinphi = Math.sin(lat);
+ cosphi = Math.cos(lat);
+ coslam = Math.cos(lon);
+ sinlam = Math.sin(lon);
+ switch (this.mode) {
+ case this.EQUIT:
+ y = 1. + cosphi * coslam;
+ if (y <= Proj4js.common.EPSLN) {
+ F_ERROR;
+ }
+ y = this.akm1 / y;
+ x = y * cosphi * sinlam;
+ y *= sinphi;
+ break;
+ case this.OBLIQ:
+ y = 1. + this.sinph0 * sinphi + this.cosph0 * cosphi * coslam;
+ if (y <= Proj4js.common.EPSLN) {
+ F_ERROR;
+ }
+ y = this.akm1 / y;
+ x = y * cosphi * sinlam;
+ y *= this.cosph0 * sinphi - this.sinph0 * cosphi * coslam;
+ break;
+ case this.N_POLE:
+ coslam = -coslam;
+ lat = -lat;
+ //Note no break here so it conitnues through S_POLE
+ case this.S_POLE:
+ if (Math.abs(lat - Proj4js.common.HALF_PI) < this.TOL) {
+ F_ERROR;
+ }
+ y = this.akm1 * Math.tan(Proj4js.common.FORTPI + .5 * lat)
+ x = sinlam * y;
+ y *= coslam;
+ break;
+ }
+ } else {
+ coslam = Math.cos(lon);
+ sinlam = Math.sin(lon);
+ sinphi = Math.sin(lat);
+ if (this.mode == this.OBLIQ || this.mode == this.EQUIT) {
+ X = 2. * Math.atan(this.ssfn_(lat, sinphi, this.e));
+ sinX = Math.sin(X - Proj4js.common.HALF_PI);
+ cosX = Math.cos(X);
+ }
+ switch (this.mode) {
+ case this.OBLIQ:
+ A = this.akm1 / (this.cosX1 * (1. + this.sinX1 * sinX + this.cosX1 * cosX * coslam));
+ y = A * (this.cosX1 * sinX - this.sinX1 * cosX * coslam);
+ x = A * cosX;
+ break;
+ case this.EQUIT:
+ A = 2. * this.akm1 / (1. + cosX * coslam);
+ y = A * sinX;
+ x = A * cosX;
+ break;
+ case this.S_POLE:
+ lat = -lat;
+ coslam = - coslam;
+ sinphi = -sinphi;
+ case this.N_POLE:
+ x = this.akm1 * Proj4js.common.tsfnz(this.e, lat, sinphi);
+ y = - x * coslam;
+ break;
+ }
+ x = x * sinlam;
+ }
+ p.x = x*this.a + this.x0;
+ p.y = y*this.a + this.y0;
+ return p;
+ },
+
+
+//* Stereographic inverse equations--mapping x,y to lat/long
+ inverse: function(p) {
+ var x = (p.x - this.x0)/this.a; /* descale and de-offset */
+ var y = (p.y - this.y0)/this.a;
+ var lon, lat
+
+ var cosphi, sinphi, tp=0.0, phi_l=0.0, rho, halfe=0.0, pi2=0.0;
+ var i;
+
+ if (this.sphere) {
+ var c, rh, sinc, cosc;
+
+ rh = Math.sqrt(x*x + y*y);
+ c = 2. * Math.atan(rh / this.akm1);
+ sinc = Math.sin(c);
+ cosc = Math.cos(c);
+ lon = 0.;
+ switch (this.mode) {
+ case this.EQUIT:
+ if (Math.abs(rh) <= Proj4js.common.EPSLN) {
+ lat = 0.;
+ } else {
+ lat = Math.asin(y * sinc / rh);
+ }
+ if (cosc != 0. || x != 0.) lon = Math.atan2(x * sinc, cosc * rh);
+ break;
+ case this.OBLIQ:
+ if (Math.abs(rh) <= Proj4js.common.EPSLN) {
+ lat = this.phi0;
+ } else {
+ lat = Math.asin(cosc * sinph0 + y * sinc * cosph0 / rh);
+ }
+ c = cosc - sinph0 * Math.sin(lat);
+ if (c != 0. || x != 0.) {
+ lon = Math.atan2(x * sinc * cosph0, c * rh);
+ }
+ break;
+ case this.N_POLE:
+ y = -y;
+ case this.S_POLE:
+ if (Math.abs(rh) <= Proj4js.common.EPSLN) {
+ lat = this.phi0;
+ } else {
+ lat = Math.asin(this.mode == this.S_POLE ? -cosc : cosc);
+ }
+ lon = (x == 0. && y == 0.) ? 0. : Math.atan2(x, y);
+ break;
+ }
+ } else {
+ rho = Math.sqrt(x*x + y*y);
+ switch (this.mode) {
+ case this.OBLIQ:
+ case this.EQUIT:
+ tp = 2. * Math.atan2(rho * this.cosX1 , this.akm1);
+ cosphi = Math.cos(tp);
+ sinphi = Math.sin(tp);
+ if( rho == 0.0 ) {
+ phi_l = Math.asin(cosphi * this.sinX1);
+ } else {
+ phi_l = Math.asin(cosphi * this.sinX1 + (y * sinphi * this.cosX1 / rho));
+ }
+
+ tp = Math.tan(.5 * (Proj4js.common.HALF_PI + phi_l));
+ x *= sinphi;
+ y = rho * this.cosX1 * cosphi - y * this.sinX1* sinphi;
+ pi2 = Proj4js.common.HALF_PI;
+ halfe = .5 * this.e;
+ break;
+ case this.N_POLE:
+ y = -y;
+ case this.S_POLE:
+ tp = - rho / this.akm1
+ phi_l = Proj4js.common.HALF_PI - 2. * Math.atan(tp);
+ pi2 = -Proj4js.common.HALF_PI;
+ halfe = -.5 * this.e;
+ break;
+ }
+ for (i = this.NITER; i--; phi_l = lat) { //check this
+ sinphi = this.e * Math.sin(phi_l);
+ lat = 2. * Math.atan(tp * Math.pow((1.+sinphi)/(1.-sinphi), halfe)) - pi2;
+ if (Math.abs(phi_l - lat) < this.CONV) {
+ if (this.mode == this.S_POLE) lat = -lat;
+ lon = (x == 0. && y == 0.) ? 0. : Math.atan2(x, y);
+ p.x = lon;
+ p.y = lat
+ return p;
+ }
+ }
+ }
+ }
+};
+/* ======================================================================
+ projCode/nzmg.js
+ ====================================================================== */
+
+/*******************************************************************************
+NAME NEW ZEALAND MAP GRID
+
+PURPOSE: Transforms input longitude and latitude to Easting and
+ Northing for the New Zealand Map Grid projection. The
+ longitude and latitude must be in radians. The Easting
+ and Northing values will be returned in meters.
+
+
+ALGORITHM REFERENCES
+
+1. Department of Land and Survey Technical Circular 1973/32
+ http://www.linz.govt.nz/docs/miscellaneous/nz-map-definition.pdf
+
+2. OSG Technical Report 4.1
+ http://www.linz.govt.nz/docs/miscellaneous/nzmg.pdf
+
+
+IMPLEMENTATION NOTES
+
+The two references use different symbols for the calculated values. This
+implementation uses the variable names similar to the symbols in reference [1].
+
+The alogrithm uses different units for delta latitude and delta longitude.
+The delta latitude is assumed to be in units of seconds of arc x 10^-5.
+The delta longitude is the usual radians. Look out for these conversions.
+
+The algorithm is described using complex arithmetic. There were three
+options:
+ * find and use a Javascript library for complex arithmetic
+ * write my own complex library
+ * expand the complex arithmetic by hand to simple arithmetic
+
+This implementation has expanded the complex multiplication operations
+into parallel simple arithmetic operations for the real and imaginary parts.
+The imaginary part is way over to the right of the display; this probably
+violates every coding standard in the world, but, to me, it makes it much
+more obvious what is going on.
+
+The following complex operations are used:
+ - addition
+ - multiplication
+ - division
+ - complex number raised to integer power
+ - summation
+
+A summary of complex arithmetic operations:
+ (from http://en.wikipedia.org/wiki/Complex_arithmetic)
+ addition: (a + bi) + (c + di) = (a + c) + (b + d)i
+ subtraction: (a + bi) - (c + di) = (a - c) + (b - d)i
+ multiplication: (a + bi) x (c + di) = (ac - bd) + (bc + ad)i
+ division: (a + bi) / (c + di) = [(ac + bd)/(cc + dd)] + [(bc - ad)/(cc + dd)]i
+
+The algorithm needs to calculate summations of simple and complex numbers. This is
+implemented using a for-loop, pre-loading the summed value to zero.
+
+The algorithm needs to calculate theta^2, theta^3, etc while doing a summation.
+There are three possible implementations:
+ - use Math.pow in the summation loop - except for complex numbers
+ - precalculate the values before running the loop
+ - calculate theta^n = theta^(n-1) * theta during the loop
+This implementation uses the third option for both real and complex arithmetic.
+
+For example
+ psi_n = 1;
+ sum = 0;
+ for (n = 1; n <=6; n++) {
+ psi_n1 = psi_n * psi; // calculate psi^(n+1)
+ psi_n = psi_n1;
+ sum = sum + A[n] * psi_n;
+ }
+
+
+TEST VECTORS
+
+NZMG E, N: 2487100.638 6751049.719 metres
+NZGD49 long, lat: 172.739194 -34.444066 degrees
+
+NZMG E, N: 2486533.395 6077263.661 metres
+NZGD49 long, lat: 172.723106 -40.512409 degrees
+
+NZMG E, N: 2216746.425 5388508.765 metres
+NZGD49 long, lat: 169.172062 -46.651295 degrees
+
+Note that these test vectors convert from NZMG metres to lat/long referenced
+to NZGD49, not the more usual WGS84. The difference is about 70m N/S and about
+10m E/W.
+
+These test vectors are provided in reference [1]. Many more test
+vectors are available in
+ http://www.linz.govt.nz/docs/topography/topographicdata/placenamesdatabase/nznamesmar08.zip
+which is a catalog of names on the 260-series maps.
+
+
+EPSG CODES
+
+NZMG EPSG:27200
+NZGD49 EPSG:4272
+
+http://spatialreference.org/ defines these as
+ Proj4js.defs["EPSG:4272"] = "+proj=longlat +ellps=intl +datum=nzgd49 +no_defs ";
+ Proj4js.defs["EPSG:27200"] = "+proj=nzmg +lat_0=-41 +lon_0=173 +x_0=2510000 +y_0=6023150 +ellps=intl +datum=nzgd49 +units=m +no_defs ";
+
+
+LICENSE
+ Copyright: Stephen Irons 2008
+ Released under terms of the LGPL as per: http://www.gnu.org/copyleft/lesser.html
+
+*******************************************************************************/
+
+
+/**
+ Initialize New Zealand Map Grip projection
+*/
+
+Proj4js.Proj.nzmg = {
+
+ /**
+ * iterations: Number of iterations to refine inverse transform.
+ * 0 -> km accuracy
+ * 1 -> m accuracy -- suitable for most mapping applications
+ * 2 -> mm accuracy
+ */
+ iterations: 1,
+
+ init : function() {
+ this.A = new Array();
+ this.A[1] = +0.6399175073;
+ this.A[2] = -0.1358797613;
+ this.A[3] = +0.063294409;
+ this.A[4] = -0.02526853;
+ this.A[5] = +0.0117879;
+ this.A[6] = -0.0055161;
+ this.A[7] = +0.0026906;
+ this.A[8] = -0.001333;
+ this.A[9] = +0.00067;
+ this.A[10] = -0.00034;
+
+ this.B_re = new Array(); this.B_im = new Array();
+ this.B_re[1] = +0.7557853228; this.B_im[1] = 0.0;
+ this.B_re[2] = +0.249204646; this.B_im[2] = +0.003371507;
+ this.B_re[3] = -0.001541739; this.B_im[3] = +0.041058560;
+ this.B_re[4] = -0.10162907; this.B_im[4] = +0.01727609;
+ this.B_re[5] = -0.26623489; this.B_im[5] = -0.36249218;
+ this.B_re[6] = -0.6870983; this.B_im[6] = -1.1651967;
+
+ this.C_re = new Array(); this.C_im = new Array();
+ this.C_re[1] = +1.3231270439; this.C_im[1] = 0.0;
+ this.C_re[2] = -0.577245789; this.C_im[2] = -0.007809598;
+ this.C_re[3] = +0.508307513; this.C_im[3] = -0.112208952;
+ this.C_re[4] = -0.15094762; this.C_im[4] = +0.18200602;
+ this.C_re[5] = +1.01418179; this.C_im[5] = +1.64497696;
+ this.C_re[6] = +1.9660549; this.C_im[6] = +2.5127645;
+
+ this.D = new Array();
+ this.D[1] = +1.5627014243;
+ this.D[2] = +0.5185406398;
+ this.D[3] = -0.03333098;
+ this.D[4] = -0.1052906;
+ this.D[5] = -0.0368594;
+ this.D[6] = +0.007317;
+ this.D[7] = +0.01220;
+ this.D[8] = +0.00394;
+ this.D[9] = -0.0013;
+ },
+
+ /**
+ New Zealand Map Grid Forward - long/lat to x/y
+ long/lat in radians
+ */
+ forward : function(p) {
+ var lon = p.x;
+ var lat = p.y;
+
+ var delta_lat = lat - this.lat0;
+ var delta_lon = lon - this.long0;
+
+ // 1. Calculate d_phi and d_psi ... // and d_lambda
+ // For this algorithm, delta_latitude is in seconds of arc x 10-5, so we need to scale to those units. Longitude is radians.
+ var d_phi = delta_lat / Proj4js.common.SEC_TO_RAD * 1E-5; var d_lambda = delta_lon;
+ var d_phi_n = 1; // d_phi^0
+
+ var d_psi = 0;
+ for (n = 1; n <= 10; n++) {
+ d_phi_n = d_phi_n * d_phi;
+ d_psi = d_psi + this.A[n] * d_phi_n;
+ }
+
+ // 2. Calculate theta
+ var th_re = d_psi; var th_im = d_lambda;
+
+ // 3. Calculate z
+ var th_n_re = 1; var th_n_im = 0; // theta^0
+ var th_n_re1; var th_n_im1;
+
+ var z_re = 0; var z_im = 0;
+ for (n = 1; n <= 6; n++) {
+ th_n_re1 = th_n_re*th_re - th_n_im*th_im; th_n_im1 = th_n_im*th_re + th_n_re*th_im;
+ th_n_re = th_n_re1; th_n_im = th_n_im1;
+ z_re = z_re + this.B_re[n]*th_n_re - this.B_im[n]*th_n_im; z_im = z_im + this.B_im[n]*th_n_re + this.B_re[n]*th_n_im;
+ }
+
+ // 4. Calculate easting and northing
+ x = (z_im * this.a) + this.x0;
+ y = (z_re * this.a) + this.y0;
+
+ p.x = x; p.y = y;
+
+ return p;
+ },
+
+
+ /**
+ New Zealand Map Grid Inverse - x/y to long/lat
+ */
+ inverse : function(p) {
+
+ var x = p.x;
+ var y = p.y;
+
+ var delta_x = x - this.x0;
+ var delta_y = y - this.y0;
+
+ // 1. Calculate z
+ var z_re = delta_y / this.a; var z_im = delta_x / this.a;
+
+ // 2a. Calculate theta - first approximation gives km accuracy
+ var z_n_re = 1; var z_n_im = 0; // z^0
+ var z_n_re1; var z_n_im1;
+
+ var th_re = 0; var th_im = 0;
+ for (n = 1; n <= 6; n++) {
+ z_n_re1 = z_n_re*z_re - z_n_im*z_im; z_n_im1 = z_n_im*z_re + z_n_re*z_im;
+ z_n_re = z_n_re1; z_n_im = z_n_im1;
+ th_re = th_re + this.C_re[n]*z_n_re - this.C_im[n]*z_n_im; th_im = th_im + this.C_im[n]*z_n_re + this.C_re[n]*z_n_im;
+ }
+
+ // 2b. Iterate to refine the accuracy of the calculation
+ // 0 iterations gives km accuracy
+ // 1 iteration gives m accuracy -- good enough for most mapping applications
+ // 2 iterations bives mm accuracy
+ for (i = 0; i < this.iterations; i++) {
+ var th_n_re = th_re; var th_n_im = th_im;
+ var th_n_re1; var th_n_im1;
+
+ var num_re = z_re; var num_im = z_im;
+ for (n = 2; n <= 6; n++) {
+ th_n_re1 = th_n_re*th_re - th_n_im*th_im; th_n_im1 = th_n_im*th_re + th_n_re*th_im;
+ th_n_re = th_n_re1; th_n_im = th_n_im1;
+ num_re = num_re + (n-1)*(this.B_re[n]*th_n_re - this.B_im[n]*th_n_im); num_im = num_im + (n-1)*(this.B_im[n]*th_n_re + this.B_re[n]*th_n_im);
+ }
+
+ th_n_re = 1; th_n_im = 0;
+ var den_re = this.B_re[1]; var den_im = this.B_im[1];
+ for (n = 2; n <= 6; n++) {
+ th_n_re1 = th_n_re*th_re - th_n_im*th_im; th_n_im1 = th_n_im*th_re + th_n_re*th_im;
+ th_n_re = th_n_re1; th_n_im = th_n_im1;
+ den_re = den_re + n * (this.B_re[n]*th_n_re - this.B_im[n]*th_n_im); den_im = den_im + n * (this.B_im[n]*th_n_re + this.B_re[n]*th_n_im);
+ }
+
+ // Complex division
+ var den2 = den_re*den_re + den_im*den_im;
+ th_re = (num_re*den_re + num_im*den_im) / den2; th_im = (num_im*den_re - num_re*den_im) / den2;
+ }
+
+ // 3. Calculate d_phi ... // and d_lambda
+ var d_psi = th_re; var d_lambda = th_im;
+ var d_psi_n = 1; // d_psi^0
+
+ var d_phi = 0;
+ for (n = 1; n <= 9; n++) {
+ d_psi_n = d_psi_n * d_psi;
+ d_phi = d_phi + this.D[n] * d_psi_n;
+ }
+
+ // 4. Calculate latitude and longitude
+ // d_phi is calcuated in second of arc * 10^-5, so we need to scale back to radians. d_lambda is in radians.
+ var lat = this.lat0 + (d_phi * Proj4js.common.SEC_TO_RAD * 1E5);
+ var lon = this.long0 + d_lambda;
+
+ p.x = lon;
+ p.y = lat;
+
+ return p;
+ }
+};
+/* ======================================================================
+ projCode/mill.js
+ ====================================================================== */
+
+/*******************************************************************************
+NAME MILLER CYLINDRICAL
+
+PURPOSE: Transforms input longitude and latitude to Easting and
+ Northing for the Miller Cylindrical projection. The
+ longitude and latitude must be in radians. The Easting
+ and Northing values will be returned in meters.
+
+PROGRAMMER DATE
+---------- ----
+T. Mittan March, 1993
+
+This function was adapted from the Lambert Azimuthal Equal Area projection
+code (FORTRAN) in the General Cartographic Transformation Package software
+which is available from the U.S. Geological Survey National Mapping Division.
+
+ALGORITHM REFERENCES
+
+1. "New Equal-Area Map Projections for Noncircular Regions", John P. Snyder,
+ The American Cartographer, Vol 15, No. 4, October 1988, pp. 341-355.
+
+2. Snyder, John P., "Map Projections--A Working Manual", U.S. Geological
+ Survey Professional Paper 1395 (Supersedes USGS Bulletin 1532), United
+ State Government Printing Office, Washington D.C., 1987.
+
+3. "Software Documentation for GCTP General Cartographic Transformation
+ Package", U.S. Geological Survey National Mapping Division, May 1982.
+*******************************************************************************/
+
+Proj4js.Proj.mill = {
+
+/* Initialize the Miller Cylindrical projection
+ -------------------------------------------*/
+ init: function() {
+ //no-op
+ },
+
+
+ /* Miller Cylindrical forward equations--mapping lat,long to x,y
+ ------------------------------------------------------------*/
+ forward: function(p) {
+ var lon=p.x;
+ var lat=p.y;
+ /* Forward equations
+ -----------------*/
+ dlon = Proj4js.common.adjust_lon(lon -this.long0);
+ var x = this.x0 + this.a * dlon;
+ var y = this.y0 + this.a * Math.log(Math.tan((Proj4js.common.PI / 4.0) + (lat / 2.5))) * 1.25;
+
+ p.x=x;
+ p.y=y;
+ return p;
+ },//millFwd()
+
+ /* Miller Cylindrical inverse equations--mapping x,y to lat/long
+ ------------------------------------------------------------*/
+ inverse: function(p) {
+ p.x -= this.x0;
+ p.y -= this.y0;
+
+ var lon = Proj4js.common.adjust_lon(this.long0 + p.x /this.a);
+ var lat = 2.5 * (Math.atan(Math.exp(0.8*p.y/this.a)) - Proj4js.common.PI / 4.0);
+
+ p.x=lon;
+ p.y=lat;
+ return p;
+ }//millInv()
+};
+/* ======================================================================
+ projCode/sinu.js
+ ====================================================================== */
+
+/*******************************************************************************
+NAME SINUSOIDAL
+
+PURPOSE: Transforms input longitude and latitude to Easting and
+ Northing for the Sinusoidal projection. The
+ longitude and latitude must be in radians. The Easting
+ and Northing values will be returned in meters.
+
+PROGRAMMER DATE
+---------- ----
+D. Steinwand, EROS May, 1991
+
+This function was adapted from the Sinusoidal projection code (FORTRAN) in the
+General Cartographic Transformation Package software which is available from
+the U.S. Geological Survey National Mapping Division.
+
+ALGORITHM REFERENCES
+
+1. Snyder, John P., "Map Projections--A Working Manual", U.S. Geological
+ Survey Professional Paper 1395 (Supersedes USGS Bulletin 1532), United
+ State Government Printing Office, Washington D.C., 1987.
+
+2. "Software Documentation for GCTP General Cartographic Transformation
+ Package", U.S. Geological Survey National Mapping Division, May 1982.
+*******************************************************************************/
+
+Proj4js.Proj.sinu = {
+
+ /* Initialize the Sinusoidal projection
+ ------------------------------------*/
+ init: function() {
+ /* Place parameters in static storage for common use
+ -------------------------------------------------*/
+ this.R = 6370997.0; //Radius of earth
+ },
+
+ /* Sinusoidal forward equations--mapping lat,long to x,y
+ -----------------------------------------------------*/
+ forward: function(p) {
+ var x,y,delta_lon;
+ var lon=p.x;
+ var lat=p.y;
+ /* Forward equations
+ -----------------*/
+ delta_lon = Proj4js.common.adjust_lon(lon - this.long0);
+ x = this.R * delta_lon * Math.cos(lat) + this.x0;
+ y = this.R * lat + this.y0;
+
+ p.x=x;
+ p.y=y;
+ return p;
+ },
+
+ inverse: function(p) {
+ var lat,temp,lon;
+
+ /* Inverse equations
+ -----------------*/
+ p.x -= this.x0;
+ p.y -= this.y0;
+ lat = p.y / this.R;
+ if (Math.abs(lat) > Proj4js.common.HALF_PI) {
+ Proj4js.reportError("sinu:Inv:DataError");
+ }
+ temp = Math.abs(lat) - Proj4js.common.HALF_PI;
+ if (Math.abs(temp) > Proj4js.common.EPSLN) {
+ temp = this.long0+ p.x / (this.R *Math.cos(lat));
+ lon = Proj4js.common.adjust_lon(temp);
+ } else {
+ lon = this.long0;
+ }
+
+ p.x=lon;
+ p.y=lat;
+ return p;
+ }
+};
+
+
+/* ======================================================================
+ projCode/geocent.js
+ ====================================================================== */
+
+/*
+Author: Richard Greenwood rich at greenwoodmap.com
+License: LGPL as per: http://www.gnu.org/copyleft/lesser.html
+*/
+
+/**
+ * convert between geodetic coordinates (longitude, latitude, height)
+ * and gecentric coordinates (X, Y, Z)
+ * ported from Proj 4.9.9 geocent.c
+*/
+
+
+// following constants #define'd in geocent.h
+// var GEOCENT_NO_ERROR = 0x0000;
+var GEOCENT_LAT_ERROR = 0x0001;
+// var GEOCENT_LON_ERROR = 0x0002;
+// var cs.a_ERROR = 0x0004;
+// var cs.b_ERROR = 0x0008;
+// var cs.a_LESS_B_ERROR = 0x0010;
+
+// following constants from geocent.c
+var COS_67P5 = 0.38268343236508977; /* cosine of 67.5 degrees */
+var AD_C = 1.0026000; /* Toms region 1 constant */
+
+function cs_geodetic_to_geocentric (cs, p) {
+
+/*
+ * The function Convert_Geodetic_To_Geocentric converts geodetic coordinates
+ * (latitude, longitude, and height) to geocentric coordinates (X, Y, Z),
+ * according to the current ellipsoid parameters.
+ *
+ * Latitude : Geodetic latitude in radians (input)
+ * Longitude : Geodetic longitude in radians (input)
+ * Height : Geodetic height, in meters (input)
+ * X : Calculated Geocentric X coordinate, in meters (output)
+ * Y : Calculated Geocentric Y coordinate, in meters (output)
+ * Z : Calculated Geocentric Z coordinate, in meters (output)
+ *
+ */
+
+ var Longitude = p.x;
+ var Latitude = p.y;
+ var Height = p.z;
+ var X; // output
+ var Y;
+ var Z;
+
+ var Error_Code=0; // GEOCENT_NO_ERROR;
+ var Rn; /* Earth radius at location */
+ var Sin_Lat; /* Math.sin(Latitude) */
+ var Sin2_Lat; /* Square of Math.sin(Latitude) */
+ var Cos_Lat; /* Math.cos(Latitude) */
+
+ /*
+ ** Don't blow up if Latitude is just a little out of the value
+ ** range as it may just be a rounding issue. Also removed longitude
+ ** test, it should be wrapped by Math.cos() and Math.sin(). NFW for PROJ.4, Sep/2001.
+ */
+ if( Latitude < -HALF_PI && Latitude > -1.001 * HALF_PI )
+ Latitude = -HALF_PI;
+ else if( Latitude > HALF_PI && Latitude < 1.001 * HALF_PI )
+ Latitude = HALF_PI;
+ else if ((Latitude < -HALF_PI) || (Latitude > HALF_PI))
+ { /* Latitude out of range */
+ Error_Code |= GEOCENT_LAT_ERROR;
+ }
+
+ if (!Error_Code)
+ { /* no errors */
+ if (Longitude > PI)
+ Longitude -= (2*PI);
+ Sin_Lat = Math.sin(Latitude);
+ Cos_Lat = Math.cos(Latitude);
+ Sin2_Lat = Sin_Lat * Sin_Lat;
+ Rn = cs.a / (Math.sqrt(1.0e0 - cs.es * Sin2_Lat));
+ X = (Rn + Height) * Cos_Lat * Math.cos(Longitude);
+ Y = (Rn + Height) * Cos_Lat * Math.sin(Longitude);
+ Z = ((Rn * (1 - cs.es)) + Height) * Sin_Lat;
+
+ }
+
+ p.x = X;
+ p.y = Y;
+ p.z = Z;
+ return Error_Code;
+} // cs_geodetic_to_geocentric()
+
+
+/** Convert_Geocentric_To_Geodetic
+ * The method used here is derived from 'An Improved Algorithm for
+ * Geocentric to Geodetic Coordinate Conversion', by Ralph Toms, Feb 1996
+ */
+
+function cs_geocentric_to_geodetic (cs, p) {
+
+ var X =p.x;
+ var Y = p.y;
+ var Z = p.z;
+ var Longitude;
+ var Latitude;
+ var Height;
+
+ var W; /* distance from Z axis */
+ var W2; /* square of distance from Z axis */
+ var T0; /* initial estimate of vertical component */
+ var T1; /* corrected estimate of vertical component */
+ var S0; /* initial estimate of horizontal component */
+ var S1; /* corrected estimate of horizontal component */
+ var Sin_B0; /* Math.sin(B0), B0 is estimate of Bowring aux variable */
+ var Sin3_B0; /* cube of Math.sin(B0) */
+ var Cos_B0; /* Math.cos(B0) */
+ var Sin_p1; /* Math.sin(phi1), phi1 is estimated latitude */
+ var Cos_p1; /* Math.cos(phi1) */
+ var Rn; /* Earth radius at location */
+ var Sum; /* numerator of Math.cos(phi1) */
+ var At_Pole; /* indicates location is in polar region */
+
+ X = parseFloat(X); // cast from string to float
+ Y = parseFloat(Y);
+ Z = parseFloat(Z);
+
+ At_Pole = false;
+ if (X != 0.0)
+ {
+ Longitude = Math.atan2(Y,X);
+ }
+ else
+ {
+ if (Y > 0)
+ {
+ Longitude = HALF_PI;
+ }
+ else if (Y < 0)
+ {
+ Longitude = -HALF_PI;
+ }
+ else
+ {
+ At_Pole = true;
+ Longitude = 0.0;
+ if (Z > 0.0)
+ { /* north pole */
+ Latitude = HALF_PI;
+ }
+ else if (Z < 0.0)
+ { /* south pole */
+ Latitude = -HALF_PI;
+ }
+ else
+ { /* center of earth */
+ Latitude = HALF_PI;
+ Height = -cs.b;
+ return;
+ }
+ }
+ }
+ W2 = X*X + Y*Y;
+ W = Math.sqrt(W2);
+ T0 = Z * AD_C;
+ S0 = Math.sqrt(T0 * T0 + W2);
+ Sin_B0 = T0 / S0;
+ Cos_B0 = W / S0;
+ Sin3_B0 = Sin_B0 * Sin_B0 * Sin_B0;
+ T1 = Z + cs.b * cs.ep2 * Sin3_B0;
+ Sum = W - cs.a * cs.es * Cos_B0 * Cos_B0 * Cos_B0;
+ S1 = Math.sqrt(T1*T1 + Sum * Sum);
+ Sin_p1 = T1 / S1;
+ Cos_p1 = Sum / S1;
+ Rn = cs.a / Math.sqrt(1.0 - cs.es * Sin_p1 * Sin_p1);
+ if (Cos_p1 >= COS_67P5)
+ {
+ Height = W / Cos_p1 - Rn;
+ }
+ else if (Cos_p1 <= -COS_67P5)
+ {
+ Height = W / -Cos_p1 - Rn;
+ }
+ else
+ {
+ Height = Z / Sin_p1 + Rn * (cs.es - 1.0);
+ }
+ if (At_Pole == false)
+ {
+ Latitude = Math.atan(Sin_p1 / Cos_p1);
+ }
+
+ p.x = Longitude;
+ p.y =Latitude;
+ p.z = Height;
+ return 0;
+} // cs_geocentric_to_geodetic()
+
+
+
+/****************************************************************/
+// pj_geocentic_to_wgs84(defn, p )
+// defn = coordinate system definition,
+// p = point to transform in geocentric coordinates (x,y,z)
+function cs_geocentric_to_wgs84( defn, p ) {
+
+ if( defn.datum_type == PJD_3PARAM )
+ {
+ // if( x[io] == HUGE_VAL )
+ // continue;
+ p.x += defn.datum_params[0];
+ p.y += defn.datum_params[1];
+ p.z += defn.datum_params[2];
+
+ }
+ else // if( defn.datum_type == PJD_7PARAM )
+ {
+ var Dx_BF =defn.datum_params[0];
+ var Dy_BF =defn.datum_params[1];
+ var Dz_BF =defn.datum_params[2];
+ var Rx_BF =defn.datum_params[3];
+ var Ry_BF =defn.datum_params[4];
+ var Rz_BF =defn.datum_params[5];
+ var M_BF =defn.datum_params[6];
+ // if( x[io] == HUGE_VAL )
+ // continue;
+ var x_out = M_BF*( p.x - Rz_BF*p.y + Ry_BF*p.z) + Dx_BF;
+ var y_out = M_BF*( Rz_BF*p.x + p.y - Rx_BF*p.z) + Dy_BF;
+ var z_out = M_BF*(-Ry_BF*p.x + Rx_BF*p.y + p.z) + Dz_BF;
+ p.x = x_out;
+ p.y = y_out;
+ p.z = z_out;
+ }
+} // cs_geocentric_to_wgs84
+
+/****************************************************************/
+// pj_geocentic_from_wgs84()
+// coordinate system definition,
+// point to transform in geocentric coordinates (x,y,z)
+function cs_geocentric_from_wgs84( defn, p ) {
+
+ if( defn.datum_type == PJD_3PARAM )
+ {
+ //if( x[io] == HUGE_VAL )
+ // continue;
+ p.x -= defn.datum_params[0];
+ p.y -= defn.datum_params[1];
+ p.z -= defn.datum_params[2];
+
+ }
+ else // if( defn.datum_type == PJD_7PARAM )
+ {
+ var Dx_BF =defn.datum_params[0];
+ var Dy_BF =defn.datum_params[1];
+ var Dz_BF =defn.datum_params[2];
+ var Rx_BF =defn.datum_params[3];
+ var Ry_BF =defn.datum_params[4];
+ var Rz_BF =defn.datum_params[5];
+ var M_BF =defn.datum_params[6];
+ var x_tmp = (p.x - Dx_BF) / M_BF;
+ var y_tmp = (p.y - Dy_BF) / M_BF;
+ var z_tmp = (p.z - Dz_BF) / M_BF;
+ //if( x[io] == HUGE_VAL )
+ // continue;
+
+ p.x = x_tmp + Rz_BF*y_tmp - Ry_BF*z_tmp;
+ p.y = -Rz_BF*x_tmp + y_tmp + Rx_BF*z_tmp;
+ p.z = Ry_BF*x_tmp - Rx_BF*y_tmp + z_tmp;
+ }
+} //cs_geocentric_from_wgs84()
+/* ======================================================================
+ projCode/vandg.js
+ ====================================================================== */
+
+/*******************************************************************************
+NAME VAN DER GRINTEN
+
+PURPOSE: Transforms input Easting and Northing to longitude and
+ latitude for the Van der Grinten projection. The
+ Easting and Northing must be in meters. The longitude
+ and latitude values will be returned in radians.
+
+PROGRAMMER DATE
+---------- ----
+T. Mittan March, 1993
+
+This function was adapted from the Van Der Grinten projection code
+(FORTRAN) in the General Cartographic Transformation Package software
+which is available from the U.S. Geological Survey National Mapping Division.
+
+ALGORITHM REFERENCES
+
+1. "New Equal-Area Map Projections for Noncircular Regions", John P. Snyder,
+ The American Cartographer, Vol 15, No. 4, October 1988, pp. 341-355.
+
+2. Snyder, John P., "Map Projections--A Working Manual", U.S. Geological
+ Survey Professional Paper 1395 (Supersedes USGS Bulletin 1532), United
+ State Government Printing Office, Washington D.C., 1987.
+
+3. "Software Documentation for GCTP General Cartographic Transformation
+ Package", U.S. Geological Survey National Mapping Division, May 1982.
+*******************************************************************************/
+
+Proj4js.Proj.vandg = {
+
+/* Initialize the Van Der Grinten projection
+ ----------------------------------------*/
+ init: function() {
+ this.R = 6370997.0; //Radius of earth
+ },
+
+ forward: function(p) {
+
+ var lon=p.x;
+ var lat=p.y;
+
+ /* Forward equations
+ -----------------*/
+ var dlon = Proj4js.common.adjust_lon(lon - this.long0);
+ var x,y;
+
+ if (Math.abs(lat) <= Proj4js.common.EPSLN) {
+ x = this.x0 + this.R * dlon;
+ y = this.y0;
+ }
+ var theta = Proj4js.common.asinz(2.0 * Math.abs(lat / Proj4js.common.PI));
+ if ((Math.abs(dlon) <= Proj4js.common.EPSLN) || (Math.abs(Math.abs(lat) - Proj4js.common.HALF_PI) <= Proj4js.common.EPSLN)) {
+ x = this.x0;
+ if (lat >= 0) {
+ y = this.y0 + Proj4js.common.PI * this.R * Math.tan(.5 * theta);
+ } else {
+ y = this.y0 + Proj4js.common.PI * this.R * - Math.tan(.5 * theta);
+ }
+ // return(OK);
+ }
+ var al = .5 * Math.abs((Proj4js.common.PI / dlon) - (dlon / Proj4js.common.PI));
+ var asq = al * al;
+ var sinth = Math.sin(theta);
+ var costh = Math.cos(theta);
+
+ var g = costh / (sinth + costh - 1.0);
+ var gsq = g * g;
+ var m = g * (2.0 / sinth - 1.0);
+ var msq = m * m;
+ var con = Proj4js.common.PI * this.R * (al * (g - msq) + Math.sqrt(asq * (g - msq) * (g - msq) - (msq + asq) * (gsq - msq))) / (msq + asq);
+ if (dlon < 0) {
+ con = -con;
+ }
+ x = this.x0 + con;
+ con = Math.abs(con / (Proj4js.common.PI * this.R));
+ if (lat >= 0) {
+ y = this.y0 + Proj4js.common.PI * this.R * Math.sqrt(1.0 - con * con - 2.0 * al * con);
+ } else {
+ y = this.y0 - Proj4js.common.PI * this.R * Math.sqrt(1.0 - con * con - 2.0 * al * con);
+ }
+ p.x = x;
+ p.y = y;
+ return p;
+ },
+
+/* Van Der Grinten inverse equations--mapping x,y to lat/long
+ ---------------------------------------------------------*/
+ inverse: function(p) {
+ var dlon;
+ var xx,yy,xys,c1,c2,c3;
+ var al,asq;
+ var a1;
+ var m1;
+ var con;
+ var th1;
+ var d;
+
+ /* inverse equations
+ -----------------*/
+ p.x -= this.x0;
+ p.y -= this.y0;
+ con = Proj4js.common.PI * this.R;
+ xx = p.x / con;
+ yy =p.y / con;
+ xys = xx * xx + yy * yy;
+ c1 = -Math.abs(yy) * (1.0 + xys);
+ c2 = c1 - 2.0 * yy * yy + xx * xx;
+ c3 = -2.0 * c1 + 1.0 + 2.0 * yy * yy + xys * xys;
+ d = yy * yy / c3 + (2.0 * c2 * c2 * c2 / c3 / c3 / c3 - 9.0 * c1 * c2 / c3 /c3) / 27.0;
+ a1 = (c1 - c2 * c2 / 3.0 / c3) / c3;
+ m1 = 2.0 * Math.sqrt( -a1 / 3.0);
+ con = ((3.0 * d) / a1) / m1;
+ if (Math.abs(con) > 1.0) {
+ if (con >= 0.0) {
+ con = 1.0;
+ } else {
+ con = -1.0;
+ }
+ }
+ th1 = Math.acos(con) / 3.0;
+ if (p.y >= 0) {
+ lat = (-m1 *Math.cos(th1 + Proj4js.common.PI / 3.0) - c2 / 3.0 / c3) * Proj4js.common.PI;
+ } else {
+ lat = -(-m1 * Math.cos(th1 + PI / 3.0) - c2 / 3.0 / c3) * Proj4js.common.PI;
+ }
+
+ if (Math.abs(xx) < Proj4js.common.EPSLN) {
+ lon = this.long0;
+ }
+ lon = Proj4js.common.adjust_lon(this.long0 + Proj4js.common.PI * (xys - 1.0 + Math.sqrt(1.0 + 2.0 * (xx * xx - yy * yy) + xys * xys)) / 2.0 / xx);
+
+ p.x=lon;
+ p.y=lat;
+ return p;
+ }
+};
+/* ======================================================================
+ projCode/eqc.js
+ ====================================================================== */
+
+/* similar to equi.js FIXME proj4 uses eqc */
+Proj4js.Proj.eqc = {
+ init : function() {
+
+ if(!this.x0) this.x0=0;
+ if(!this.y0) this.y0=0;
+ if(!this.lat0) this.lat0=0;
+ if(!this.long0) this.long0=0;
+ if(!this.lat_ts) this.lat_ts=0;
+ if (!this.title) this.title = "Equidistant Cylindrical (Plate Carre)";
+
+ this.rc= Math.cos(this.lat_ts);
+ },
+
+
+ // forward equations--mapping lat,long to x,y
+ // -----------------------------------------------------------------
+ forward : function(p) {
+
+ var lon= p.x;
+ var lat= p.y;
+
+ var dlon = Proj4js.common.adjust_lon(lon - this.long0);
+ var dlat = Proj4js.common.adjust_lat(lat - this.lat0 );
+ p.x= this.x0 + (this.a*dlon*this.rc);
+ p.y= this.y0 + (this.a*dlat );
+ return p;
+ },
+
+ // inverse equations--mapping x,y to lat/long
+ // -----------------------------------------------------------------
+ inverse : function(p) {
+
+ var x= p.x;
+ var y= p.y;
+
+ p.x= Proj4js.common.adjust_lon(this.long0 + ((x - this.x0)/(this.a*this.rc)));
+ p.y= Proj4js.common.adjust_lat(this.lat0 + ((y - this.y0)/(this.a )));
+ return p;
+ }
+
+};
+/* ======================================================================
+ projCode/gauss.js
+ ====================================================================== */
+
+
+Proj4js.Proj.gauss = {
+
+ init : function() {
+ sphi = Math.sin(this.lat0);
+ cphi = Math.cos(this.lat0);
+ cphi *= cphi;
+ this.rc = Math.sqrt(1.0 - this.es) / (1.0 - this.es * sphi * sphi);
+ this.C = Math.sqrt(1.0 + this.es * cphi * cphi / (1.0 - this.es));
+ this.phic0 = Math.asin(sphi / this.C);
+ this.ratexp = 0.5 * this.C * this.e;
+ this.K = Math.tan(0.5 * this.phic0 + Proj4js.common.FORTPI) / (Math.pow(Math.tan(0.5*this.lat0 + Proj4js.common.FORTPI), this.C) * Proj4js.common.srat(this.e*sphi, this.ratexp));
+ },
+
+ forward : function(p) {
+ var lon = p.x;
+ var lat = p.y;
+
+ p.y = 2.0 * Math.atan( this.K * Math.pow(Math.tan(0.5 * lat + Proj4js.common.FORTPI), this.C) * Proj4js.common.srat(this.e * Math.sin(lat), this.ratexp) ) - Proj4js.common.HALF_PI;
+ p.x = this.C * lon;
+ return p;
+ },
+
+ inverse : function(p) {
+ var DEL_TOL = 1e-14;
+ var lon = p.x / this.C;
+ var lat = p.y;
+ num = Math.pow(Math.tan(0.5 * lat + Proj4js.common.FORTPI)/this.K, 1./this.C);
+ for (var i = Proj4js.common.MAX_ITER; i>0; --i) {
+ lat = 2.0 * Math.atan(num * Proj4js.common.srat(this.e * Math.sin(p.y), -0.5 * this.e)) - Proj4js.common.HALF_PI;
+ if (Math.abs(lat - p.y) < DEL_TOL) break;
+ p.y = lat;
+ }
+ /* convergence failed */
+ if (!i) {
+ Proj4js.reportError("gauss:inverse:convergence failed");
+ return null;
+ }
+ p.x = lon;
+ p.y = lat;
+ return p;
+ }
+};
+
+/* ======================================================================
+ projCode/omerc.js
+ ====================================================================== */
+
+/*******************************************************************************
+NAME OBLIQUE MERCATOR (HOTINE)
+
+PURPOSE: Transforms input longitude and latitude to Easting and
+ Northing for the Oblique Mercator projection. The
+ longitude and latitude must be in radians. The Easting
+ and Northing values will be returned in meters.
+
+PROGRAMMER DATE
+---------- ----
+T. Mittan Mar, 1993
+
+ALGORITHM REFERENCES
+
+1. Snyder, John P., "Map Projections--A Working Manual", U.S. Geological
+ Survey Professional Paper 1395 (Supersedes USGS Bulletin 1532), United
+ State Government Printing Office, Washington D.C., 1987.
+
+2. Snyder, John P. and Voxland, Philip M., "An Album of Map Projections",
+ U.S. Geological Survey Professional Paper 1453 , United State Government
+ Printing Office, Washington D.C., 1989.
+*******************************************************************************/
+
+Proj4js.Proj.omerc = {
+
+ /* Initialize the Oblique Mercator projection
+ ------------------------------------------*/
+ init: function() {
+ if (!this.mode) this.mode=0;
+ if (!this.lon1) {this.lon1=0;this.mode=1;}
+ if (!this.lon2) this.lon2=0;
+ if (!this.lat2) this.lat2=0;
+
+ /* Place parameters in static storage for common use
+ -------------------------------------------------*/
+ var temp = this.b/ this.a;
+ var es = 1.0 - Math.pow(temp,2);
+ var e = Math.sqrt(es);
+
+ this.sin_p20=Math.sin(this.lat0);
+ this.cos_p20=Math.cos(this.lat0);
+
+ this.con = 1.0 - this.es * this.sin_p20 * this.sin_p20;
+ this.com = Math.sqrt(1.0 - es);
+ this.bl = Math.sqrt(1.0 + this.es * Math.pow(this.cos_p20,4.0)/(1.0 - es));
+ this.al = this.a * this.bl * this.k0 * this.com / this.con;
+ if (Math.abs(this.lat0) < Proj4js.common.EPSLN) {
+ this.ts = 1.0;
+ this.d = 1.0;
+ this.el = 1.0;
+ } else {
+ this.ts = Proj4js.common.tsfnz(this.e,this.lat0,this.sin_p20);
+ this.con = Math.sqrt(this.con);
+ this.d = this.bl * this.com / (this.cos_p20 * this.con);
+ if ((this.d * this.d - 1.0) > 0.0) {
+ if (this.lat0 >= 0.0) {
+ this.f = this.d + Math.sqrt(this.d * this.d - 1.0);
+ } else {
+ this.f = this.d - Math.sqrt(this.d * this.d - 1.0);
+ }
+ } else {
+ this.f = this.d;
+ }
+ this.el = this.f * Math.pow(this.ts,this.bl);
+ }
+
+ //this.longc=52.60353916666667;
+
+ if (this.mode != 0) {
+ this.g = .5 * (this.f - 1.0/this.f);
+ this.gama = Proj4js.common.asinz(Math.sin(this.alpha) / this.d);
+ this.longc= this.longc - Proj4js.common.asinz(this.g * Math.tan(this.gama))/this.bl;
+
+ /* Report parameters common to format B
+ -------------------------------------*/
+ //genrpt(azimuth * R2D,"Azimuth of Central Line: ");
+ //cenlon(lon_origin);
+ // cenlat(lat_origin);
+
+ this.con = Math.abs(this.lat0);
+ if ((this.con > Proj4js.common.EPSLN) && (Math.abs(this.con - Proj4js.common.HALF_PI) > Proj4js.common.EPSLN)) {
+ this.singam=Math.sin(this.gama);
+ this.cosgam=Math.cos(this.gama);
+
+ this.sinaz=Math.sin(this.alpha);
+ this.cosaz=Math.cos(this.alpha);
+
+ if (this.lat0>= 0) {
+ this.u = (this.al / this.bl) * Math.atan(Math.sqrt(this.d*this.d - 1.0)/this.cosaz);
+ } else {
+ this.u = -(this.al / this.bl) *Math.atan(Math.sqrt(this.d*this.d - 1.0)/this.cosaz);
+ }
+ } else {
+ Proj4js.reportError("omerc:Init:DataError");
+ }
+ } else {
+ this.sinphi =Math. sin(this.at1);
+ this.ts1 = Proj4js.common.tsfnz(this.e,this.lat1,this.sinphi);
+ this.sinphi = Math.sin(this.lat2);
+ this.ts2 = Proj4js.common.tsfnz(this.e,this.lat2,this.sinphi);
+ this.h = Math.pow(this.ts1,this.bl);
+ this.l = Math.pow(this.ts2,this.bl);
+ this.f = this.el/this.h;
+ this.g = .5 * (this.f - 1.0/this.f);
+ this.j = (this.el * this.el - this.l * this.h)/(this.el * this.el + this.l * this.h);
+ this.p = (this.l - this.h) / (this.l + this.h);
+ this.dlon = this.lon1 - this.lon2;
+ if (this.dlon < -Proj4js.common.PI) this.lon2 = this.lon2 - 2.0 * Proj4js.common.PI;
+ if (this.dlon > Proj4js.common.PI) this.lon2 = this.lon2 + 2.0 * Proj4js.common.PI;
+ this.dlon = this.lon1 - this.lon2;
+ this.longc = .5 * (this.lon1 + this.lon2) -Math.atan(this.j * Math.tan(.5 * this.bl * this.dlon)/this.p)/this.bl;
+ this.dlon = Proj4js.common.adjust_lon(this.lon1 - this.longc);
+ this.gama = Math.atan(Math.sin(this.bl * this.dlon)/this.g);
+ this.alpha = Proj4js.common.asinz(this.d * Math.sin(this.gama));
+
+ /* Report parameters common to format A
+ -------------------------------------*/
+
+ if (Math.abs(this.lat1 - this.lat2) <= Proj4js.common.EPSLN) {
+ Proj4js.reportError("omercInitDataError");
+ //return(202);
+ } else {
+ this.con = Math.abs(this.lat1);
+ }
+ if ((this.con <= Proj4js.common.EPSLN) || (Math.abs(this.con - HALF_PI) <= Proj4js.common.EPSLN)) {
+ Proj4js.reportError("omercInitDataError");
+ //return(202);
+ } else {
+ if (Math.abs(Math.abs(this.lat0) - Proj4js.common.HALF_PI) <= Proj4js.common.EPSLN) {
+ Proj4js.reportError("omercInitDataError");
+ //return(202);
+ }
+ }
+
+ this.singam=Math.sin(this.gam);
+ this.cosgam=Math.cos(this.gam);
+
+ this.sinaz=Math.sin(this.alpha);
+ this.cosaz=Math.cos(this.alpha);
+
+
+ if (this.lat0 >= 0) {
+ this.u = (this.al/this.bl) * Math.atan(Math.sqrt(this.d * this.d - 1.0)/this.cosaz);
+ } else {
+ this.u = -(this.al/this.bl) * Math.atan(Math.sqrt(this.d * this.d - 1.0)/this.cosaz);
+ }
+ }
+ },
+
+
+ /* Oblique Mercator forward equations--mapping lat,long to x,y
+ ----------------------------------------------------------*/
+ forward: function(p) {
+ var theta; /* angle */
+ var sin_phi, cos_phi;/* sin and cos value */
+ var b; /* temporary values */
+ var c, t, tq; /* temporary values */
+ var con, n, ml; /* cone constant, small m */
+ var q,us,vl;
+ var ul,vs;
+ var s;
+ var dlon;
+ var ts1;
+
+ var lon=p.x;
+ var lat=p.y;
+ /* Forward equations
+ -----------------*/
+ sin_phi = Math.sin(lat);
+ dlon = Proj4js.common.adjust_lon(lon - this.longc);
+ vl = Math.sin(this.bl * dlon);
+ if (Math.abs(Math.abs(lat) - Proj4js.common.HALF_PI) > Proj4js.common.EPSLN) {
+ ts1 = Proj4js.common.tsfnz(this.e,lat,sin_phi);
+ q = this.el / (Math.pow(ts1,this.bl));
+ s = .5 * (q - 1.0 / q);
+ t = .5 * (q + 1.0/ q);
+ ul = (s * this.singam - vl * this.cosgam) / t;
+ con = Math.cos(this.bl * dlon);
+ if (Math.abs(con) < .0000001) {
+ us = this.al * this.bl * dlon;
+ } else {
+ us = this.al * Math.atan((s * this.cosgam + vl * this.singam) / con)/this.bl;
+ if (con < 0) us = us + Proj4js.common.PI * this.al / this.bl;
+ }
+ } else {
+ if (lat >= 0) {
+ ul = this.singam;
+ } else {
+ ul = -this.singam;
+ }
+ us = this.al * lat / this.bl;
+ }
+ if (Math.abs(Math.abs(ul) - 1.0) <= Proj4js.common.EPSLN) {
+ //alert("Point projects into infinity","omer-for");
+ Proj4js.reportError("omercFwdInfinity");
+ //return(205);
+ }
+ vs = .5 * this.al * Math.log((1.0 - ul)/(1.0 + ul)) / this.bl;
+ us = us - this.u;
+ var x = this.x0 + vs * this.cosaz + us * this.sinaz;
+ var y = this.y0 + us * this.cosaz - vs * this.sinaz;
+
+ p.x=x;
+ p.y=y;
+ return p;
+ },
+
+ inverse: function(p) {
+ var delta_lon; /* Delta longitude (Given longitude - center */
+ var theta; /* angle */
+ var delta_theta; /* adjusted longitude */
+ var sin_phi, cos_phi;/* sin and cos value */
+ var b; /* temporary values */
+ var c, t, tq; /* temporary values */
+ var con, n, ml; /* cone constant, small m */
+ var vs,us,q,s,ts1;
+ var vl,ul,bs;
+ var dlon;
+ var flag;
+
+ /* Inverse equations
+ -----------------*/
+ p.x -= this.x0;
+ p.y -= this.y0;
+ flag = 0;
+ vs = p.x * this.cosaz - p.y * this.sinaz;
+ us = p.y * this.cosaz + p.x * this.sinaz;
+ us = us + this.u;
+ q = Math.exp(-this.bl * vs / this.al);
+ s = .5 * (q - 1.0/q);
+ t = .5 * (q + 1.0/q);
+ vl = Math.sin(this.bl * us / this.al);
+ ul = (vl * this.cosgam + s * this.singam)/t;
+ if (Math.abs(Math.abs(ul) - 1.0) <= Proj4js.common.EPSLN)
+ {
+ lon = this.longc;
+ if (ul >= 0.0) {
+ lat = Proj4js.common.HALF_PI;
+ } else {
+ lat = -Proj4js.common.HALF_PI;
+ }
+ } else {
+ con = 1.0 / this.bl;
+ ts1 =Math.pow((this.el / Math.sqrt((1.0 + ul) / (1.0 - ul))),con);
+ lat = Proj4js.common.phi2z(this.e,ts1);
+ //if (flag != 0)
+ //return(flag);
+ //~ con = Math.cos(this.bl * us /al);
+ theta = this.longc - Math.atan2((s * this.cosgam - vl * this.singam) , con)/this.bl;
+ lon = Proj4js.common.adjust_lon(theta);
+ }
+ p.x=lon;
+ p.y=lat;
+ return p;
+ }
+};
+/* ======================================================================
+ projCode/lcc.js
+ ====================================================================== */
+
+/*******************************************************************************
+NAME LAMBERT CONFORMAL CONIC
+
+PURPOSE: Transforms input longitude and latitude to Easting and
+ Northing for the Lambert Conformal Conic projection. The
+ longitude and latitude must be in radians. The Easting
+ and Northing values will be returned in meters.
+
+
+ALGORITHM REFERENCES
+
+1. Snyder, John P., "Map Projections--A Working Manual", U.S. Geological
+ Survey Professional Paper 1395 (Supersedes USGS Bulletin 1532), United
+ State Government Printing Office, Washington D.C., 1987.
+
+2. Snyder, John P. and Voxland, Philip M., "An Album of Map Projections",
+ U.S. Geological Survey Professional Paper 1453 , United State Government
+*******************************************************************************/
+
+
+//<2104> +proj=lcc +lat_1=10.16666666666667 +lat_0=10.16666666666667 +lon_0=-71.60561777777777 +k_0=1 +x0=-17044 +x0=-23139.97 +ellps=intl +units=m +no_defs no_defs
+
+// Initialize the Lambert Conformal conic projection
+// -----------------------------------------------------------------
+
+//Proj4js.Proj.lcc = Class.create();
+Proj4js.Proj.lcc = {
+ init : function() {
+
+ // array of: r_maj,r_min,lat1,lat2,c_lon,c_lat,false_east,false_north
+ //double c_lat; /* center latitude */
+ //double c_lon; /* center longitude */
+ //double lat1; /* first standard parallel */
+ //double lat2; /* second standard parallel */
+ //double r_maj; /* major axis */
+ //double r_min; /* minor axis */
+ //double false_east; /* x offset in meters */
+ //double false_north; /* y offset in meters */
+
+ if (!this.lat2){this.lat2=this.lat0;}//if lat2 is not defined
+ if (!this.k0) this.k0 = 1.0;
+
+ // Standard Parallels cannot be equal and on opposite sides of the equator
+ if (Math.abs(this.lat1+this.lat2) < Proj4js.common.EPSLN) {
+ Proj4js.reportError("lcc:init: Equal Latitudes");
+ return;
+ }
+
+ var temp = this.b / this.a;
+ this.e = Math.sqrt(1.0 - temp*temp);
+
+ var sin1 = Math.sin(this.lat1);
+ var cos1 = Math.cos(this.lat1);
+ var ms1 = Proj4js.common.msfnz(this.e, sin1, cos1);
+ var ts1 = Proj4js.common.tsfnz(this.e, this.lat1, sin1);
+
+ var sin2 = Math.sin(this.lat2);
+ var cos2 = Math.cos(this.lat2);
+ var ms2 = Proj4js.common.msfnz(this.e, sin2, cos2);
+ var ts2 = Proj4js.common.tsfnz(this.e, this.lat2, sin2);
+
+ var ts0 = Proj4js.common.tsfnz(this.e, this.lat0, Math.sin(this.lat0));
+
+ if (Math.abs(this.lat1 - this.lat2) > Proj4js.common.EPSLN) {
+ this.ns = Math.log(ms1/ms2)/Math.log(ts1/ts2);
+ } else {
+ this.ns = sin1;
+ }
+ this.f0 = ms1 / (this.ns * Math.pow(ts1, this.ns));
+ this.rh = this.a * this.f0 * Math.pow(ts0, this.ns);
+ if (!this.title) this.title = "Lambert Conformal Conic";
+ },
+
+
+ // Lambert Conformal conic forward equations--mapping lat,long to x,y
+ // -----------------------------------------------------------------
+ forward : function(p) {
+
+ var lon = p.x;
+ var lat = p.y;
+
+ // convert to radians
+ if ( lat <= 90.0 && lat >= -90.0 && lon <= 180.0 && lon >= -180.0) {
+ //lon = lon * Proj4js.common.D2R;
+ //lat = lat * Proj4js.common.D2R;
+ } else {
+ Proj4js.reportError("lcc:forward: llInputOutOfRange: "+ lon +" : " + lat);
+ return null;
+ }
+
+ var con = Math.abs( Math.abs(lat) - Proj4js.common.HALF_PI);
+ var ts;
+ if (con > Proj4js.common.EPSLN) {
+ ts = Proj4js.common.tsfnz(this.e, lat, Math.sin(lat) );
+ rh1 = this.a * this.f0 * Math.pow(ts, this.ns);
+ } else {
+ con = lat * this.ns;
+ if (con <= 0) {
+ Proj4js.reportError("lcc:forward: No Projection");
+ return null;
+ }
+ rh1 = 0;
+ }
+ var theta = this.ns * Proj4js.common.adjust_lon(lon - this.long0);
+ p.x = this.k0 * (rh1 * Math.sin(theta)) + this.x0;
+ p.y = this.k0 * (this.rh - rh1 * Math.cos(theta)) + this.y0;
+
+ return p;
+ },
+
+ // Lambert Conformal Conic inverse equations--mapping x,y to lat/long
+ // -----------------------------------------------------------------
+ inverse : function(p) {
+
+ var rh1, con, ts;
+ var lat, lon;
+ x = (p.x - this.x0)/this.k0;
+ y = (this.rh - (p.y - this.y0)/this.k0);
+ if (this.ns > 0) {
+ rh1 = Math.sqrt (x * x + y * y);
+ con = 1.0;
+ } else {
+ rh1 = -Math.sqrt (x * x + y * y);
+ con = -1.0;
+ }
+ var theta = 0.0;
+ if (rh1 != 0) {
+ theta = Math.atan2((con * x),(con * y));
+ }
+ if ((rh1 != 0) || (this.ns > 0.0)) {
+ con = 1.0/this.ns;
+ ts = Math.pow((rh1/(this.a * this.f0)), con);
+ lat = Proj4js.common.phi2z(this.e, ts);
+ if (lat == -9999) return null;
+ } else {
+ lat = -Proj4js.common.HALF_PI;
+ }
+ lon = Proj4js.common.adjust_lon(theta/this.ns + this.long0);
+
+ p.x = lon;
+ p.y = lat;
+ return p;
+ }
+};
+
+
+
+
+/* ======================================================================
+ projCode/laea.js
+ ====================================================================== */
+
+/*******************************************************************************
+NAME LAMBERT AZIMUTHAL EQUAL-AREA
+
+PURPOSE: Transforms input longitude and latitude to Easting and
+ Northing for the Lambert Azimuthal Equal-Area projection. The
+ longitude and latitude must be in radians. The Easting
+ and Northing values will be returned in meters.
+
+PROGRAMMER DATE
+---------- ----
+D. Steinwand, EROS March, 1991
+
+This function was adapted from the Lambert Azimuthal Equal Area projection
+code (FORTRAN) in the General Cartographic Transformation Package software
+which is available from the U.S. Geological Survey National Mapping Division.
+
+ALGORITHM REFERENCES
+
+1. "New Equal-Area Map Projections for Noncircular Regions", John P. Snyder,
+ The American Cartographer, Vol 15, No. 4, October 1988, pp. 341-355.
+
+2. Snyder, John P., "Map Projections--A Working Manual", U.S. Geological
+ Survey Professional Paper 1395 (Supersedes USGS Bulletin 1532), United
+ State Government Printing Office, Washington D.C., 1987.
+
+3. "Software Documentation for GCTP General Cartographic Transformation
+ Package", U.S. Geological Survey National Mapping Division, May 1982.
+*******************************************************************************/
+
+Proj4js.Proj.laea = {
+
+
+/* Initialize the Lambert Azimuthal Equal Area projection
+ ------------------------------------------------------*/
+ init: function() {
+ this.sin_lat_o=Math.sin(this.lat0);
+ this.cos_lat_o=Math.cos(this.lat0);
+ },
+
+/* Lambert Azimuthal Equal Area forward equations--mapping lat,long to x,y
+ -----------------------------------------------------------------------*/
+ forward: function(p) {
+
+ /* Forward equations
+ -----------------*/
+ var lon=p.x;
+ var lat=p.y;
+ var delta_lon = Proj4js.common.adjust_lon(lon - this.long0);
+
+ //v 1.0
+ var sin_lat=Math.sin(lat);
+ var cos_lat=Math.cos(lat);
+
+ var sin_delta_lon=Math.sin(delta_lon);
+ var cos_delta_lon=Math.cos(delta_lon);
+
+ var g =this.sin_lat_o * sin_lat +this.cos_lat_o * cos_lat * cos_delta_lon;
+ if (g == -1.0) {
+ Proj4js.reportError("laea:fwd:Point projects to a circle of radius "+ 2.0 * R);
+ return null;
+ }
+ var ksp = this.a * Math.sqrt(2.0 / (1.0 + g));
+ var x = ksp * cos_lat * sin_delta_lon + this.x0;
+ var y = ksp * (this.cos_lat_o * sin_lat - this.sin_lat_o * cos_lat * cos_delta_lon) + this.y0;
+ p.x = x;
+ p.y = y
+ return p;
+ },//lamazFwd()
+
+/* Inverse equations
+ -----------------*/
+ inverse: function(p) {
+ p.x -= this.x0;
+ p.y -= this.y0;
+
+ var Rh = Math.sqrt(p.x *p.x +p.y * p.y);
+ var temp = Rh / (2.0 * this.a);
+
+ if (temp > 1) {
+ Proj4js.reportError("laea:Inv:DataError");
+ return null;
+ }
+
+ var z = 2.0 * Proj4js.common.asinz(temp);
+ var sin_z=Math.sin(z);
+ var cos_z=Math.cos(z);
+
+ var lon =this.long0;
+ if (Math.abs(Rh) > Proj4js.common.EPSLN) {
+ var lat = Proj4js.common.asinz(this.sin_lat_o * cos_z +this. cos_lat_o * sin_z *p.y / Rh);
+ var temp =Math.abs(this.lat0) - Proj4js.common.HALF_PI;
+ if (Math.abs(temp) > Proj4js.common.EPSLN) {
+ temp = cos_z -this.sin_lat_o * Math.sin(lat);
+ if(temp!=0.0) lon=Proj4js.common.adjust_lon(this.long0+Math.atan2(p.x*sin_z*this.cos_lat_o,temp*Rh));
+ } else if (this.lat0 < 0.0) {
+ lon = Proj4js.common.adjust_lon(this.long0 - Math.atan2(-p.x,p.y));
+ } else {
+ lon = Proj4js.common.adjust_lon(this.long0 + Math.atan2(p.x, -p.y));
+ }
+ } else {
+ lat = this.lat0;
+ }
+ //return(OK);
+ p.x = lon;
+ p.y = lat;
+ return p;
+ }//lamazInv()
+};
+
+
+
+/* ======================================================================
+ projCode/aeqd.js
+ ====================================================================== */
+
+Proj4js.Proj.aeqd = {
+
+ init : function() {
+ this.sin_p12=Math.sin(this.lat0)
+ this.cos_p12=Math.cos(this.lat0)
+ },
+
+ forward: function(p) {
+ var lon=p.x;
+ var lat=p.y;
+ var ksp;
+
+ var sinphi=Math.sin(p.y);
+ var cosphi=Math.cos(p.y);
+ var dlon = Proj4js.common.adjust_lon(lon - this.long0);
+ var coslon = Math.cos(dlon);
+ var g = this.sin_p12 * sinphi + this.cos_p12 * cosphi * coslon;
+ if (Math.abs(Math.abs(g) - 1.0) < Proj4js.common.EPSLN) {
+ ksp = 1.0;
+ if (g < 0.0) {
+ Proj4js.reportError("aeqd:Fwd:PointError");
+ return;
+ }
+ } else {
+ var z = Math.acos(g);
+ ksp = z/Math.sin(z);
+ }
+ p.x = this.x0 + this.a * ksp * cosphi * Math.sin(dlon);
+ p.y = this.y0 + this.a * ksp * (this.cos_p12 * sinphi - this.sin_p12 * cosphi * coslon);
+ return p;
+ },
+
+ inverse: function(p){
+ p.x -= this.x0;
+ p.y -= this.y0;
+
+ var rh = Math.sqrt(p.x * p.x + p.y *p.y);
+ if (rh > (2.0 * Proj4js.common.HALF_PI * this.a)) {
+ Proj4js.reportError("aeqdInvDataError");
+ return;
+ }
+ var z = rh / this.a;
+
+ var sinz=Math.sin(z)
+ var cosz=Math.cos(z)
+
+ var lon = this.long0;
+ var lat;
+ if (Math.abs(rh) <= Proj4js.common.EPSLN) {
+ lat = this.lat0;
+ } else {
+ lat = Proj4js.common.asinz(cosz * this.sin_p12 + (p.y * sinz * this.cos_p12) / rh);
+ var con = Math.abs(this.lat0) - Proj4js.common.HALF_PI;
+ if (Math.abs(con) <= Proj4js.common.EPSLN) {
+ if (lat0 >= 0.0) {
+ lon = Proj4js.common.adjust_lon(this.long0 + Math.atan2(p.x , -p.y));
+ } else {
+ lon = Proj4js.common.adjust_lon(this.long0 - Math.atan2(-p.x , p.y));
+ }
+ } else {
+ con = cosz - this.sin_p12 * Math.sin(lat);
+ if ((Math.abs(con) < Proj4js.common.EPSLN) && (Math.abs(p.x) < Proj4js.common.EPSLN)) {
+ //no-op, just keep the lon value as is
+ } else {
+ var temp = Math.atan2((p.x * sinz * this.cos_p12), (con * rh));
+ lon = Proj4js.common.adjust_lon(this.long0 + Math.atan2((p.x * sinz * this.cos_p12), (con * rh)));
+ }
+ }
+ }
+
+ p.x = lon;
+ p.y = lat;
+ return p;
+ }
+};
+/* ======================================================================
+ projCode/moll.js
+ ====================================================================== */
+
+/*******************************************************************************
+NAME MOLLWEIDE
+
+PURPOSE: Transforms input longitude and latitude to Easting and
+ Northing for the MOllweide projection. The
+ longitude and latitude must be in radians. The Easting
+ and Northing values will be returned in meters.
+
+PROGRAMMER DATE
+---------- ----
+D. Steinwand, EROS May, 1991; Updated Sept, 1992; Updated Feb, 1993
+S. Nelson, EDC Jun, 2993; Made corrections in precision and
+ number of iterations.
+
+ALGORITHM REFERENCES
+
+1. Snyder, John P. and Voxland, Philip M., "An Album of Map Projections",
+ U.S. Geological Survey Professional Paper 1453 , United State Government
+ Printing Office, Washington D.C., 1989.
+
+2. Snyder, John P., "Map Projections--A Working Manual", U.S. Geological
+ Survey Professional Paper 1395 (Supersedes USGS Bulletin 1532), United
+ State Government Printing Office, Washington D.C., 1987.
+*******************************************************************************/
+
+Proj4js.Proj.moll = {
+
+ /* Initialize the Mollweide projection
+ ------------------------------------*/
+ init: function(){
+ //no-op
+ },
+
+ /* Mollweide forward equations--mapping lat,long to x,y
+ ----------------------------------------------------*/
+ forward: function(p) {
+
+ /* Forward equations
+ -----------------*/
+ var lon=p.x;
+ var lat=p.y;
+
+ var delta_lon = Proj4js.common.adjust_lon(lon - this.long0);
+ var theta = lat;
+ var con = Proj4js.common.PI * Math.sin(lat);
+
+ /* Iterate using the Newton-Raphson method to find theta
+ -----------------------------------------------------*/
+ for (var i=0;;i++) {
+ var delta_theta = -(theta + Math.sin(theta) - con)/ (1.0 + Math.cos(theta));
+ theta += delta_theta;
+ if (Math.abs(delta_theta) < Proj4js.common.EPSLN) break;
+ if (i >= 50) {
+ Proj4js.reportError("moll:Fwd:IterationError");
+ //return(241);
+ }
+ }
+ theta /= 2.0;
+
+ /* If the latitude is 90 deg, force the x coordinate to be "0 + false easting"
+ this is done here because of precision problems with "cos(theta)"
+ --------------------------------------------------------------------------*/
+ if (Proj4js.common.PI/2 - Math.abs(lat) < Proj4js.common.EPSLN) delta_lon =0;
+ var x = 0.900316316158 * this.a * delta_lon * Math.cos(theta) + this.x0;
+ var y = 1.4142135623731 * this.a * Math.sin(theta) + this.y0;
+
+ p.x=x;
+ p.y=y;
+ return p;
+ },
+
+ inverse: function(p){
+ var theta;
+ var arg;
+
+ /* Inverse equations
+ -----------------*/
+ p.x-= this.x0;
+ //~ p.y -= this.y0;
+ var arg = p.y / (1.4142135623731 * this.a);
+
+ /* Because of division by zero problems, 'arg' can not be 1.0. Therefore
+ a number very close to one is used instead.
+ -------------------------------------------------------------------*/
+ if(Math.abs(arg) > 0.999999999999) arg=0.999999999999;
+ var theta =Math.asin(arg);
+ var lon = Proj4js.common.adjust_lon(this.long0 + (p.x / (0.900316316158 * this.a * Math.cos(theta))));
+ if(lon < (-Proj4js.common.PI)) lon= -Proj4js.common.PI;
+ if(lon > Proj4js.common.PI) lon= Proj4js.common.PI;
+ arg = (2.0 * theta + Math.sin(2.0 * theta)) / Proj4js.common.PI;
+ if(Math.abs(arg) > 1.0)arg=1.0;
+ var lat = Math.asin(arg);
+ //return(OK);
+
+ p.x=lon;
+ p.y=lat;
+ return p;
+ }
+};
+
Added: trunk/mapbender/http/extensions/proj4js/lib/proj4js-compressed.js
===================================================================
--- trunk/mapbender/http/extensions/proj4js/lib/proj4js-compressed.js (rev 0)
+++ trunk/mapbender/http/extensions/proj4js/lib/proj4js-compressed.js 2009-08-31 13:30:38 UTC (rev 4581)
@@ -0,0 +1,240 @@
+/*
+ proj4js.js -- Javascript reprojection library.
+
+ Authors: Mike Adair madairATdmsolutions.ca
+ Richard Greenwood richATgreenwoodmap.com
+ Didier Richard
+ Stephen Irons
+ License: LGPL as per: http://www.gnu.org/copyleft/lesser.html
+ Note: This program is an almost direct port of the C library
+ Proj4.
+*/
+Proj4js={defaultDatum:'WGS84',transform:function(source,dest,point){if(!source.readyToUse||!dest.readyToUse){this.reportError("Proj4js initialization for "+source.srsCode+" not yet complete");return point;}
+if((source.srsProjNumber=="900913"&&dest.datumCode!="WGS84")||(dest.srsProjNumber=="900913"&&source.datumCode!="WGS84")){var wgs84=Proj4js.WGS84;this.transform(source,wgs84,point);source=wgs84;}
+if(source.projName=="longlat"){point.x*=Proj4js.common.D2R;point.y*=Proj4js.common.D2R;}else{if(source.to_meter){point.x*=source.to_meter;point.y*=source.to_meter;}
+source.inverse(point);}
+if(source.from_greenwich){point.x+=source.from_greenwich;}
+point=this.datum_transform(source.datum,dest.datum,point);if(dest.from_greenwich){point.x-=dest.from_greenwich;}
+if(dest.projName=="longlat"){point.x*=Proj4js.common.R2D;point.y*=Proj4js.common.R2D;}else{dest.forward(point);if(dest.to_meter){point.x/=dest.to_meter;point.y/=dest.to_meter;}}
+return point;},datum_transform:function(source,dest,point){if(source.compare_datums(dest)){return point;}
+if(source.datum_type==Proj4js.common.PJD_NODATUM||dest.datum_type==Proj4js.common.PJD_NODATUM){return point;}
+if(source.datum_type==Proj4js.common.PJD_GRIDSHIFT)
+{alert("ERROR: Grid shift transformations are not implemented yet.");}
+if(dest.datum_type==Proj4js.common.PJD_GRIDSHIFT)
+{alert("ERROR: Grid shift transformations are not implemented yet.");}
+if(source.es!=dest.es||source.a!=dest.a||source.datum_type==Proj4js.common.PJD_3PARAM||source.datum_type==Proj4js.common.PJD_7PARAM||dest.datum_type==Proj4js.common.PJD_3PARAM||dest.datum_type==Proj4js.common.PJD_7PARAM)
+{source.geodetic_to_geocentric(point);if(source.datum_type==Proj4js.common.PJD_3PARAM||source.datum_type==Proj4js.common.PJD_7PARAM){source.geocentric_to_wgs84(point);}
+if(dest.datum_type==Proj4js.common.PJD_3PARAM||dest.datum_type==Proj4js.common.PJD_7PARAM){dest.geocentric_from_wgs84(point);}
+dest.geocentric_to_geodetic(point);}
+if(dest.datum_type==Proj4js.common.PJD_GRIDSHIFT)
+{alert("ERROR: Grid shift transformations are not implemented yet.");}
+return point;},reportError:function(msg){},extend:function(destination,source){destination=destination||{};if(source){for(var property in source){var value=source[property];if(value!==undefined){destination[property]=value;}}}
+return destination;},Class:function(){var Class=function(){this.initialize.apply(this,arguments);};var extended={};var parent;for(var i=0;i<arguments.length;++i){if(typeof arguments[i]=="function"){parent=arguments[i].prototype;}else{parent=arguments[i];}
+Proj4js.extend(extended,parent);}
+Class.prototype=extended;return Class;},bind:function(func,object){var args=Array.prototype.slice.apply(arguments,[2]);return function(){var newArgs=args.concat(Array.prototype.slice.apply(arguments,[0]));return func.apply(object,newArgs);};},scriptName:"proj4js.js",defsLookupService:'http://spatialreference.org/ref',libPath:null,getScriptLocation:function(){if(this.libPath)return this.libPath;var scriptName=this.scriptName;var scriptNameLen=scriptName.length;var scripts=document.getElementsByTagName('script');for(var i=0;i<scripts.length;i++){var src=scripts[i].getAttribute('src');if(src){var index=src.lastIndexOf(scriptName);if((index>-1)&&(index+scriptNameLen==src.length)){this.libPath=src.slice(0,-scriptNameLen);break;}}}
+return this.libPath||"";},loadScript:function(url,onload,onfail,loadCheck){var script=document.createElement('script');script.defer=false;script.type="text/javascript";script.id=url;script.src=url;script.onload=onload;script.onerror=onfail;script.loadCheck=loadCheck;if(/MSIE/.test(navigator.userAgent)){script.onreadystatechange=this.checkReadyState;}
+document.getElementsByTagName('head')[0].appendChild(script);},checkReadyState:function(){if(this.readyState=='loaded'){if(!this.loadCheck()){this.onerror();}else{this.onload();}}}};Proj4js.Proj=Proj4js.Class({readyToUse:false,title:null,projName:null,units:null,datum:null,initialize:function(srsCode){this.srsCode=srsCode.toUpperCase();if(this.srsCode.indexOf("EPSG")==0){this.srsCode=this.srsCode;this.srsAuth='epsg';this.srsProjNumber=this.srsCode.substring(5);}else if(this.srsCode.indexOf("IGNF")==0){this.srsCode=this.srsCode;this.srsAuth='IGNF';this.srsProjNumber=this.srsCode.substring(5);}else if(this.srsCode.indexOf("CRS")==0){this.srsCode=this.srsCode;this.srsAuth='CRS';this.srsProjNumber=this.srsCode.substring(4);}else{this.srsAuth='';this.srsProjNumber=this.srsCode;}
+this.loadProjDefinition();},loadProjDefinition:function(){if(Proj4js.defs[this.srsCode]){this.defsLoaded();return;}
+var url=Proj4js.getScriptLocation()+'defs/'+this.srsAuth.toUpperCase()+this.srsProjNumber+'.js';Proj4js.loadScript(url,Proj4js.bind(this.defsLoaded,this),Proj4js.bind(this.loadFromService,this),Proj4js.bind(this.checkDefsLoaded,this));},loadFromService:function(){var url=Proj4js.defsLookupService+'/'+this.srsAuth+'/'+this.srsProjNumber+'/proj4js';Proj4js.loadScript(url,Proj4js.bind(this.defsLoaded,this),Proj4js.bind(this.defsFailed,this),Proj4js.bind(this.checkDefsLoaded,this));},defsLoaded:function(){this.parseDefs();this.loadProjCode(this.projName);},checkDefsLoaded:function(){if(Proj4js.defs[this.srsCode]){return true;}else{return false;}},defsFailed:function(){Proj4js.reportError('failed to load projection definition for: '+this.srsCode);Proj4js.extend(Proj4js.defs[this.srsCode],Proj4js.defs['WGS84']);this.defsLoaded();},loadProjCode:function(projName){if(Proj4js.Proj[projName]){this.initTransforms();return;}
+var url=Proj4js.getScriptLocation()+'projCode/'+projName+'.js';Proj4js.loadScript(url,Proj4js.bind(this.loadProjCodeSuccess,this,projName),Proj4js.bind(this.loadProjCodeFailure,this,projName),Proj4js.bind(this.checkCodeLoaded,this,projName));},loadProjCodeSuccess:function(projName){if(Proj4js.Proj[projName].dependsOn){this.loadProjCode(Proj4js.Proj[projName].dependsOn);}else{this.initTransforms();}},loadProjCodeFailure:function(projName){Proj4js.reportError("failed to find projection file for: "+projName);},checkCodeLoaded:function(projName){if(Proj4js.Proj[projName]){return true;}else{return false;}},initTransforms:function(){Proj4js.extend(this,Proj4js.Proj[this.projName]);this.init();this.readyToUse=true;},parseDefs:function(){this.defData=Proj4js.defs[this.srsCode];var paramName,paramVal;var paramArray=this.defData.split("+");for(var prop=0;prop<paramArray.length;prop++){var property=paramArray[prop].split("=");paramName=property[0].toLowerCase();paramVal=property[1];switch(paramName.replace(/\s/gi,"")){case"":break;case"title":this.title=paramVal;break;case"proj":this.projName=paramVal.replace(/\s/gi,"");break;case"units":this.units=paramVal.replace(/\s/gi,"");break;case"datum":this.datumCode=paramVal.replace(/\s/gi,"");break;case"nadgrids":this.nagrids=paramVal.replace(/\s/gi,"");break;case"ellps":this.ellps=paramVal.replace(/\s/gi,"");break;case"a":this.a=parseFloat(paramVal);break;case"b":this.b=parseFloat(paramVal);break;case"rf":this.rf=parseFloat(paramVal);break;case"lat_0":this.lat0=paramVal*Proj4js.common.D2R;break;case"lat_1":this.lat1=paramVal*Proj4js.common.D2R;break;case"lat_2":this.lat2=paramVal*Proj4js.common.D2R;break;case"lat_ts":this.lat_ts=paramVal*Proj4js.common.D2R;break;case"lon_0":this.long0=paramVal*Proj4js.common.D2R;break;case"alpha":this.alpha=parseFloat(paramVal)*Proj4js.common.D2R;break;case"lonc":this.longc=paramVal*Proj4js.common.D2R;break;case"x_0":this.x0=parseFloat(paramVal);break;case"y_0":this.y0=parseFloat(paramVal);break;case"k_0":this.k0=parseFloat(paramVal);break;case"k":this.k0=parseFloat(paramVal);break;case"R_A":this.R=true;break;case"zone":this.zone=parseInt(paramVal);break;case"south":this.utmSouth=true;break;case"towgs84":this.datum_params=paramVal.split(",");break;case"to_meter":this.to_meter=parseFloat(paramVal);break;case"from_greenwich":this.from_greenwich=paramVal*Proj4js.common.D2R;break;case"pm":paramVal=paramVal.replace(/\s/gi,"");this.from_greenwich=Proj4js.PrimeMeridian[paramVal]?Proj4js.PrimeMeridian[paramVal]:parseFloat(paramVal);this.from_greenwich*=Proj4js.common.D2R;break;case"no_defs":break;default:}}
+this.deriveConstants();},deriveConstants:function(){if(this.nagrids=='@null')this.datumCode='none';if(this.datumCode&&this.datumCode!='none'){var datumDef=Proj4js.Datum[this.datumCode];if(datumDef){this.datum_params=datumDef.towgs84.split(',');this.ellps=datumDef.ellipse;this.datumName=datumDef.datumName?datumDef.datumName:this.datumCode;}}
+if(!this.a){var ellipse=Proj4js.Ellipsoid[this.ellps]?Proj4js.Ellipsoid[this.ellps]:Proj4js.Ellipsoid['WGS84'];Proj4js.extend(this,ellipse);}
+if(this.rf&&!this.b)this.b=(1.0-1.0/this.rf)*this.a;if(Math.abs(this.a-this.b)<Proj4js.common.EPSLN){this.sphere=true;this.b=this.a;}
+this.a2=this.a*this.a;this.b2=this.b*this.b;this.es=(this.a2-this.b2)/this.a2;this.e=Math.sqrt(this.es);if(this.R_A){this.a*=1.-this.es*(Proj4js.common.SIXTH+this.es*(Proj4js.RA4+this.es*Proj4js.RA6));this.a2=this.a*this.a;this.b2=this.b*this.b;this.es=0.;}
+this.ep2=(this.a2-this.b2)/this.b2;if(!this.k0)this.k0=1.0;this.datum=new Proj4js.datum(this);}});Proj4js.Proj.longlat={init:function(){},forward:function(pt){return pt;},inverse:function(pt){return pt;}};Proj4js.defs={'WGS84':"+title=long/lat:WGS84 +proj=longlat +ellps=WGS84 +datum=WGS84 +units=degrees",'EPSG:4326':"+title=long/lat:WGS84 +proj=longlat +a=6378137.0 +b=6356752.31424518 +ellps=WGS84 +datum=WGS84 +units=degrees",'EPSG:4269':"+title=long/lat:NAD83 +proj=longlat +a=6378137.0 +b=6356752.31414036 +ellps=GRS80 +datum=NAD83 +units=degrees"};Proj4js.common={PI:3.141592653589793238,HALF_PI:1.570796326794896619,TWO_PI:6.283185307179586477,FORTPI:0.78539816339744833,R2D:57.29577951308232088,D2R:0.01745329251994329577,SEC_TO_RAD:4.84813681109535993589914102357e-6,EPSLN:1.0e-10,MAX_ITER:20,COS_67P5:0.38268343236508977,AD_C:1.0026000,PJD_UNKNOWN:0,PJD_3PARAM:1,PJD_7PARAM:2,PJD_GRIDSHIFT:3,PJD_WGS84:4,PJD_NODATUM:5,SRS_WGS84_SEMIMAJOR:6378137.0,SIXTH:.1666666666666666667,RA4:.04722222222222222222,RA6:.02215608465608465608,RV4:.06944444444444444444,RV6:.04243827160493827160,msfnz:function(eccent,sinphi,cosphi){var con=eccent*sinphi;return cosphi/(Math.sqrt(1.0-con*con));},tsfnz:function(eccent,phi,sinphi){var con=eccent*sinphi;var com=.5*eccent;con=Math.pow(((1.0-con)/(1.0+con)),com);return(Math.tan(.5*(this.HALF_PI-phi))/con);},phi2z:function(eccent,ts){var eccnth=.5*eccent;var con,dphi;var phi=this.HALF_PI-2*Math.atan(ts);for(i=0;i<=15;i++){con=eccent*Math.sin(phi);dphi=this.HALF_PI-2*Math.atan(ts*(Math.pow(((1.0-con)/(1.0+con)),eccnth)))-phi;phi+=dphi;if(Math.abs(dphi)<=.0000000001)return phi;}
+alert("phi2z has NoConvergence");return(-9999);},qsfnz:function(eccent,sinphi,cosphi){var con;if(eccent>1.0e-7){con=eccent*sinphi;return((1.0-eccent*eccent)*(sinphi/(1.0-con*con)-(.5/eccent)*Math.log((1.0-con)/(1.0+con))));}else{return(2.0*sinphi);}},asinz:function(x){if(Math.abs(x)>1.0){x=(x>1.0)?1.0:-1.0;}
+return Math.asin(x);},e0fn:function(x){return(1.0-0.25*x*(1.0+x/16.0*(3.0+1.25*x)));},e1fn:function(x){return(0.375*x*(1.0+0.25*x*(1.0+0.46875*x)));},e2fn:function(x){return(0.05859375*x*x*(1.0+0.75*x));},e3fn:function(x){return(x*x*x*(35.0/3072.0));},mlfn:function(e0,e1,e2,e3,phi){return(e0*phi-e1*Math.sin(2.0*phi)+e2*Math.sin(4.0*phi)-e3*Math.sin(6.0*phi));},srat:function(esinp,exp){return(Math.pow((1.0-esinp)/(1.0+esinp),exp));},sign:function(x){if(x<0.0)return(-1);else return(1);},adjust_lon:function(x){x=(Math.abs(x)<this.PI)?x:(x-(this.sign(x)*this.TWO_PI));return x;},adjust_lat:function(x){x=(Math.abs(x)<this.HALF_PI)?x:(x-(this.sign(x)*this.PI));return x;},latiso:function(eccent,phi,sinphi)
+{if(Math.abs(phi)>this.HALF_PI)return+Number.NaN;if(phi==this.HALF_PI)return Number.POSITIVE_INFINITY;if(phi==-1.0*this.HALF_PI)return-1.0*Number.POSITIVE_INFINITY;var con=eccent*sinphi;return Math.log(Math.tan((this.HALF_PI+phi)/2.0))+eccent*Math.log((1.0-con)/(1.0+con))/2.0;},fL:function(x,L){return 2.0*Math.atan(x*Math.exp(L))-this.HALF_PI;},invlatiso:function(eccent,ts){var phi=this.fL(1.0,ts);var Iphi=0.0;var con=0.0;do{Iphi=phi;con=eccent*Math.sin(Iphi);phi=this.fL(Math.exp(eccent*Math.log((1.0+con)/(1.0-con))/2.0),ts)}while(Math.abs(phi-Iphi)>1.0e-12);return phi;},sinh:function(x)
+{var r=Math.exp(x);r=(r-1.0/r)/2.0;return r;},cosh:function(x)
+{var r=Math.exp(x);r=(r+1.0/r)/2.0;return r;},tanh:function(x)
+{var r=Math.exp(x);r=(r-1.0/r)/(r+1.0/r);return r;},asinh:function(x)
+{var s=(x>=0?1.0:-1.0);return s*(Math.log(Math.abs(x)+Math.sqrt(x*x+1.0)));},acosh:function(x)
+{return 2.0*Math.log(Math.sqrt((x+1.0)/2.0)+Math.sqrt((x-1.0)/2.0));},atanh:function(x)
+{return Math.log((x-1.0)/(x+1.0))/2.0;},gN:function(a,e,sinphi)
+{var temp=e*sinphi;return a/Math.sqrt(1.0-temp*temp);}};Proj4js.datum=Proj4js.Class({initialize:function(proj){this.datum_type=Proj4js.common.PJD_WGS84;if(proj.datumCode&&proj.datumCode=='none'){this.datum_type=Proj4js.common.PJD_NODATUM;}
+if(proj&&proj.datum_params){for(var i=0;i<proj.datum_params.length;i++){proj.datum_params[i]=parseFloat(proj.datum_params[i]);}
+if(proj.datum_params[0]!=0||proj.datum_params[1]!=0||proj.datum_params[2]!=0){this.datum_type=Proj4js.common.PJD_3PARAM;}
+if(proj.datum_params.length>3){if(proj.datum_params[3]!=0||proj.datum_params[4]!=0||proj.datum_params[5]!=0||proj.datum_params[6]!=0){this.datum_type=Proj4js.common.PJD_7PARAM;proj.datum_params[3]*=Proj4js.common.SEC_TO_RAD;proj.datum_params[4]*=Proj4js.common.SEC_TO_RAD;proj.datum_params[5]*=Proj4js.common.SEC_TO_RAD;proj.datum_params[6]=(proj.datum_params[6]/1000000.0)+1.0;}}}
+if(proj){this.a=proj.a;this.b=proj.b;this.es=proj.es;this.ep2=proj.ep2;this.datum_params=proj.datum_params;}},compare_datums:function(dest){if(this.datum_type!=dest.datum_type){return false;}else if(this.a!=dest.a||Math.abs(this.es-dest.es)>0.000000000050){return false;}else if(this.datum_type==Proj4js.common.PJD_3PARAM){return(this.datum_params[0]==dest.datum_params[0]&&this.datum_params[1]==dest.datum_params[1]&&this.datum_params[2]==dest.datum_params[2]);}else if(this.datum_type==Proj4js.common.PJD_7PARAM){return(this.datum_params[0]==dest.datum_params[0]&&this.datum_params[1]==dest.datum_params[1]&&this.datum_params[2]==dest.datum_params[2]&&this.datum_params[3]==dest.datum_params[3]&&this.datum_params[4]==dest.datum_params[4]&&this.datum_params[5]==dest.datum_params[5]&&this.datum_params[6]==dest.datum_params[6]);}else if(this.datum_type==Proj4js.common.PJD_GRIDSHIFT){return strcmp(pj_param(this.params,"snadgrids").s,pj_param(dest.params,"snadgrids").s)==0;}else{return true;}},geodetic_to_geocentric:function(p){var Longitude=p.x;var Latitude=p.y;var Height=p.z?p.z:0;var X;var Y;var Z;var Error_Code=0;var Rn;var Sin_Lat;var Sin2_Lat;var Cos_Lat;if(Latitude<-Proj4js.common.HALF_PI&&Latitude>-1.001*Proj4js.common.HALF_PI){Latitude=-Proj4js.common.HALF_PI;}else if(Latitude>Proj4js.common.HALF_PI&&Latitude<1.001*Proj4js.common.HALF_PI){Latitude=Proj4js.common.HALF_PI;}else if((Latitude<-Proj4js.common.HALF_PI)||(Latitude>Proj4js.common.HALF_PI)){Proj4js.reportError('geocent:lat out of range:'+Latitude);return null;}
+if(Longitude>Proj4js.common.PI)Longitude-=(2*Proj4js.common.PI);Sin_Lat=Math.sin(Latitude);Cos_Lat=Math.cos(Latitude);Sin2_Lat=Sin_Lat*Sin_Lat;Rn=this.a/(Math.sqrt(1.0e0-this.es*Sin2_Lat));X=(Rn+Height)*Cos_Lat*Math.cos(Longitude);Y=(Rn+Height)*Cos_Lat*Math.sin(Longitude);Z=((Rn*(1-this.es))+Height)*Sin_Lat;p.x=X;p.y=Y;p.z=Z;return Error_Code;},geocentric_to_geodetic:function(p){var genau=1.E-12;var genau2=(genau*genau);var maxiter=30;var P;var RR;var CT;var ST;var RX;var RK;var RN;var CPHI0;var SPHI0;var CPHI;var SPHI;var SDPHI;var At_Pole;var iter;var X=p.x;var Y=p.y;var Z=p.z?p.z:0.0;var Longitude;var Latitude;var Height;At_Pole=false;P=Math.sqrt(X*X+Y*Y);RR=Math.sqrt(X*X+Y*Y+Z*Z);if(P/this.a<genau){At_Pole=true;Longitude=0.0;if(RR/this.a<genau){Latitude=Proj4js.common.HALF_PI;Height=-this.b;return;}}else{Longitude=Math.atan2(Y,X);}
+CT=Z/RR;ST=P/RR;RX=1.0/Math.sqrt(1.0-this.es*(2.0-this.es)*ST*ST);CPHI0=ST*(1.0-this.es)*RX;SPHI0=CT*RX;iter=0;do
+{iter++;RN=this.a/Math.sqrt(1.0-this.es*SPHI0*SPHI0);Height=P*CPHI0+Z*SPHI0-RN*(1.0-this.es*SPHI0*SPHI0);RK=this.es*RN/(RN+Height);RX=1.0/Math.sqrt(1.0-RK*(2.0-RK)*ST*ST);CPHI=ST*(1.0-RK)*RX;SPHI=CT*RX;SDPHI=SPHI*CPHI0-CPHI*SPHI0;CPHI0=CPHI;SPHI0=SPHI;}
+while(SDPHI*SDPHI>genau2&&iter<maxiter);Latitude=Math.atan(SPHI/Math.abs(CPHI));p.x=Longitude;p.y=Latitude;p.z=Height;return p;},geocentric_to_geodetic_noniter:function(p){var X=p.x;var Y=p.y;var Z=p.z?p.z:0;var Longitude;var Latitude;var Height;var W;var W2;var T0;var T1;var S0;var S1;var Sin_B0;var Sin3_B0;var Cos_B0;var Sin_p1;var Cos_p1;var Rn;var Sum;var At_Pole;X=parseFloat(X);Y=parseFloat(Y);Z=parseFloat(Z);At_Pole=false;if(X!=0.0)
+{Longitude=Math.atan2(Y,X);}
+else
+{if(Y>0)
+{Longitude=Proj4js.common.HALF_PI;}
+else if(Y<0)
+{Longitude=-Proj4js.common.HALF_PI;}
+else
+{At_Pole=true;Longitude=0.0;if(Z>0.0)
+{Latitude=Proj4js.common.HALF_PI;}
+else if(Z<0.0)
+{Latitude=-Proj4js.common.HALF_PI;}
+else
+{Latitude=Proj4js.common.HALF_PI;Height=-this.b;return;}}}
+W2=X*X+Y*Y;W=Math.sqrt(W2);T0=Z*Proj4js.common.AD_C;S0=Math.sqrt(T0*T0+W2);Sin_B0=T0/S0;Cos_B0=W/S0;Sin3_B0=Sin_B0*Sin_B0*Sin_B0;T1=Z+this.b*this.ep2*Sin3_B0;Sum=W-this.a*this.es*Cos_B0*Cos_B0*Cos_B0;S1=Math.sqrt(T1*T1+Sum*Sum);Sin_p1=T1/S1;Cos_p1=Sum/S1;Rn=this.a/Math.sqrt(1.0-this.es*Sin_p1*Sin_p1);if(Cos_p1>=Proj4js.common.COS_67P5)
+{Height=W/Cos_p1-Rn;}
+else if(Cos_p1<=-Proj4js.common.COS_67P5)
+{Height=W/-Cos_p1-Rn;}
+else
+{Height=Z/Sin_p1+Rn*(this.es-1.0);}
+if(At_Pole==false)
+{Latitude=Math.atan(Sin_p1/Cos_p1);}
+p.x=Longitude;p.y=Latitude;p.z=Height;return p;},geocentric_to_wgs84:function(p){if(this.datum_type==Proj4js.common.PJD_3PARAM)
+{p.x+=this.datum_params[0];p.y+=this.datum_params[1];p.z+=this.datum_params[2];}
+else if(this.datum_type==Proj4js.common.PJD_7PARAM)
+{var Dx_BF=this.datum_params[0];var Dy_BF=this.datum_params[1];var Dz_BF=this.datum_params[2];var Rx_BF=this.datum_params[3];var Ry_BF=this.datum_params[4];var Rz_BF=this.datum_params[5];var M_BF=this.datum_params[6];var x_out=M_BF*(p.x-Rz_BF*p.y+Ry_BF*p.z)+Dx_BF;var y_out=M_BF*(Rz_BF*p.x+p.y-Rx_BF*p.z)+Dy_BF;var z_out=M_BF*(-Ry_BF*p.x+Rx_BF*p.y+p.z)+Dz_BF;p.x=x_out;p.y=y_out;p.z=z_out;}},geocentric_from_wgs84:function(p){if(this.datum_type==Proj4js.common.PJD_3PARAM)
+{p.x-=this.datum_params[0];p.y-=this.datum_params[1];p.z-=this.datum_params[2];}
+else if(this.datum_type==Proj4js.common.PJD_7PARAM)
+{var Dx_BF=this.datum_params[0];var Dy_BF=this.datum_params[1];var Dz_BF=this.datum_params[2];var Rx_BF=this.datum_params[3];var Ry_BF=this.datum_params[4];var Rz_BF=this.datum_params[5];var M_BF=this.datum_params[6];var x_tmp=(p.x-Dx_BF)/M_BF;var y_tmp=(p.y-Dy_BF)/M_BF;var z_tmp=(p.z-Dz_BF)/M_BF;p.x=x_tmp+Rz_BF*y_tmp-Ry_BF*z_tmp;p.y=-Rz_BF*x_tmp+y_tmp+Rx_BF*z_tmp;p.z=Ry_BF*x_tmp-Rx_BF*y_tmp+z_tmp;}}});Proj4js.Point=Proj4js.Class({initialize:function(x,y,z){if(typeof x=='object'){this.x=x[0];this.y=x[1];this.z=x[2]||0.0;}else if(typeof x=='string'){var coords=x.split(',');this.x=parseFloat(coords[0]);this.y=parseFloat(coords[1]);this.z=parseFloat(coords[2])||0.0;}else{this.x=x;this.y=y;this.z=z||0.0;}},clone:function(){return new Proj4js.Point(this.x,this.y,this.z);},toString:function(){return("x="+this.x+",y="+this.y);},toShortString:function(){return(this.x+", "+this.y);}});Proj4js.PrimeMeridian={"greenwich":0.0,"lisbon":-9.131906111111,"paris":2.337229166667,"bogota":-74.080916666667,"madrid":-3.687938888889,"rome":12.452333333333,"bern":7.439583333333,"jakarta":106.807719444444,"ferro":-17.666666666667,"brussels":4.367975,"stockholm":18.058277777778,"athens":23.7163375,"oslo":10.722916666667};Proj4js.Ellipsoid={"MERIT":{a:6378137.0,rf:298.257,ellipseName:"MERIT 1983"},"SGS85":{a:6378136.0,rf:298.257,ellipseName:"Soviet Geodetic System 85"},"GRS80":{a:6378137.0,rf:298.257222101,ellipseName:"GRS 1980(IUGG, 1980)"},"IAU76":{a:6378140.0,rf:298.257,ellipseName:"IAU 1976"},"airy":{a:6377563.396,b:6356256.910,ellipseName:"Airy 1830"},"APL4.":{a:6378137,rf:298.25,ellipseName:"Appl. Physics. 1965"},"NWL9D":{a:6378145.0,rf:298.25,ellipseName:"Naval Weapons Lab., 1965"},"mod_airy":{a:6377340.189,b:6356034.446,ellipseName:"Modified Airy"},"andrae":{a:6377104.43,rf:300.0,ellipseName:"Andrae 1876 (Den., Iclnd.)"},"aust_SA":{a:6378160.0,rf:298.25,ellipseName:"Australian Natl & S. Amer. 1969"},"GRS67":{a:6378160.0,rf:298.2471674270,ellipseName:"GRS 67(IUGG 1967)"},"bessel":{a:6377397.155,rf:299.1528128,ellipseName:"Bessel 1841"},"bess_nam":{a:6377483.865,rf:299.1528128,ellipseName:"Bessel 1841 (Namibia)"},"clrk66":{a:6378206.4,b:6356583.8,ellipseName:"Clarke 1866"},"clrk80":{a:6378249.145,rf:293.4663,ellipseName:"Clarke 1880 mod."},"CPM":{a:6375738.7,rf:334.29,ellipseName:"Comm. des Poids et Mesures 1799"},"delmbr":{a:6376428.0,rf:311.5,ellipseName:"Delambre 1810 (Belgium)"},"engelis":{a:6378136.05,rf:298.2566,ellipseName:"Engelis 1985"},"evrst30":{a:6377276.345,rf:300.8017,ellipseName:"Everest 1830"},"evrst48":{a:6377304.063,rf:300.8017,ellipseName:"Everest 1948"},"evrst56":{a:6377301.243,rf:300.8017,ellipseName:"Everest 1956"},"evrst69":{a:6377295.664,rf:300.8017,ellipseName:"Everest 1969"},"evrstSS":{a:6377298.556,rf:300.8017,ellipseName:"Everest (Sabah & Sarawak)"},"fschr60":{a:6378166.0,rf:298.3,ellipseName:"Fischer (Mercury Datum) 1960"},"fschr60m":{a:6378155.0,rf:298.3,ellipseName:"Fischer 1960"},"fschr68":{a:6378150.0,rf:298.3,ellipseName:"Fischer 1968"},"helmert":{a:6378200.0,rf:298.3,ellipseName:"Helmert 1906"},"hough":{a:6378270.0,rf:297.0,ellipseName:"Hough"},"intl":{a:6378388.0,rf:297.0,ellipseName:"International 1909 (Hayford)"},"kaula":{a:6378163.0,rf:298.24,ellipseName:"Kaula 1961"},"lerch":{a:6378139.0,rf:298.257,ellipseName:"Lerch 1979"},"mprts":{a:6397300.0,rf:191.0,ellipseName:"Maupertius 1738"},"new_intl":{a:6378157.5,b:6356772.2,ellipseName:"New International 1967"},"plessis":{a:6376523.0,rf:6355863.0,ellipseName:"Plessis 1817 (France)"},"krass":{a:6378245.0,rf:298.3,ellipseName:"Krassovsky, 1942"},"SEasia":{a:6378155.0,b:6356773.3205,ellipseName:"Southeast Asia"},"walbeck":{a:6376896.0,b:6355834.8467,ellipseName:"Walbeck"},"WGS60":{a:6378165.0,rf:298.3,ellipseName:"WGS 60"},"WGS66":{a:6378145.0,rf:298.25,ellipseName:"WGS 66"},"WGS72":{a:6378135.0,rf:298.26,ellipseName:"WGS 72"},"WGS84":{a:6378137.0,rf:298.257223563,ellipseName:"WGS 84"},"sphere":{a:6370997.0,b:6370997.0,ellipseName:"Normal Sphere (r=6370997)"}};Proj4js.Datum={"WGS84":{towgs84:"0,0,0",ellipse:"WGS84",datumName:"WGS84"},"GGRS87":{towgs84:"-199.87,74.79,246.62",ellipse:"GRS80",datumName:"Greek_Geodetic_Reference_System_1987"},"NAD83":{towgs84:"0,0,0",ellipse:"GRS80",datumName:"North_American_Datum_1983"},"NAD27":{nadgrids:"@conus, at alaska, at ntv2_0.gsb, at ntv1_can.dat",ellipse:"clrk66",datumName:"North_American_Datum_1927"},"potsdam":{towgs84:"606.0,23.0,413.0",ellipse:"bessel",datumName:"Potsdam Rauenberg 1950 DHDN"},"carthage":{towgs84:"-263.0,6.0,431.0",ellipse:"clark80",datumName:"Carthage 1934 Tunisia"},"hermannskogel":{towgs84:"653.0,-212.0,449.0",ellipse:"bessel",datumName:"Hermannskogel"},"ire65":{towgs84:"482.530,-130.596,564.557,-1.042,-0.214,-0.631,8.15",ellipse:"mod_airy",datumName:"Ireland 1965"},"nzgd49":{towgs84:"59.47,-5.04,187.44,0.47,-0.1,1.024,-4.5993",ellipse:"intl",datumName:"New Zealand Geodetic Datum 1949"},"OSGB36":{towgs84:"446.448,-125.157,542.060,0.1502,0.2470,0.8421,-20.4894",ellipse:"airy",datumName:"Airy 1830"}};Proj4js.WGS84=new Proj4js.Proj('WGS84');Proj4js.Datum['OSB36']=Proj4js.Datum['OSGB36'];Proj4js.Proj.aea={init:function(){if(Math.abs(this.lat1+this.lat2)<Proj4js.common.EPSLN){Proj4js.reportError("aeaInitEqualLatitudes");return;}
+this.temp=this.b/this.a;this.es=1.0-Math.pow(this.temp,2);this.e3=Math.sqrt(this.es);this.sin_po=Math.sin(this.lat1);this.cos_po=Math.cos(this.lat1);this.t1=this.sin_po
+this.con=this.sin_po;this.ms1=Proj4js.common.msfnz(this.e3,this.sin_po,this.cos_po);this.qs1=Proj4js.common.qsfnz(this.e3,this.sin_po,this.cos_po);this.sin_po=Math.sin(this.lat2);this.cos_po=Math.cos(this.lat2);this.t2=this.sin_po;this.ms2=Proj4js.common.msfnz(this.e3,this.sin_po,this.cos_po);this.qs2=Proj4js.common.qsfnz(this.e3,this.sin_po,this.cos_po);this.sin_po=Math.sin(this.lat0);this.cos_po=Math.cos(this.lat0);this.t3=this.sin_po;this.qs0=Proj4js.common.qsfnz(this.e3,this.sin_po,this.cos_po);if(Math.abs(this.lat1-this.lat2)>Proj4js.common.EPSLN){this.ns0=(this.ms1*this.ms1-this.ms2*this.ms2)/(this.qs2-this.qs1);}else{this.ns0=this.con;}
+this.c=this.ms1*this.ms1+this.ns0*this.qs1;this.rh=this.a*Math.sqrt(this.c-this.ns0*this.qs0)/this.ns0;},forward:function(p){var lon=p.x;var lat=p.y;this.sin_phi=Math.sin(lat);this.cos_phi=Math.cos(lat);var qs=Proj4js.common.qsfnz(this.e3,this.sin_phi,this.cos_phi);var rh1=this.a*Math.sqrt(this.c-this.ns0*qs)/this.ns0;var theta=this.ns0*Proj4js.common.adjust_lon(lon-this.long0);var x=rh1*Math.sin(theta)+this.x0;var y=this.rh-rh1*Math.cos(theta)+this.y0;p.x=x;p.y=y;return p;},inverse:function(p){var rh1,qs,con,theta,lon,lat;p.x-=this.x0;p.y=this.rh-p.y+this.y0;if(this.ns0>=0){rh1=Math.sqrt(p.x*p.x+p.y*p.y);con=1.0;}else{rh1=-Math.sqrt(p.x*p.x+p.y*p.y);con=-1.0;}
+theta=0.0;if(rh1!=0.0){theta=Math.atan2(con*p.x,con*p.y);}
+con=rh1*this.ns0/this.a;qs=(this.c-con*con)/this.ns0;if(this.e3>=1e-10){con=1-.5*(1.0-this.es)*Math.log((1.0-this.e3)/(1.0+this.e3))/this.e3;if(Math.abs(Math.abs(con)-Math.abs(qs))>.0000000001){lat=this.phi1z(this.e3,qs);}else{if(qs>=0){lat=.5*PI;}else{lat=-.5*PI;}}}else{lat=this.phi1z(e3,qs);}
+lon=Proj4js.common.adjust_lon(theta/this.ns0+this.long0);p.x=lon;p.y=lat;return p;},phi1z:function(eccent,qs){var con,com,dphi;var phi=Proj4js.common.asinz(.5*qs);if(eccent<Proj4js.common.EPSLN)return phi;var eccnts=eccent*eccent;for(var i=1;i<=25;i++){sinphi=Math.sin(phi);cosphi=Math.cos(phi);con=eccent*sinphi;com=1.0-con*con;dphi=.5*com*com/cosphi*(qs/(1.0-eccnts)-sinphi/com+.5/eccent*Math.log((1.0-con)/(1.0+con)));phi=phi+dphi;if(Math.abs(dphi)<=1e-7)return phi;}
+Proj4js.reportError("aea:phi1z:Convergence error");return null;}};Proj4js.Proj.sterea={dependsOn:'gauss',init:function(){Proj4js.Proj['gauss'].init.apply(this);if(!this.rc){Proj4js.reportError("sterea:init:E_ERROR_0");return;}
+this.sinc0=Math.sin(this.phic0);this.cosc0=Math.cos(this.phic0);this.R2=2.0*this.rc;if(!this.title)this.title="Oblique Stereographic Alternative";},forward:function(p){p.x=Proj4js.common.adjust_lon(p.x-this.long0);Proj4js.Proj['gauss'].forward.apply(this,[p]);sinc=Math.sin(p.y);cosc=Math.cos(p.y);cosl=Math.cos(p.x);k=this.k0*this.R2/(1.0+this.sinc0*sinc+this.cosc0*cosc*cosl);p.x=k*cosc*Math.sin(p.x);p.y=k*(this.cosc0*sinc-this.sinc0*cosc*cosl);p.x=this.a*p.x+this.x0;p.y=this.a*p.y+this.y0;return p;},inverse:function(p){var lon,lat;p.x=(p.x-this.x0)/this.a;p.y=(p.y-this.y0)/this.a;p.x/=this.k0;p.y/=this.k0;if((rho=Math.sqrt(p.x*p.x+p.y*p.y))){c=2.0*Math.atan2(rho,this.R2);sinc=Math.sin(c);cosc=Math.cos(c);lat=Math.asin(cosc*this.sinc0+p.y*sinc*this.cosc0/rho);lon=Math.atan2(p.x*sinc,rho*this.cosc0*cosc-p.y*this.sinc0*sinc);}else{lat=this.phic0;lon=0.;}
+p.x=lon;p.y=lat;Proj4js.Proj['gauss'].inverse.apply(this,[p]);p.x=Proj4js.common.adjust_lon(p.x+this.long0);return p;}};function phi4z(eccent,e0,e1,e2,e3,a,b,c,phi){var sinphi,sin2ph,tanph,ml,mlp,con1,con2,con3,dphi,i;phi=a;for(i=1;i<=15;i++){sinphi=Math.sin(phi);tanphi=Math.tan(phi);c=tanphi*Math.sqrt(1.0-eccent*sinphi*sinphi);sin2ph=Math.sin(2.0*phi);ml=e0*phi-e1*sin2ph+e2*Math.sin(4.0*phi)-e3*Math.sin(6.0*phi);mlp=e0-2.0*e1*Math.cos(2.0*phi)+4.0*e2*Math.cos(4.0*phi)-6.0*e3*Math.cos(6.0*phi);con1=2.0*ml+c*(ml*ml+b)-2.0*a*(c*ml+1.0);con2=eccent*sin2ph*(ml*ml+b-2.0*a*ml)/(2.0*c);con3=2.0*(a-ml)*(c*mlp-2.0/sin2ph)-2.0*mlp;dphi=con1/(con2+con3);phi+=dphi;if(Math.abs(dphi)<=.0000000001)return(phi);}
+Proj4js.reportError("phi4z: No convergence");return null;}
+function e4fn(x){var con,com;con=1.0+x;com=1.0-x;return(Math.sqrt((Math.pow(con,con))*(Math.pow(com,com))));}
+Proj4js.Proj.poly={init:function(){var temp;if(this.lat0=0)this.lat0=90;this.temp=this.b/this.a;this.es=1.0-Math.pow(this.temp,2);this.e=Math.sqrt(this.es);this.e0=Proj4js.common.e0fn(this.es);this.e1=Proj4js.common.e1fn(this.es);this.e2=Proj4js.common.e2fn(this.es);this.e3=Proj4js.common.e3fn(this.es);this.ml0=Proj4js.common.mlfn(this.e0,this.e1,this.e2,this.e3,this.lat0);},forward:function(p){var sinphi,cosphi;var al;var c;var con,ml;var ms;var x,y;var lon=p.x;var lat=p.y;con=Proj4js.common.adjust_lon(lon-this.long0);if(Math.abs(lat)<=.0000001){x=this.x0+this.a*con;y=this.y0-this.a*this.ml0;}else{sinphi=Math.sin(lat);cosphi=Math.cos(lat);ml=Proj4js.common.mlfn(this.e0,this.e1,this.e2,this.e3,lat);ms=Proj4js.common.msfnz(this.e,sinphi,cosphi);con=sinphi;x=this.x0+this.a*ms*Math.sin(con)/sinphi;y=this.y0+this.a*(ml-this.ml0+ms*(1.0-Math.cos(con))/sinphi);}
+p.x=x;p.y=y;return p;},inverse:function(p){var sin_phi,cos_phi;var al;var b;var c;var con,ml;var iflg;var lon,lat;p.x-=this.x0;p.y-=this.y0;al=this.ml0+p.y/this.a;iflg=0;if(Math.abs(al)<=.0000001){lon=p.x/this.a+this.long0;lat=0.0;}else{b=al*al+(p.x/this.a)*(p.x/this.a);iflg=phi4z(this.es,this.e0,this.e1,this.e2,this.e3,this.al,b,c,lat);if(iflg!=1)return(iflg);lon=Proj4js.common.adjust_lon((asinz(p.x*c/this.a)/Math.sin(lat))+this.long0);}
+p.x=lon;p.y=lat;return p;}};Proj4js.Proj.equi={init:function(){if(!this.x0)this.x0=0;if(!this.y0)this.y0=0;if(!this.lat0)this.lat0=0;if(!this.long0)this.long0=0;},forward:function(p){var lon=p.x;var lat=p.y;var dlon=Proj4js.common.adjust_lon(lon-this.long0);var x=this.x0+this.a*dlon*Math.cos(this.lat0);var y=this.y0+this.a*lat;this.t1=x;this.t2=Math.cos(this.lat0);p.x=x;p.y=y;return p;},inverse:function(p){p.x-=this.x0;p.y-=this.y0;var lat=p.y/this.a;if(Math.abs(lat)>Proj4js.common.HALF_PI){Proj4js.reportError("equi:Inv:DataError");}
+var lon=Proj4js.common.adjust_lon(this.long0+p.x/(this.a*Math.cos(this.lat0)));p.x=lon;p.y=lat;}};Proj4js.Proj.merc={init:function(){if(this.lat_ts){if(this.sphere){this.k0=Math.cos(this.lat_ts);}else{this.k0=Proj4js.common.msfnz(this.es,Math.sin(this.lat_ts),Math.cos(this.lat_ts));}}},forward:function(p){var lon=p.x;var lat=p.y;if(lat*Proj4js.common.R2D>90.0&&lat*Proj4js.common.R2D<-90.0&&lon*Proj4js.common.R2D>180.0&&lon*Proj4js.common.R2D<-180.0){Proj4js.reportError("merc:forward: llInputOutOfRange: "+lon+" : "+lat);return null;}
+var x,y;if(Math.abs(Math.abs(lat)-Proj4js.common.HALF_PI)<=Proj4js.common.EPSLN){Proj4js.reportError("merc:forward: ll2mAtPoles");return null;}else{if(this.sphere){x=this.x0+this.a*this.k0*Proj4js.common.adjust_lon(lon-this.long0);y=this.y0+this.a*this.k0*Math.log(Math.tan(Proj4js.common.FORTPI+0.5*lat));}else{var sinphi=Math.sin(lat);var ts=Proj4js.common.tsfnz(this.e,lat,sinphi);x=this.x0+this.a*this.k0*Proj4js.common.adjust_lon(lon-this.long0);y=this.y0-this.a*this.k0*Math.log(ts);}
+p.x=x;p.y=y;return p;}},inverse:function(p){var x=p.x-this.x0;var y=p.y-this.y0;var lon,lat;if(this.sphere){lat=Proj4js.common.HALF_PI-2.0*Math.atan(Math.exp(-y/this.a*this.k0));}else{var ts=Math.exp(-y/(this.a*this.k0));lat=Proj4js.common.phi2z(this.e,ts);if(lat==-9999){Proj4js.reportError("merc:inverse: lat = -9999");return null;}}
+lon=Proj4js.common.adjust_lon(this.long0+x/(this.a*this.k0));p.x=lon;p.y=lat;return p;}};Proj4js.Proj.utm={dependsOn:'tmerc',init:function(){if(!this.zone){Proj4js.reportError("utm:init: zone must be specified for UTM");return;}
+this.lat0=0.0;this.long0=((6*Math.abs(this.zone))-183)*Proj4js.common.D2R;this.x0=500000.0;this.y0=this.utmSouth?10000000.0:0.0;this.k0=0.9996;Proj4js.Proj['tmerc'].init.apply(this);this.forward=Proj4js.Proj['tmerc'].forward;this.inverse=Proj4js.Proj['tmerc'].inverse;}};Proj4js.Proj.eqdc={init:function(){if(!this.mode)this.mode=0;this.temp=this.b/this.a;this.es=1.0-Math.pow(this.temp,2);this.e=Math.sqrt(this.es);this.e0=Proj4js.common.e0fn(this.es);this.e1=Proj4js.common.e1fn(this.es);this.e2=Proj4js.common.e2fn(this.es);this.e3=Proj4js.common.e3fn(this.es);this.sinphi=Math.sin(this.lat1);this.cosphi=Math.cos(this.lat1);this.ms1=Proj4js.common.msfnz(this.e,this.sinphi,this.cosphi);this.ml1=Proj4js.common.mlfn(this.e0,this.e1,this.e2,this.e3,this.lat1);if(this.mode!=0){if(Math.abs(this.lat1+this.lat2)<Proj4js.common.EPSLN){Proj4js.reportError("eqdc:Init:EqualLatitudes");}
+this.sinphi=Math.sin(this.lat2);this.cosphi=Math.cos(this.lat2);this.ms2=Proj4js.common.msfnz(this.e,this.sinphi,this.cosphi);this.ml2=Proj4js.common.mlfn(this.e0,this.e1,this.e2,this.e3,this.lat2);if(Math.abs(this.lat1-this.lat2)>=Proj4js.common.EPSLN){this.ns=(this.ms1-this.ms2)/(this.ml2-this.ml1);}else{this.ns=this.sinphi;}}else{this.ns=this.sinphi;}
+this.g=this.ml1+this.ms1/this.ns;this.ml0=Proj4js.common.mlfn(this.e0,this.e1,this.e2,this.e3,this.lat0);this.rh=this.a*(this.g-this.ml0);},forward:function(p){var lon=p.x;var lat=p.y;var ml=Proj4js.common.mlfn(this.e0,this.e1,this.e2,this.e3,lat);var rh1=this.a*(this.g-ml);var theta=this.ns*Proj4js.common.adjust_lon(lon-this.long0);var x=this.x0+rh1*Math.sin(theta);var y=this.y0+this.rh-rh1*Math.cos(theta);p.x=x;p.y=y;return p;},inverse:function(p){p.x-=this.x0;p.y=this.rh-p.y+this.y0;var con,rh1;if(this.ns>=0){var rh1=Math.sqrt(p.x*p.x+p.y*p.y);var con=1.0;}else{rh1=-Math.sqrt(p.x*p.x+p.y*p.y);con=-1.0;}
+var theta=0.0;if(rh1!=0.0)theta=Math.atan2(con*p.x,con*p.y);var ml=this.g-rh1/this.a;var lat=this.phi3z(this.ml,this.e0,this.e1,this.e2,this.e3);var lon=Proj4js.common.adjust_lon(this.long0+theta/this.ns);p.x=lon;p.y=lat;return p;},phi3z:function(ml,e0,e1,e2,e3){var phi;var dphi;phi=ml;for(var i=0;i<15;i++){dphi=(ml+e1*Math.sin(2.0*phi)-e2*Math.sin(4.0*phi)+e3*Math.sin(6.0*phi))/e0-phi;phi+=dphi;if(Math.abs(dphi)<=.0000000001){return phi;}}
+Proj4js.reportError("PHI3Z-CONV:Latitude failed to converge after 15 iterations");return null;}};Proj4js.Proj.tmerc={init:function(){this.e0=Proj4js.common.e0fn(this.es);this.e1=Proj4js.common.e1fn(this.es);this.e2=Proj4js.common.e2fn(this.es);this.e3=Proj4js.common.e3fn(this.es);this.ml0=this.a*Proj4js.common.mlfn(this.e0,this.e1,this.e2,this.e3,this.lat0);},forward:function(p){var lon=p.x;var lat=p.y;var delta_lon=Proj4js.common.adjust_lon(lon-this.long0);var con;var x,y;var sin_phi=Math.sin(lat);var cos_phi=Math.cos(lat);if(this.sphere){var b=cos_phi*Math.sin(delta_lon);if((Math.abs(Math.abs(b)-1.0))<.0000000001){Proj4js.reportError("tmerc:forward: Point projects into infinity");return(93);}else{x=.5*this.a*this.k0*Math.log((1.0+b)/(1.0-b));con=Math.acos(cos_phi*Math.cos(delta_lon)/Math.sqrt(1.0-b*b));if(lat<0)con=-con;y=this.a*this.k0*(con-this.lat0);}}else{var al=cos_phi*delta_lon;var als=Math.pow(al,2);var c=this.ep2*Math.pow(cos_phi,2);var tq=Math.tan(lat);var t=Math.pow(tq,2);con=1.0-this.es*Math.pow(sin_phi,2);var n=this.a/Math.sqrt(con);var ml=this.a*Proj4js.common.mlfn(this.e0,this.e1,this.e2,this.e3,lat);x=this.k0*n*al*(1.0+als/6.0*(1.0-t+c+als/20.0*(5.0-18.0*t+Math.pow(t,2)+72.0*c-58.0*this.ep2)))+this.x0;y=this.k0*(ml-this.ml0+n*tq*(als*(0.5+als/24.0*(5.0-t+9.0*c+4.0*Math.pow(c,2)+als/30.0*(61.0-58.0*t+Math.pow(t,2)+600.0*c-330.0*this.ep2)))))+this.y0;}
+p.x=x;p.y=y;return p;},inverse:function(p){var con,phi;var delta_phi;var i;var max_iter=6;var lat,lon;if(this.sphere){var f=Math.exp(p.x/(this.a*this.k0));var g=.5*(f-1/f);var temp=this.lat0+p.y/(this.a*this.k0);var h=Math.cos(temp);con=Math.sqrt((1.0-h*h)/(1.0+g*g));lat=Math.asinz(con);if(temp<0)
+lat=-lat;if((g==0)&&(h==0)){lon=this.long0;}else{lon=Proj4js.common.adjust_lon(Math.atan2(g,h)+this.long0);}}else{var x=p.x-this.x0;var y=p.y-this.y0;con=(this.ml0+y/this.k0)/this.a;phi=con;for(i=0;;i++){delta_phi=((con+this.e1*Math.sin(2.0*phi)-this.e2*Math.sin(4.0*phi)+this.e3*Math.sin(6.0*phi))/this.e0)-phi;phi+=delta_phi;if(Math.abs(delta_phi)<=Proj4js.common.EPSLN)break;if(i>=max_iter){Proj4js.reportError("tmerc:inverse: Latitude failed to converge");return(95);}}
+if(Math.abs(phi)<Proj4js.common.HALF_PI){var sin_phi=Math.sin(phi);var cos_phi=Math.cos(phi);var tan_phi=Math.tan(phi);var c=this.ep2*Math.pow(cos_phi,2);var cs=Math.pow(c,2);var t=Math.pow(tan_phi,2);var ts=Math.pow(t,2);con=1.0-this.es*Math.pow(sin_phi,2);var n=this.a/Math.sqrt(con);var r=n*(1.0-this.es)/con;var d=x/(n*this.k0);var ds=Math.pow(d,2);lat=phi-(n*tan_phi*ds/r)*(0.5-ds/24.0*(5.0+3.0*t+10.0*c-4.0*cs-9.0*this.ep2-ds/30.0*(61.0+90.0*t+298.0*c+45.0*ts-252.0*this.ep2-3.0*cs)));lon=Proj4js.common.adjust_lon(this.long0+(d*(1.0-ds/6.0*(1.0+2.0*t+c-ds/20.0*(5.0-2.0*c+28.0*t-3.0*cs+8.0*this.ep2+24.0*ts)))/cos_phi));}else{lat=Proj4js.common.HALF_PI*Proj4js.common.sign(y);lon=this.long0;}}
+p.x=lon;p.y=lat;return p;}};Proj4js.defs["GOOGLE"]="+proj=merc +a=6378137 +b=6378137 +lat_ts=0.0 +lon_0=0.0 +x_0=0.0 +y_0=0 +k=1.0 +units=m +nadgrids=@null +no_defs";Proj4js.defs["EPSG:900913"]=Proj4js.defs["GOOGLE"];Proj4js.Proj.gstmerc={init:function(){var temp=this.b/this.a;this.e=Math.sqrt(1.0-temp*temp);this.lc=this.long0;this.rs=Math.sqrt(1.0+this.e*this.e*Math.pow(Math.cos(this.lat0),4.0)/(1.0-this.e*this.e));var sinz=Math.sin(this.lat0);var pc=Math.asin(sinz/this.rs);var sinzpc=Math.sin(pc);this.cp=Proj4js.common.latiso(0.0,pc,sinzpc)-this.rs*Proj4js.common.latiso(this.e,this.lat0,sinz);this.n2=this.k0*this.a*Math.sqrt(1.0-this.e*this.e)/(1.0-this.e*this.e*sinz*sinz);this.xs=this.x0;this.ys=this.y0-this.n2*pc;if(!this.title)this.title="Gauss Schreiber transverse mercator";},forward:function(p){var lon=p.x;var lat=p.y;var L=this.rs*(lon-this.lc);var Ls=this.cp+(this.rs*Proj4js.common.latiso(this.e,lat,Math.sin(lat)));var lat1=Math.asin(Math.sin(L)/Proj4js.common.cosh(Ls));var Ls1=Proj4js.common.latiso(0.0,lat1,Math.sin(lat1));p.x=this.xs+(this.n2*Ls1);p.y=this.ys+(this.n2*Math.atan(Proj4js.common.sinh(Ls)/Math.cos(L)));return p;},inverse:function(p){var x=p.x;var y=p.y;var L=Math.atan(Proj4js.common.sinh((x-this.xs)/this.n2)/Math.cos((y-this.ys)/this.n2));var lat1=Math.asin(Math.sin((y-this.ys)/this.n2)/Proj4js.common.cosh((x-this.xs)/this.n2));var LC=Proj4js.common.latiso(0.0,lat1,Math.sin(lat1));p.x=this.lc+L/this.rs;p.y=Proj4js.common.invlatiso(this.e,(LC-this.cp)/this.rs);return p;}};Proj4js.Proj.ortho={init:function(def){;this.sin_p14=Math.sin(this.lat0);this.cos_p14=Math.cos(this.lat0);},forward:function(p){var sinphi,cosphi;var dlon;var coslon;var ksp;var g;var lon=p.x;var lat=p.y;dlon=Proj4js.common.adjust_lon(lon-this.long0);sinphi=Math.sin(lat);cosphi=Math.cos(lat);coslon=Math.cos(dlon);g=this.sin_p14*sinphi+this.cos_p14*cosphi*coslon;ksp=1.0;if((g>0)||(Math.abs(g)<=Proj4js.common.EPSLN)){var x=this.a*ksp*cosphi*Math.sin(dlon);var y=this.y0+this.a*ksp*(this.cos_p14*sinphi-this.sin_p14*cosphi*coslon);}else{Proj4js.reportError("orthoFwdPointError");}
+p.x=x;p.y=y;return p;},inverse:function(p){var rh;var z;var sinz,cosz;var temp;var con;var lon,lat;p.x-=this.x0;p.y-=this.y0;rh=Math.sqrt(p.x*p.x+p.y*p.y);if(rh>this.a+.0000001){Proj4js.reportError("orthoInvDataError");}
+z=Proj4js.common.asinz(rh/this.a);sinz=Math.sin(z);cosi=Math.cos(z);lon=this.long0;if(Math.abs(rh)<=Proj4js.common.EPSLN){lat=this.lat0;}
+lat=Proj4js.common.asinz(cosz*this.sin_p14+(y*sinz*this.cos_p14)/rh);con=Math.abs(lat0)-Proj4js.common.HALF_PI;if(Math.abs(con)<=Proj4js.common.EPSLN){if(this.lat0>=0){lon=Proj4js.common.adjust_lon(this.long0+Math.atan2(p.x,-p.y));}else{lon=Proj4js.common.adjust_lon(this.long0-Math.atan2(-p.x,p.y));}}
+con=cosz-this.sin_p14*Math.sin(lat);if((Math.abs(con)>=Proj4js.common.EPSLN)||(Math.abs(x)>=Proj4js.common.EPSLN)){lon=Proj4js.common.adjust_lon(this.long0+Math.atan2((p.x*sinz*this.cos_p14),(con*rh)));}
+p.x=lon;p.y=lat;return p;}};Proj4js.Proj.somerc={init:function(){var phy0=this.lat0;this.lambda0=this.long0;var sinPhy0=Math.sin(phy0);var semiMajorAxis=this.a;var invF=this.rf;var flattening=1/invF;var e2=2*flattening-Math.pow(flattening,2);var e=this.e=Math.sqrt(e2);this.R=semiMajorAxis*Math.sqrt(1-e2)/(1-e2*Math.pow(sinPhy0,2.0));this.alpha=Math.sqrt(1+e2/(1-e2)*Math.pow(Math.cos(phy0),4.0));this.b0=Math.asin(sinPhy0/this.alpha);this.K=Math.log(Math.tan(Math.PI/4.0+this.b0/2.0))
+-this.alpha*Math.log(Math.tan(Math.PI/4.0+phy0/2.0))
++this.alpha*e/2*Math.log((1+e*sinPhy0)/(1-e*sinPhy0));},forward:function(p){var Sa1=Math.log(Math.tan(Math.PI/4.0-p.y/2.0));var Sa2=this.e/2.0*Math.log((1+this.e*Math.sin(p.y))/(1-this.e*Math.sin(p.y)));var S=-this.alpha*(Sa1+Sa2)+this.K;var b=2.0*(Math.atan(Math.exp(S))-Math.PI/4.0);var I=this.alpha*(p.x-this.lambda0);var rotI=Math.atan(Math.sin(I)/(Math.sin(this.b0)*Math.tan(b)+
+Math.cos(this.b0)*Math.cos(I)));var rotB=Math.asin(Math.cos(this.b0)*Math.sin(b)-
+Math.sin(this.b0)*Math.cos(b)*Math.cos(I));p.y=this.R/2.0*Math.log((1+Math.sin(rotB))/(1-Math.sin(rotB)))
++this.y0;p.x=this.R*rotI+this.x0;return p;},inverse:function(p){var Y=p.x-this.x0;var X=p.y-this.y0;var rotI=Y/this.R;var rotB=2*(Math.atan(Math.exp(X/this.R))-Math.PI/4.0);var b=Math.asin(Math.cos(this.b0)*Math.sin(rotB)
++Math.sin(this.b0)*Math.cos(rotB)*Math.cos(rotI));var I=Math.atan(Math.sin(rotI)/(Math.cos(this.b0)*Math.cos(rotI)-Math.sin(this.b0)*Math.tan(rotB)));var lambda=this.lambda0+I/this.alpha;var S=0.0;var phy=b;var prevPhy=-1000.0;var iteration=0;while(Math.abs(phy-prevPhy)>0.0000001)
+{if(++iteration>20)
+{Proj4js.reportError("omercFwdInfinity");return;}
+S=1.0/this.alpha*(Math.log(Math.tan(Math.PI/4.0+b/2.0))-this.K)
++this.e*Math.log(Math.tan(Math.PI/4.0
++Math.asin(this.e*Math.sin(phy))/2.0));prevPhy=phy;phy=2.0*Math.atan(Math.exp(S))-Math.PI/2.0;}
+p.x=lambda;p.y=phy;return p;}};Proj4js.Proj.stere={ssfn_:function(phit,sinphi,eccen){sinphi*=eccen;return(Math.tan(.5*(Proj4js.common.HALF_PI+phit))*Math.pow((1.-sinphi)/(1.+sinphi),.5*eccen));},TOL:1.e-8,NITER:8,CONV:1.e-10,S_POLE:0,N_POLE:1,OBLIQ:2,EQUIT:3,init:function(){this.phits=this.lat_ts?this.lat_ts:Proj4js.common.HALF_PI;var t=Math.abs(this.lat0);if((Math.abs(t)-Proj4js.common.HALF_PI)<Proj4js.common.EPSLN){this.mode=this.lat0<0.?this.S_POLE:this.N_POLE;}else{this.mode=t>Proj4js.common.EPSLN?this.OBLIQ:this.EQUIT;}
+this.phits=Math.abs(this.phits);if(this.es){var X;switch(this.mode){case this.N_POLE:case this.S_POLE:if(Math.abs(this.phits-Proj4js.common.HALF_PI)<Proj4js.common.EPSLN){this.akm1=2.*this.k0/Math.sqrt(Math.pow(1+this.e,1+this.e)*Math.pow(1-this.e,1-this.e));}else{t=Math.sin(this.phits);this.akm1=Math.cos(this.phits)/Proj4js.common.tsfnz(this.e,this.phits,t);t*=this.e;this.akm1/=Math.sqrt(1.-t*t);}
+break;case this.EQUIT:this.akm1=2.*this.k0;break;case this.OBLIQ:t=Math.sin(this.lat0);X=2.*Math.atan(this.ssfn_(this.lat0,t,this.e))-Proj4js.common.HALF_PI;t*=this.e;this.akm1=2.*this.k0*Math.cos(this.lat0)/Math.sqrt(1.-t*t);this.sinX1=Math.sin(X);this.cosX1=Math.cos(X);break;}}else{switch(this.mode){case this.OBLIQ:this.sinph0=Math.sin(this.lat0);this.cosph0=Math.cos(this.lat0);case this.EQUIT:this.akm1=2.*this.k0;break;case this.S_POLE:case this.N_POLE:this.akm1=Math.abs(this.phits-Proj4js.common.HALF_PI)>=Proj4js.common.EPSLN?Math.cos(this.phits)/Math.tan(Proj4js.common.FORTPI-.5*this.phits):2.*this.k0;break;}}},forward:function(p){var lon=p.x;var lat=p.y;var x,y
+if(this.sphere){var sinphi,cosphi,coslam,sinlam;sinphi=Math.sin(lat);cosphi=Math.cos(lat);coslam=Math.cos(lon);sinlam=Math.sin(lon);switch(this.mode){case this.EQUIT:y=1.+cosphi*coslam;if(y<=Proj4js.common.EPSLN){F_ERROR;}
+y=this.akm1/y;x=y*cosphi*sinlam;y*=sinphi;break;case this.OBLIQ:y=1.+this.sinph0*sinphi+this.cosph0*cosphi*coslam;if(y<=Proj4js.common.EPSLN){F_ERROR;}
+y=this.akm1/y;x=y*cosphi*sinlam;y*=this.cosph0*sinphi-this.sinph0*cosphi*coslam;break;case this.N_POLE:coslam=-coslam;lat=-lat;case this.S_POLE:if(Math.abs(lat-Proj4js.common.HALF_PI)<this.TOL){F_ERROR;}
+y=this.akm1*Math.tan(Proj4js.common.FORTPI+.5*lat)
+x=sinlam*y;y*=coslam;break;}}else{coslam=Math.cos(lon);sinlam=Math.sin(lon);sinphi=Math.sin(lat);if(this.mode==this.OBLIQ||this.mode==this.EQUIT){X=2.*Math.atan(this.ssfn_(lat,sinphi,this.e));sinX=Math.sin(X-Proj4js.common.HALF_PI);cosX=Math.cos(X);}
+switch(this.mode){case this.OBLIQ:A=this.akm1/(this.cosX1*(1.+this.sinX1*sinX+this.cosX1*cosX*coslam));y=A*(this.cosX1*sinX-this.sinX1*cosX*coslam);x=A*cosX;break;case this.EQUIT:A=2.*this.akm1/(1.+cosX*coslam);y=A*sinX;x=A*cosX;break;case this.S_POLE:lat=-lat;coslam=-coslam;sinphi=-sinphi;case this.N_POLE:x=this.akm1*Proj4js.common.tsfnz(this.e,lat,sinphi);y=-x*coslam;break;}
+x=x*sinlam;}
+p.x=x*this.a+this.x0;p.y=y*this.a+this.y0;return p;},inverse:function(p){var x=(p.x-this.x0)/this.a;var y=(p.y-this.y0)/this.a;var lon,lat
+var cosphi,sinphi,tp=0.0,phi_l=0.0,rho,halfe=0.0,pi2=0.0;var i;if(this.sphere){var c,rh,sinc,cosc;rh=Math.sqrt(x*x+y*y);c=2.*Math.atan(rh/this.akm1);sinc=Math.sin(c);cosc=Math.cos(c);lon=0.;switch(this.mode){case this.EQUIT:if(Math.abs(rh)<=Proj4js.common.EPSLN){lat=0.;}else{lat=Math.asin(y*sinc/rh);}
+if(cosc!=0.||x!=0.)lon=Math.atan2(x*sinc,cosc*rh);break;case this.OBLIQ:if(Math.abs(rh)<=Proj4js.common.EPSLN){lat=this.phi0;}else{lat=Math.asin(cosc*sinph0+y*sinc*cosph0/rh);}
+c=cosc-sinph0*Math.sin(lat);if(c!=0.||x!=0.){lon=Math.atan2(x*sinc*cosph0,c*rh);}
+break;case this.N_POLE:y=-y;case this.S_POLE:if(Math.abs(rh)<=Proj4js.common.EPSLN){lat=this.phi0;}else{lat=Math.asin(this.mode==this.S_POLE?-cosc:cosc);}
+lon=(x==0.&&y==0.)?0.:Math.atan2(x,y);break;}}else{rho=Math.sqrt(x*x+y*y);switch(this.mode){case this.OBLIQ:case this.EQUIT:tp=2.*Math.atan2(rho*this.cosX1,this.akm1);cosphi=Math.cos(tp);sinphi=Math.sin(tp);if(rho==0.0){phi_l=Math.asin(cosphi*this.sinX1);}else{phi_l=Math.asin(cosphi*this.sinX1+(y*sinphi*this.cosX1/rho));}
+tp=Math.tan(.5*(Proj4js.common.HALF_PI+phi_l));x*=sinphi;y=rho*this.cosX1*cosphi-y*this.sinX1*sinphi;pi2=Proj4js.common.HALF_PI;halfe=.5*this.e;break;case this.N_POLE:y=-y;case this.S_POLE:tp=-rho/this.akm1
+phi_l=Proj4js.common.HALF_PI-2.*Math.atan(tp);pi2=-Proj4js.common.HALF_PI;halfe=-.5*this.e;break;}
+for(i=this.NITER;i--;phi_l=lat){sinphi=this.e*Math.sin(phi_l);lat=2.*Math.atan(tp*Math.pow((1.+sinphi)/(1.-sinphi),halfe))-pi2;if(Math.abs(phi_l-lat)<this.CONV){if(this.mode==this.S_POLE)lat=-lat;lon=(x==0.&&y==0.)?0.:Math.atan2(x,y);p.x=lon;p.y=lat
+return p;}}}}};Proj4js.Proj.nzmg={iterations:1,init:function(){this.A=new Array();this.A[1]=+0.6399175073;this.A[2]=-0.1358797613;this.A[3]=+0.063294409;this.A[4]=-0.02526853;this.A[5]=+0.0117879;this.A[6]=-0.0055161;this.A[7]=+0.0026906;this.A[8]=-0.001333;this.A[9]=+0.00067;this.A[10]=-0.00034;this.B_re=new Array();this.B_im=new Array();this.B_re[1]=+0.7557853228;this.B_im[1]=0.0;this.B_re[2]=+0.249204646;this.B_im[2]=+0.003371507;this.B_re[3]=-0.001541739;this.B_im[3]=+0.041058560;this.B_re[4]=-0.10162907;this.B_im[4]=+0.01727609;this.B_re[5]=-0.26623489;this.B_im[5]=-0.36249218;this.B_re[6]=-0.6870983;this.B_im[6]=-1.1651967;this.C_re=new Array();this.C_im=new Array();this.C_re[1]=+1.3231270439;this.C_im[1]=0.0;this.C_re[2]=-0.577245789;this.C_im[2]=-0.007809598;this.C_re[3]=+0.508307513;this.C_im[3]=-0.112208952;this.C_re[4]=-0.15094762;this.C_im[4]=+0.18200602;this.C_re[5]=+1.01418179;this.C_im[5]=+1.64497696;this.C_re[6]=+1.9660549;this.C_im[6]=+2.5127645;this.D=new Array();this.D[1]=+1.5627014243;this.D[2]=+0.5185406398;this.D[3]=-0.03333098;this.D[4]=-0.1052906;this.D[5]=-0.0368594;this.D[6]=+0.007317;this.D[7]=+0.01220;this.D[8]=+0.00394;this.D[9]=-0.0013;},forward:function(p){var lon=p.x;var lat=p.y;var delta_lat=lat-this.lat0;var delta_lon=lon-this.long0;var d_phi=delta_lat/Proj4js.common.SEC_TO_RAD*1E-5;var d_lambda=delta_lon;var d_phi_n=1;var d_psi=0;for(n=1;n<=10;n++){d_phi_n=d_phi_n*d_phi;d_psi=d_psi+this.A[n]*d_phi_n;}
+var th_re=d_psi;var th_im=d_lambda;var th_n_re=1;var th_n_im=0;var th_n_re1;var th_n_im1;var z_re=0;var z_im=0;for(n=1;n<=6;n++){th_n_re1=th_n_re*th_re-th_n_im*th_im;th_n_im1=th_n_im*th_re+th_n_re*th_im;th_n_re=th_n_re1;th_n_im=th_n_im1;z_re=z_re+this.B_re[n]*th_n_re-this.B_im[n]*th_n_im;z_im=z_im+this.B_im[n]*th_n_re+this.B_re[n]*th_n_im;}
+x=(z_im*this.a)+this.x0;y=(z_re*this.a)+this.y0;p.x=x;p.y=y;return p;},inverse:function(p){var x=p.x;var y=p.y;var delta_x=x-this.x0;var delta_y=y-this.y0;var z_re=delta_y/this.a;var z_im=delta_x/this.a;var z_n_re=1;var z_n_im=0;var z_n_re1;var z_n_im1;var th_re=0;var th_im=0;for(n=1;n<=6;n++){z_n_re1=z_n_re*z_re-z_n_im*z_im;z_n_im1=z_n_im*z_re+z_n_re*z_im;z_n_re=z_n_re1;z_n_im=z_n_im1;th_re=th_re+this.C_re[n]*z_n_re-this.C_im[n]*z_n_im;th_im=th_im+this.C_im[n]*z_n_re+this.C_re[n]*z_n_im;}
+for(i=0;i<this.iterations;i++){var th_n_re=th_re;var th_n_im=th_im;var th_n_re1;var th_n_im1;var num_re=z_re;var num_im=z_im;for(n=2;n<=6;n++){th_n_re1=th_n_re*th_re-th_n_im*th_im;th_n_im1=th_n_im*th_re+th_n_re*th_im;th_n_re=th_n_re1;th_n_im=th_n_im1;num_re=num_re+(n-1)*(this.B_re[n]*th_n_re-this.B_im[n]*th_n_im);num_im=num_im+(n-1)*(this.B_im[n]*th_n_re+this.B_re[n]*th_n_im);}
+th_n_re=1;th_n_im=0;var den_re=this.B_re[1];var den_im=this.B_im[1];for(n=2;n<=6;n++){th_n_re1=th_n_re*th_re-th_n_im*th_im;th_n_im1=th_n_im*th_re+th_n_re*th_im;th_n_re=th_n_re1;th_n_im=th_n_im1;den_re=den_re+n*(this.B_re[n]*th_n_re-this.B_im[n]*th_n_im);den_im=den_im+n*(this.B_im[n]*th_n_re+this.B_re[n]*th_n_im);}
+var den2=den_re*den_re+den_im*den_im;th_re=(num_re*den_re+num_im*den_im)/den2;th_im=(num_im*den_re-num_re*den_im)/den2;}
+var d_psi=th_re;var d_lambda=th_im;var d_psi_n=1;var d_phi=0;for(n=1;n<=9;n++){d_psi_n=d_psi_n*d_psi;d_phi=d_phi+this.D[n]*d_psi_n;}
+var lat=this.lat0+(d_phi*Proj4js.common.SEC_TO_RAD*1E5);var lon=this.long0+d_lambda;p.x=lon;p.y=lat;return p;}};Proj4js.Proj.mill={init:function(){},forward:function(p){var lon=p.x;var lat=p.y;dlon=Proj4js.common.adjust_lon(lon-this.long0);var x=this.x0+this.a*dlon;var y=this.y0+this.a*Math.log(Math.tan((Proj4js.common.PI/4.0)+(lat/2.5)))*1.25;p.x=x;p.y=y;return p;},inverse:function(p){p.x-=this.x0;p.y-=this.y0;var lon=Proj4js.common.adjust_lon(this.long0+p.x/this.a);var lat=2.5*(Math.atan(Math.exp(0.8*p.y/this.a))-Proj4js.common.PI/4.0);p.x=lon;p.y=lat;return p;}};Proj4js.Proj.sinu={init:function(){this.R=6370997.0;},forward:function(p){var x,y,delta_lon;var lon=p.x;var lat=p.y;delta_lon=Proj4js.common.adjust_lon(lon-this.long0);x=this.R*delta_lon*Math.cos(lat)+this.x0;y=this.R*lat+this.y0;p.x=x;p.y=y;return p;},inverse:function(p){var lat,temp,lon;p.x-=this.x0;p.y-=this.y0;lat=p.y/this.R;if(Math.abs(lat)>Proj4js.common.HALF_PI){Proj4js.reportError("sinu:Inv:DataError");}
+temp=Math.abs(lat)-Proj4js.common.HALF_PI;if(Math.abs(temp)>Proj4js.common.EPSLN){temp=this.long0+p.x/(this.R*Math.cos(lat));lon=Proj4js.common.adjust_lon(temp);}else{lon=this.long0;}
+p.x=lon;p.y=lat;return p;}};var GEOCENT_LAT_ERROR=0x0001;var COS_67P5=0.38268343236508977;var AD_C=1.0026000;function cs_geodetic_to_geocentric(cs,p){var Longitude=p.x;var Latitude=p.y;var Height=p.z;var X;var Y;var Z;var Error_Code=0;var Rn;var Sin_Lat;var Sin2_Lat;var Cos_Lat;if(Latitude<-HALF_PI&&Latitude>-1.001*HALF_PI)
+Latitude=-HALF_PI;else if(Latitude>HALF_PI&&Latitude<1.001*HALF_PI)
+Latitude=HALF_PI;else if((Latitude<-HALF_PI)||(Latitude>HALF_PI))
+{Error_Code|=GEOCENT_LAT_ERROR;}
+if(!Error_Code)
+{if(Longitude>PI)
+Longitude-=(2*PI);Sin_Lat=Math.sin(Latitude);Cos_Lat=Math.cos(Latitude);Sin2_Lat=Sin_Lat*Sin_Lat;Rn=cs.a/(Math.sqrt(1.0e0-cs.es*Sin2_Lat));X=(Rn+Height)*Cos_Lat*Math.cos(Longitude);Y=(Rn+Height)*Cos_Lat*Math.sin(Longitude);Z=((Rn*(1-cs.es))+Height)*Sin_Lat;}
+p.x=X;p.y=Y;p.z=Z;return Error_Code;}
+function cs_geocentric_to_geodetic(cs,p){var X=p.x;var Y=p.y;var Z=p.z;var Longitude;var Latitude;var Height;var W;var W2;var T0;var T1;var S0;var S1;var Sin_B0;var Sin3_B0;var Cos_B0;var Sin_p1;var Cos_p1;var Rn;var Sum;var At_Pole;X=parseFloat(X);Y=parseFloat(Y);Z=parseFloat(Z);At_Pole=false;if(X!=0.0)
+{Longitude=Math.atan2(Y,X);}
+else
+{if(Y>0)
+{Longitude=HALF_PI;}
+else if(Y<0)
+{Longitude=-HALF_PI;}
+else
+{At_Pole=true;Longitude=0.0;if(Z>0.0)
+{Latitude=HALF_PI;}
+else if(Z<0.0)
+{Latitude=-HALF_PI;}
+else
+{Latitude=HALF_PI;Height=-cs.b;return;}}}
+W2=X*X+Y*Y;W=Math.sqrt(W2);T0=Z*AD_C;S0=Math.sqrt(T0*T0+W2);Sin_B0=T0/S0;Cos_B0=W/S0;Sin3_B0=Sin_B0*Sin_B0*Sin_B0;T1=Z+cs.b*cs.ep2*Sin3_B0;Sum=W-cs.a*cs.es*Cos_B0*Cos_B0*Cos_B0;S1=Math.sqrt(T1*T1+Sum*Sum);Sin_p1=T1/S1;Cos_p1=Sum/S1;Rn=cs.a/Math.sqrt(1.0-cs.es*Sin_p1*Sin_p1);if(Cos_p1>=COS_67P5)
+{Height=W/Cos_p1-Rn;}
+else if(Cos_p1<=-COS_67P5)
+{Height=W/-Cos_p1-Rn;}
+else
+{Height=Z/Sin_p1+Rn*(cs.es-1.0);}
+if(At_Pole==false)
+{Latitude=Math.atan(Sin_p1/Cos_p1);}
+p.x=Longitude;p.y=Latitude;p.z=Height;return 0;}
+function cs_geocentric_to_wgs84(defn,p){if(defn.datum_type==PJD_3PARAM)
+{p.x+=defn.datum_params[0];p.y+=defn.datum_params[1];p.z+=defn.datum_params[2];}
+else
+{var Dx_BF=defn.datum_params[0];var Dy_BF=defn.datum_params[1];var Dz_BF=defn.datum_params[2];var Rx_BF=defn.datum_params[3];var Ry_BF=defn.datum_params[4];var Rz_BF=defn.datum_params[5];var M_BF=defn.datum_params[6];var x_out=M_BF*(p.x-Rz_BF*p.y+Ry_BF*p.z)+Dx_BF;var y_out=M_BF*(Rz_BF*p.x+p.y-Rx_BF*p.z)+Dy_BF;var z_out=M_BF*(-Ry_BF*p.x+Rx_BF*p.y+p.z)+Dz_BF;p.x=x_out;p.y=y_out;p.z=z_out;}}
+function cs_geocentric_from_wgs84(defn,p){if(defn.datum_type==PJD_3PARAM)
+{p.x-=defn.datum_params[0];p.y-=defn.datum_params[1];p.z-=defn.datum_params[2];}
+else
+{var Dx_BF=defn.datum_params[0];var Dy_BF=defn.datum_params[1];var Dz_BF=defn.datum_params[2];var Rx_BF=defn.datum_params[3];var Ry_BF=defn.datum_params[4];var Rz_BF=defn.datum_params[5];var M_BF=defn.datum_params[6];var x_tmp=(p.x-Dx_BF)/M_BF;var y_tmp=(p.y-Dy_BF)/M_BF;var z_tmp=(p.z-Dz_BF)/M_BF;p.x=x_tmp+Rz_BF*y_tmp-Ry_BF*z_tmp;p.y=-Rz_BF*x_tmp+y_tmp+Rx_BF*z_tmp;p.z=Ry_BF*x_tmp-Rx_BF*y_tmp+z_tmp;}}
+Proj4js.Proj.vandg={init:function(){this.R=6370997.0;},forward:function(p){var lon=p.x;var lat=p.y;var dlon=Proj4js.common.adjust_lon(lon-this.long0);var x,y;if(Math.abs(lat)<=Proj4js.common.EPSLN){x=this.x0+this.R*dlon;y=this.y0;}
+var theta=Proj4js.common.asinz(2.0*Math.abs(lat/Proj4js.common.PI));if((Math.abs(dlon)<=Proj4js.common.EPSLN)||(Math.abs(Math.abs(lat)-Proj4js.common.HALF_PI)<=Proj4js.common.EPSLN)){x=this.x0;if(lat>=0){y=this.y0+Proj4js.common.PI*this.R*Math.tan(.5*theta);}else{y=this.y0+Proj4js.common.PI*this.R*-Math.tan(.5*theta);}}
+var al=.5*Math.abs((Proj4js.common.PI/dlon)-(dlon/Proj4js.common.PI));var asq=al*al;var sinth=Math.sin(theta);var costh=Math.cos(theta);var g=costh/(sinth+costh-1.0);var gsq=g*g;var m=g*(2.0/sinth-1.0);var msq=m*m;var con=Proj4js.common.PI*this.R*(al*(g-msq)+Math.sqrt(asq*(g-msq)*(g-msq)-(msq+asq)*(gsq-msq)))/(msq+asq);if(dlon<0){con=-con;}
+x=this.x0+con;con=Math.abs(con/(Proj4js.common.PI*this.R));if(lat>=0){y=this.y0+Proj4js.common.PI*this.R*Math.sqrt(1.0-con*con-2.0*al*con);}else{y=this.y0-Proj4js.common.PI*this.R*Math.sqrt(1.0-con*con-2.0*al*con);}
+p.x=x;p.y=y;return p;},inverse:function(p){var dlon;var xx,yy,xys,c1,c2,c3;var al,asq;var a1;var m1;var con;var th1;var d;p.x-=this.x0;p.y-=this.y0;con=Proj4js.common.PI*this.R;xx=p.x/con;yy=p.y/con;xys=xx*xx+yy*yy;c1=-Math.abs(yy)*(1.0+xys);c2=c1-2.0*yy*yy+xx*xx;c3=-2.0*c1+1.0+2.0*yy*yy+xys*xys;d=yy*yy/c3+(2.0*c2*c2*c2/c3/c3/c3-9.0*c1*c2/c3/c3)/27.0;a1=(c1-c2*c2/3.0/c3)/c3;m1=2.0*Math.sqrt(-a1/3.0);con=((3.0*d)/a1)/m1;if(Math.abs(con)>1.0){if(con>=0.0){con=1.0;}else{con=-1.0;}}
+th1=Math.acos(con)/3.0;if(p.y>=0){lat=(-m1*Math.cos(th1+Proj4js.common.PI/3.0)-c2/3.0/c3)*Proj4js.common.PI;}else{lat=-(-m1*Math.cos(th1+PI/3.0)-c2/3.0/c3)*Proj4js.common.PI;}
+if(Math.abs(xx)<Proj4js.common.EPSLN){lon=this.long0;}
+lon=Proj4js.common.adjust_lon(this.long0+Proj4js.common.PI*(xys-1.0+Math.sqrt(1.0+2.0*(xx*xx-yy*yy)+xys*xys))/2.0/xx);p.x=lon;p.y=lat;return p;}};Proj4js.Proj.eqc={init:function(){if(!this.x0)this.x0=0;if(!this.y0)this.y0=0;if(!this.lat0)this.lat0=0;if(!this.long0)this.long0=0;if(!this.lat_ts)this.lat_ts=0;if(!this.title)this.title="Equidistant Cylindrical (Plate Carre)";this.rc=Math.cos(this.lat_ts);},forward:function(p){var lon=p.x;var lat=p.y;var dlon=Proj4js.common.adjust_lon(lon-this.long0);var dlat=Proj4js.common.adjust_lat(lat-this.lat0);p.x=this.x0+(this.a*dlon*this.rc);p.y=this.y0+(this.a*dlat);return p;},inverse:function(p){var x=p.x;var y=p.y;p.x=Proj4js.common.adjust_lon(this.long0+((x-this.x0)/(this.a*this.rc)));p.y=Proj4js.common.adjust_lat(this.lat0+((y-this.y0)/(this.a)));return p;}};Proj4js.Proj.gauss={init:function(){sphi=Math.sin(this.lat0);cphi=Math.cos(this.lat0);cphi*=cphi;this.rc=Math.sqrt(1.0-this.es)/(1.0-this.es*sphi*sphi);this.C=Math.sqrt(1.0+this.es*cphi*cphi/(1.0-this.es));this.phic0=Math.asin(sphi/this.C);this.ratexp=0.5*this.C*this.e;this.K=Math.tan(0.5*this.phic0+Proj4js.common.FORTPI)/(Math.pow(Math.tan(0.5*this.lat0+Proj4js.common.FORTPI),this.C)*Proj4js.common.srat(this.e*sphi,this.ratexp));},forward:function(p){var lon=p.x;var lat=p.y;p.y=2.0*Math.atan(this.K*Math.pow(Math.tan(0.5*lat+Proj4js.common.FORTPI),this.C)*Proj4js.common.srat(this.e*Math.sin(lat),this.ratexp))-Proj4js.common.HALF_PI;p.x=this.C*lon;return p;},inverse:function(p){var DEL_TOL=1e-14;var lon=p.x/this.C;var lat=p.y;num=Math.pow(Math.tan(0.5*lat+Proj4js.common.FORTPI)/this.K,1./this.C);for(var i=Proj4js.common.MAX_ITER;i>0;--i){lat=2.0*Math.atan(num*Proj4js.common.srat(this.e*Math.sin(p.y),-0.5*this.e))-Proj4js.common.HALF_PI;if(Math.abs(lat-p.y)<DEL_TOL)break;p.y=lat;}
+if(!i){Proj4js.reportError("gauss:inverse:convergence failed");return null;}
+p.x=lon;p.y=lat;return p;}};Proj4js.Proj.omerc={init:function(){if(!this.mode)this.mode=0;if(!this.lon1){this.lon1=0;this.mode=1;}
+if(!this.lon2)this.lon2=0;if(!this.lat2)this.lat2=0;var temp=this.b/this.a;var es=1.0-Math.pow(temp,2);var e=Math.sqrt(es);this.sin_p20=Math.sin(this.lat0);this.cos_p20=Math.cos(this.lat0);this.con=1.0-this.es*this.sin_p20*this.sin_p20;this.com=Math.sqrt(1.0-es);this.bl=Math.sqrt(1.0+this.es*Math.pow(this.cos_p20,4.0)/(1.0-es));this.al=this.a*this.bl*this.k0*this.com/this.con;if(Math.abs(this.lat0)<Proj4js.common.EPSLN){this.ts=1.0;this.d=1.0;this.el=1.0;}else{this.ts=Proj4js.common.tsfnz(this.e,this.lat0,this.sin_p20);this.con=Math.sqrt(this.con);this.d=this.bl*this.com/(this.cos_p20*this.con);if((this.d*this.d-1.0)>0.0){if(this.lat0>=0.0){this.f=this.d+Math.sqrt(this.d*this.d-1.0);}else{this.f=this.d-Math.sqrt(this.d*this.d-1.0);}}else{this.f=this.d;}
+this.el=this.f*Math.pow(this.ts,this.bl);}
+if(this.mode!=0){this.g=.5*(this.f-1.0/this.f);this.gama=Proj4js.common.asinz(Math.sin(this.alpha)/this.d);this.longc=this.longc-Proj4js.common.asinz(this.g*Math.tan(this.gama))/this.bl;this.con=Math.abs(this.lat0);if((this.con>Proj4js.common.EPSLN)&&(Math.abs(this.con-Proj4js.common.HALF_PI)>Proj4js.common.EPSLN)){this.singam=Math.sin(this.gama);this.cosgam=Math.cos(this.gama);this.sinaz=Math.sin(this.alpha);this.cosaz=Math.cos(this.alpha);if(this.lat0>=0){this.u=(this.al/this.bl)*Math.atan(Math.sqrt(this.d*this.d-1.0)/this.cosaz);}else{this.u=-(this.al/this.bl)*Math.atan(Math.sqrt(this.d*this.d-1.0)/this.cosaz);}}else{Proj4js.reportError("omerc:Init:DataError");}}else{this.sinphi=Math.sin(this.at1);this.ts1=Proj4js.common.tsfnz(this.e,this.lat1,this.sinphi);this.sinphi=Math.sin(this.lat2);this.ts2=Proj4js.common.tsfnz(this.e,this.lat2,this.sinphi);this.h=Math.pow(this.ts1,this.bl);this.l=Math.pow(this.ts2,this.bl);this.f=this.el/this.h;this.g=.5*(this.f-1.0/this.f);this.j=(this.el*this.el-this.l*this.h)/(this.el*this.el+this.l*this.h);this.p=(this.l-this.h)/(this.l+this.h);this.dlon=this.lon1-this.lon2;if(this.dlon<-Proj4js.common.PI)this.lon2=this.lon2-2.0*Proj4js.common.PI;if(this.dlon>Proj4js.common.PI)this.lon2=this.lon2+2.0*Proj4js.common.PI;this.dlon=this.lon1-this.lon2;this.longc=.5*(this.lon1+this.lon2)-Math.atan(this.j*Math.tan(.5*this.bl*this.dlon)/this.p)/this.bl;this.dlon=Proj4js.common.adjust_lon(this.lon1-this.longc);this.gama=Math.atan(Math.sin(this.bl*this.dlon)/this.g);this.alpha=Proj4js.common.asinz(this.d*Math.sin(this.gama));if(Math.abs(this.lat1-this.lat2)<=Proj4js.common.EPSLN){Proj4js.reportError("omercInitDataError");}else{this.con=Math.abs(this.lat1);}
+if((this.con<=Proj4js.common.EPSLN)||(Math.abs(this.con-HALF_PI)<=Proj4js.common.EPSLN)){Proj4js.reportError("omercInitDataError");}else{if(Math.abs(Math.abs(this.lat0)-Proj4js.common.HALF_PI)<=Proj4js.common.EPSLN){Proj4js.reportError("omercInitDataError");}}
+this.singam=Math.sin(this.gam);this.cosgam=Math.cos(this.gam);this.sinaz=Math.sin(this.alpha);this.cosaz=Math.cos(this.alpha);if(this.lat0>=0){this.u=(this.al/this.bl)*Math.atan(Math.sqrt(this.d*this.d-1.0)/this.cosaz);}else{this.u=-(this.al/this.bl)*Math.atan(Math.sqrt(this.d*this.d-1.0)/this.cosaz);}}},forward:function(p){var theta;var sin_phi,cos_phi;var b;var c,t,tq;var con,n,ml;var q,us,vl;var ul,vs;var s;var dlon;var ts1;var lon=p.x;var lat=p.y;sin_phi=Math.sin(lat);dlon=Proj4js.common.adjust_lon(lon-this.longc);vl=Math.sin(this.bl*dlon);if(Math.abs(Math.abs(lat)-Proj4js.common.HALF_PI)>Proj4js.common.EPSLN){ts1=Proj4js.common.tsfnz(this.e,lat,sin_phi);q=this.el/(Math.pow(ts1,this.bl));s=.5*(q-1.0/q);t=.5*(q+1.0/q);ul=(s*this.singam-vl*this.cosgam)/t;con=Math.cos(this.bl*dlon);if(Math.abs(con)<.0000001){us=this.al*this.bl*dlon;}else{us=this.al*Math.atan((s*this.cosgam+vl*this.singam)/con)/this.bl;if(con<0)us=us+Proj4js.common.PI*this.al/this.bl;}}else{if(lat>=0){ul=this.singam;}else{ul=-this.singam;}
+us=this.al*lat/this.bl;}
+if(Math.abs(Math.abs(ul)-1.0)<=Proj4js.common.EPSLN){Proj4js.reportError("omercFwdInfinity");}
+vs=.5*this.al*Math.log((1.0-ul)/(1.0+ul))/this.bl;us=us-this.u;var x=this.x0+vs*this.cosaz+us*this.sinaz;var y=this.y0+us*this.cosaz-vs*this.sinaz;p.x=x;p.y=y;return p;},inverse:function(p){var delta_lon;var theta;var delta_theta;var sin_phi,cos_phi;var b;var c,t,tq;var con,n,ml;var vs,us,q,s,ts1;var vl,ul,bs;var dlon;var flag;p.x-=this.x0;p.y-=this.y0;flag=0;vs=p.x*this.cosaz-p.y*this.sinaz;us=p.y*this.cosaz+p.x*this.sinaz;us=us+this.u;q=Math.exp(-this.bl*vs/this.al);s=.5*(q-1.0/q);t=.5*(q+1.0/q);vl=Math.sin(this.bl*us/this.al);ul=(vl*this.cosgam+s*this.singam)/t;if(Math.abs(Math.abs(ul)-1.0)<=Proj4js.common.EPSLN)
+{lon=this.longc;if(ul>=0.0){lat=Proj4js.common.HALF_PI;}else{lat=-Proj4js.common.HALF_PI;}}else{con=1.0/this.bl;ts1=Math.pow((this.el/Math.sqrt((1.0+ul)/(1.0-ul))),con);lat=Proj4js.common.phi2z(this.e,ts1);theta=this.longc-Math.atan2((s*this.cosgam-vl*this.singam),con)/this.bl;lon=Proj4js.common.adjust_lon(theta);}
+p.x=lon;p.y=lat;return p;}};Proj4js.Proj.lcc={init:function(){if(!this.lat2){this.lat2=this.lat0;}
+if(!this.k0)this.k0=1.0;if(Math.abs(this.lat1+this.lat2)<Proj4js.common.EPSLN){Proj4js.reportError("lcc:init: Equal Latitudes");return;}
+var temp=this.b/this.a;this.e=Math.sqrt(1.0-temp*temp);var sin1=Math.sin(this.lat1);var cos1=Math.cos(this.lat1);var ms1=Proj4js.common.msfnz(this.e,sin1,cos1);var ts1=Proj4js.common.tsfnz(this.e,this.lat1,sin1);var sin2=Math.sin(this.lat2);var cos2=Math.cos(this.lat2);var ms2=Proj4js.common.msfnz(this.e,sin2,cos2);var ts2=Proj4js.common.tsfnz(this.e,this.lat2,sin2);var ts0=Proj4js.common.tsfnz(this.e,this.lat0,Math.sin(this.lat0));if(Math.abs(this.lat1-this.lat2)>Proj4js.common.EPSLN){this.ns=Math.log(ms1/ms2)/Math.log(ts1/ts2);}else{this.ns=sin1;}
+this.f0=ms1/(this.ns*Math.pow(ts1,this.ns));this.rh=this.a*this.f0*Math.pow(ts0,this.ns);if(!this.title)this.title="Lambert Conformal Conic";},forward:function(p){var lon=p.x;var lat=p.y;if(lat<=90.0&&lat>=-90.0&&lon<=180.0&&lon>=-180.0){}else{Proj4js.reportError("lcc:forward: llInputOutOfRange: "+lon+" : "+lat);return null;}
+var con=Math.abs(Math.abs(lat)-Proj4js.common.HALF_PI);var ts;if(con>Proj4js.common.EPSLN){ts=Proj4js.common.tsfnz(this.e,lat,Math.sin(lat));rh1=this.a*this.f0*Math.pow(ts,this.ns);}else{con=lat*this.ns;if(con<=0){Proj4js.reportError("lcc:forward: No Projection");return null;}
+rh1=0;}
+var theta=this.ns*Proj4js.common.adjust_lon(lon-this.long0);p.x=this.k0*(rh1*Math.sin(theta))+this.x0;p.y=this.k0*(this.rh-rh1*Math.cos(theta))+this.y0;return p;},inverse:function(p){var rh1,con,ts;var lat,lon;x=(p.x-this.x0)/this.k0;y=(this.rh-(p.y-this.y0)/this.k0);if(this.ns>0){rh1=Math.sqrt(x*x+y*y);con=1.0;}else{rh1=-Math.sqrt(x*x+y*y);con=-1.0;}
+var theta=0.0;if(rh1!=0){theta=Math.atan2((con*x),(con*y));}
+if((rh1!=0)||(this.ns>0.0)){con=1.0/this.ns;ts=Math.pow((rh1/(this.a*this.f0)),con);lat=Proj4js.common.phi2z(this.e,ts);if(lat==-9999)return null;}else{lat=-Proj4js.common.HALF_PI;}
+lon=Proj4js.common.adjust_lon(theta/this.ns+this.long0);p.x=lon;p.y=lat;return p;}};Proj4js.Proj.laea={init:function(){this.sin_lat_o=Math.sin(this.lat0);this.cos_lat_o=Math.cos(this.lat0);},forward:function(p){var lon=p.x;var lat=p.y;var delta_lon=Proj4js.common.adjust_lon(lon-this.long0);var sin_lat=Math.sin(lat);var cos_lat=Math.cos(lat);var sin_delta_lon=Math.sin(delta_lon);var cos_delta_lon=Math.cos(delta_lon);var g=this.sin_lat_o*sin_lat+this.cos_lat_o*cos_lat*cos_delta_lon;if(g==-1.0){Proj4js.reportError("laea:fwd:Point projects to a circle of radius "+2.0*R);return null;}
+var ksp=this.a*Math.sqrt(2.0/(1.0+g));var x=ksp*cos_lat*sin_delta_lon+this.x0;var y=ksp*(this.cos_lat_o*sin_lat-this.sin_lat_o*cos_lat*cos_delta_lon)+this.y0;p.x=x;p.y=y
+return p;},inverse:function(p){p.x-=this.x0;p.y-=this.y0;var Rh=Math.sqrt(p.x*p.x+p.y*p.y);var temp=Rh/(2.0*this.a);if(temp>1){Proj4js.reportError("laea:Inv:DataError");return null;}
+var z=2.0*Proj4js.common.asinz(temp);var sin_z=Math.sin(z);var cos_z=Math.cos(z);var lon=this.long0;if(Math.abs(Rh)>Proj4js.common.EPSLN){var lat=Proj4js.common.asinz(this.sin_lat_o*cos_z+this.cos_lat_o*sin_z*p.y/Rh);var temp=Math.abs(this.lat0)-Proj4js.common.HALF_PI;if(Math.abs(temp)>Proj4js.common.EPSLN){temp=cos_z-this.sin_lat_o*Math.sin(lat);if(temp!=0.0)lon=Proj4js.common.adjust_lon(this.long0+Math.atan2(p.x*sin_z*this.cos_lat_o,temp*Rh));}else if(this.lat0<0.0){lon=Proj4js.common.adjust_lon(this.long0-Math.atan2(-p.x,p.y));}else{lon=Proj4js.common.adjust_lon(this.long0+Math.atan2(p.x,-p.y));}}else{lat=this.lat0;}
+p.x=lon;p.y=lat;return p;}};Proj4js.Proj.aeqd={init:function(){this.sin_p12=Math.sin(this.lat0)
+this.cos_p12=Math.cos(this.lat0)},forward:function(p){var lon=p.x;var lat=p.y;var ksp;var sinphi=Math.sin(p.y);var cosphi=Math.cos(p.y);var dlon=Proj4js.common.adjust_lon(lon-this.long0);var coslon=Math.cos(dlon);var g=this.sin_p12*sinphi+this.cos_p12*cosphi*coslon;if(Math.abs(Math.abs(g)-1.0)<Proj4js.common.EPSLN){ksp=1.0;if(g<0.0){Proj4js.reportError("aeqd:Fwd:PointError");return;}}else{var z=Math.acos(g);ksp=z/Math.sin(z);}
+p.x=this.x0+this.a*ksp*cosphi*Math.sin(dlon);p.y=this.y0+this.a*ksp*(this.cos_p12*sinphi-this.sin_p12*cosphi*coslon);return p;},inverse:function(p){p.x-=this.x0;p.y-=this.y0;var rh=Math.sqrt(p.x*p.x+p.y*p.y);if(rh>(2.0*Proj4js.common.HALF_PI*this.a)){Proj4js.reportError("aeqdInvDataError");return;}
+var z=rh/this.a;var sinz=Math.sin(z)
+var cosz=Math.cos(z)
+var lon=this.long0;var lat;if(Math.abs(rh)<=Proj4js.common.EPSLN){lat=this.lat0;}else{lat=Proj4js.common.asinz(cosz*this.sin_p12+(p.y*sinz*this.cos_p12)/rh);var con=Math.abs(this.lat0)-Proj4js.common.HALF_PI;if(Math.abs(con)<=Proj4js.common.EPSLN){if(lat0>=0.0){lon=Proj4js.common.adjust_lon(this.long0+Math.atan2(p.x,-p.y));}else{lon=Proj4js.common.adjust_lon(this.long0-Math.atan2(-p.x,p.y));}}else{con=cosz-this.sin_p12*Math.sin(lat);if((Math.abs(con)<Proj4js.common.EPSLN)&&(Math.abs(p.x)<Proj4js.common.EPSLN)){}else{var temp=Math.atan2((p.x*sinz*this.cos_p12),(con*rh));lon=Proj4js.common.adjust_lon(this.long0+Math.atan2((p.x*sinz*this.cos_p12),(con*rh)));}}}
+p.x=lon;p.y=lat;return p;}};Proj4js.Proj.moll={init:function(){},forward:function(p){var lon=p.x;var lat=p.y;var delta_lon=Proj4js.common.adjust_lon(lon-this.long0);var theta=lat;var con=Proj4js.common.PI*Math.sin(lat);for(var i=0;;i++){var delta_theta=-(theta+Math.sin(theta)-con)/(1.0+Math.cos(theta));theta+=delta_theta;if(Math.abs(delta_theta)<Proj4js.common.EPSLN)break;if(i>=50){Proj4js.reportError("moll:Fwd:IterationError");}}
+theta/=2.0;if(Proj4js.common.PI/2-Math.abs(lat)<Proj4js.common.EPSLN)delta_lon=0;var x=0.900316316158*this.a*delta_lon*Math.cos(theta)+this.x0;var y=1.4142135623731*this.a*Math.sin(theta)+this.y0;p.x=x;p.y=y;return p;},inverse:function(p){var theta;var arg;p.x-=this.x0;var arg=p.y/(1.4142135623731*this.a);if(Math.abs(arg)>0.999999999999)arg=0.999999999999;var theta=Math.asin(arg);var lon=Proj4js.common.adjust_lon(this.long0+(p.x/(0.900316316158*this.a*Math.cos(theta))));if(lon<(-Proj4js.common.PI))lon=-Proj4js.common.PI;if(lon>Proj4js.common.PI)lon=Proj4js.common.PI;arg=(2.0*theta+Math.sin(2.0*theta))/Proj4js.common.PI;if(Math.abs(arg)>1.0)arg=1.0;var lat=Math.asin(arg);p.x=lon;p.y=lat;return p;}};
\ No newline at end of file
Added: trunk/mapbender/http/extensions/proj4js/lib/proj4js.js
===================================================================
--- trunk/mapbender/http/extensions/proj4js/lib/proj4js.js (rev 0)
+++ trunk/mapbender/http/extensions/proj4js/lib/proj4js.js 2009-08-31 13:30:38 UTC (rev 4581)
@@ -0,0 +1,1479 @@
+/*
+Author: Mike Adair madairATdmsolutions.ca
+ Richard Greenwood rich at greenwoodmap.com
+License: LGPL as per: http://www.gnu.org/copyleft/lesser.html
+
+$Id: Proj.js 2956 2007-07-09 12:17:52Z steven $
+*/
+
+/**
+ * Namespace: Proj4js
+ *
+ * Proj4js is a JavaScript library to transform point coordinates from one
+ * coordinate system to another, including datum transformations.
+ *
+ * This library is a port of both the Proj.4 and GCTCP C libraries to JavaScript.
+ * Enabling these transformations in the browser allows geographic data stored
+ * in different projections to be combined in browser-based web mapping
+ * applications.
+ *
+ * Proj4js must have access to coordinate system initialization strings (which
+ * are the same as for PROJ.4 command line). Thes can be included in your
+ * application using a <script> tag or Proj4js can load CS initialization
+ * strings from a local directory or a web service such as spatialreference.org.
+ *
+ * Similarly, Proj4js must have access to projection transform code. These can
+ * be included individually using a <script> tag in your page, built into a
+ * custom build of Proj4js or loaded dynamically at run-time. Using the
+ * -combined and -compressed versions of Proj4js includes all projection class
+ * code by default.
+ *
+ * Note that dynamic loading of defs and code happens ascynchrously, check the
+ * Proj.readyToUse flag before using the Proj object. If the defs and code
+ * required by your application are loaded through script tags, dynamic loading
+ * is not required and the Proj object will be readyToUse on return from the
+ * constructor.
+ *
+ * All coordinates are handled as points which have a .x and a .y property
+ * which will be modified in place.
+ *
+ * Override Proj4js.reportError for output of alerts and warnings.
+ *
+ * See http://trac.osgeo.org/proj4js/wiki/UserGuide for full details.
+*/
+
+/**
+ * Global namespace object for Proj4js library
+ */
+Proj4js = {
+
+ /**
+ * Property: defaultDatum
+ * The datum to use when no others a specified
+ */
+ defaultDatum: 'WGS84', //default datum
+
+ /**
+ * Method: transform(source, dest, point)
+ * Transform a point coordinate from one map projection to another. This is
+ * really the only public method you should need to use.
+ *
+ * Parameters:
+ * source - {Proj4js.Proj} source map projection for the transformation
+ * dest - {Proj4js.Proj} destination map projection for the transformation
+ * point - {Object} point to transform, may be geodetic (long, lat) or
+ * projected Cartesian (x,y), but should always have x,y properties.
+ */
+ transform: function(source, dest, point) {
+ if (!source.readyToUse || !dest.readyToUse) {
+ this.reportError("Proj4js initialization for "+source.srsCode+" not yet complete");
+ return point;
+ }
+
+ // Workaround for Spherical Mercator
+ if ((source.srsProjNumber =="900913" && dest.datumCode != "WGS84") ||
+ (dest.srsProjNumber == "900913" && source.datumCode != "WGS84")) {
+ var wgs84 = Proj4js.WGS84;
+ this.transform(source, wgs84, point);
+ source = wgs84;
+ }
+
+ // Transform source points to long/lat, if they aren't already.
+ if ( source.projName=="longlat") {
+ point.x *= Proj4js.common.D2R; // convert degrees to radians
+ point.y *= Proj4js.common.D2R;
+ } else {
+ if (source.to_meter) {
+ point.x *= source.to_meter;
+ point.y *= source.to_meter;
+ }
+ source.inverse(point); // Convert Cartesian to longlat
+ }
+
+ // Adjust for the prime meridian if necessary
+ if (source.from_greenwich) {
+ point.x += source.from_greenwich;
+ }
+
+ // Convert datums if needed, and if possible.
+ point = this.datum_transform( source.datum, dest.datum, point );
+
+ // Adjust for the prime meridian if necessary
+ if (dest.from_greenwich) {
+ point.x -= dest.from_greenwich;
+ }
+
+ if( dest.projName=="longlat" ) {
+ // convert radians to decimal degrees
+ point.x *= Proj4js.common.R2D;
+ point.y *= Proj4js.common.R2D;
+ } else { // else project
+ dest.forward(point);
+ if (dest.to_meter) {
+ point.x /= dest.to_meter;
+ point.y /= dest.to_meter;
+ }
+ }
+ return point;
+ }, // transform()
+
+ /** datum_transform()
+ source coordinate system definition,
+ destination coordinate system definition,
+ point to transform in geodetic coordinates (long, lat, height)
+ */
+ datum_transform : function( source, dest, point ) {
+
+ // Short cut if the datums are identical.
+ if( source.compare_datums( dest ) ) {
+ return point; // in this case, zero is sucess,
+ // whereas cs_compare_datums returns 1 to indicate TRUE
+ // confusing, should fix this
+ }
+
+ // Explicitly skip datum transform by setting 'datum=none' as parameter for either source or dest
+ if( source.datum_type == Proj4js.common.PJD_NODATUM
+ || dest.datum_type == Proj4js.common.PJD_NODATUM) {
+ return point;
+ }
+
+ // If this datum requires grid shifts, then apply it to geodetic coordinates.
+ if( source.datum_type == Proj4js.common.PJD_GRIDSHIFT )
+ {
+ alert("ERROR: Grid shift transformations are not implemented yet.");
+ /*
+ pj_apply_gridshift( pj_param(source.params,"snadgrids").s, 0,
+ point_count, point_offset, x, y, z );
+ CHECK_RETURN;
+
+ src_a = SRS_WGS84_SEMIMAJOR;
+ src_es = 0.006694379990;
+ */
+ }
+
+ if( dest.datum_type == Proj4js.common.PJD_GRIDSHIFT )
+ {
+ alert("ERROR: Grid shift transformations are not implemented yet.");
+ /*
+ dst_a = ;
+ dst_es = 0.006694379990;
+ */
+ }
+
+ // Do we need to go through geocentric coordinates?
+ if( source.es != dest.es || source.a != dest.a
+ || source.datum_type == Proj4js.common.PJD_3PARAM
+ || source.datum_type == Proj4js.common.PJD_7PARAM
+ || dest.datum_type == Proj4js.common.PJD_3PARAM
+ || dest.datum_type == Proj4js.common.PJD_7PARAM)
+ {
+
+ // Convert to geocentric coordinates.
+ source.geodetic_to_geocentric( point );
+ // CHECK_RETURN;
+
+ // Convert between datums
+ if( source.datum_type == Proj4js.common.PJD_3PARAM || source.datum_type == Proj4js.common.PJD_7PARAM ) {
+ source.geocentric_to_wgs84(point);
+ // CHECK_RETURN;
+ }
+
+ if( dest.datum_type == Proj4js.common.PJD_3PARAM || dest.datum_type == Proj4js.common.PJD_7PARAM ) {
+ dest.geocentric_from_wgs84(point);
+ // CHECK_RETURN;
+ }
+
+ // Convert back to geodetic coordinates
+ dest.geocentric_to_geodetic( point );
+ // CHECK_RETURN;
+ }
+
+ // Apply grid shift to destination if required
+ if( dest.datum_type == Proj4js.common.PJD_GRIDSHIFT )
+ {
+ alert("ERROR: Grid shift transformations are not implemented yet.");
+ // pj_apply_gridshift( pj_param(dest.params,"snadgrids").s, 1, point);
+ // CHECK_RETURN;
+ }
+ return point;
+ }, // cs_datum_transform
+
+ /**
+ * Function: reportError
+ * An internal method to report errors back to user.
+ * Override this in applications to report error messages or throw exceptions.
+ */
+ reportError: function(msg) {
+ //console.log(msg);
+ },
+
+/**
+ *
+ * Title: Private Methods
+ * The following properties and methods are intended for internal use only.
+ *
+ * This is a minimal implementation of JavaScript inheritance methods so that
+ * Proj4js can be used as a stand-alone library.
+ * These are copies of the equivalent OpenLayers methods at v2.7
+ */
+
+/**
+ * Function: extend
+ * Copy all properties of a source object to a destination object. Modifies
+ * the passed in destination object. Any properties on the source object
+ * that are set to undefined will not be (re)set on the destination object.
+ *
+ * Parameters:
+ * destination - {Object} The object that will be modified
+ * source - {Object} The object with properties to be set on the destination
+ *
+ * Returns:
+ * {Object} The destination object.
+ */
+ extend: function(destination, source) {
+ destination = destination || {};
+ if(source) {
+ for(var property in source) {
+ var value = source[property];
+ if(value !== undefined) {
+ destination[property] = value;
+ }
+ }
+ }
+ return destination;
+ },
+
+/**
+ * Constructor: Class
+ * Base class used to construct all other classes. Includes support for
+ * multiple inheritance.
+ *
+ */
+ Class: function() {
+ var Class = function() {
+ this.initialize.apply(this, arguments);
+ };
+
+ var extended = {};
+ var parent;
+ for(var i=0; i<arguments.length; ++i) {
+ if(typeof arguments[i] == "function") {
+ // get the prototype of the superclass
+ parent = arguments[i].prototype;
+ } else {
+ // in this case we're extending with the prototype
+ parent = arguments[i];
+ }
+ Proj4js.extend(extended, parent);
+ }
+ Class.prototype = extended;
+
+ return Class;
+ },
+
+ /**
+ * Function: bind
+ * Bind a function to an object. Method to easily create closures with
+ * 'this' altered.
+ *
+ * Parameters:
+ * func - {Function} Input function.
+ * object - {Object} The object to bind to the input function (as this).
+ *
+ * Returns:
+ * {Function} A closure with 'this' set to the passed in object.
+ */
+ bind: function(func, object) {
+ // create a reference to all arguments past the second one
+ var args = Array.prototype.slice.apply(arguments, [2]);
+ return function() {
+ // Push on any additional arguments from the actual function call.
+ // These will come after those sent to the bind call.
+ var newArgs = args.concat(
+ Array.prototype.slice.apply(arguments, [0])
+ );
+ return func.apply(object, newArgs);
+ };
+ },
+
+/**
+ * The following properties and methods handle dynamic loading of JSON objects.
+ *
+ /**
+ * Property: scriptName
+ * {String} The filename of this script without any path.
+ */
+ scriptName: "proj4js.js",
+
+ /**
+ * Property: defsLookupService
+ * AJAX service to retreive projection definition parameters from
+ */
+ defsLookupService: 'http://spatialreference.org/ref',
+
+ /**
+ * Property: libPath
+ * internal: http server path to library code.
+ */
+ libPath: null,
+
+ /**
+ * Function: getScriptLocation
+ * Return the path to this script.
+ *
+ * Returns:
+ * Path to this script
+ */
+ getScriptLocation: function () {
+ if (this.libPath) return this.libPath;
+ var scriptName = this.scriptName;
+ var scriptNameLen = scriptName.length;
+
+ var scripts = document.getElementsByTagName('script');
+ for (var i = 0; i < scripts.length; i++) {
+ var src = scripts[i].getAttribute('src');
+ if (src) {
+ var index = src.lastIndexOf(scriptName);
+ // is it found, at the end of the URL?
+ if ((index > -1) && (index + scriptNameLen == src.length)) {
+ this.libPath = src.slice(0, -scriptNameLen);
+ break;
+ }
+ }
+ }
+ return this.libPath||"";
+ },
+
+ /**
+ * Function: loadScript
+ * Load a JS file from a URL into a <script> tag in the page.
+ *
+ * Parameters:
+ * url - {String} The URL containing the script to load
+ * onload - {Function} A method to be executed when the script loads successfully
+ * onfail - {Function} A method to be executed when there is an error loading the script
+ * loadCheck - {Function} A boolean method that checks to see if the script
+ * has loaded. Typically this just checks for the existance of
+ * an object in the file just loaded.
+ */
+ loadScript: function(url, onload, onfail, loadCheck) {
+ var script = document.createElement('script');
+ script.defer = false;
+ script.type = "text/javascript";
+ script.id = url;
+ script.src = url;
+ script.onload = onload;
+ script.onerror = onfail;
+ script.loadCheck = loadCheck;
+ if (/MSIE/.test(navigator.userAgent)) {
+ script.onreadystatechange = this.checkReadyState;
+ }
+ document.getElementsByTagName('head')[0].appendChild(script);
+ },
+
+ /**
+ * Function: checkReadyState
+ * IE workaround since there is no onerror handler. Calls the user defined
+ * loadCheck method to determine if the script is loaded.
+ *
+ */
+ checkReadyState: function() {
+ if (this.readyState == 'loaded') {
+ if (!this.loadCheck()) {
+ this.onerror();
+ } else {
+ this.onload();
+ }
+ }
+ }
+};
+
+/**
+ * Class: Proj4js.Proj
+ *
+ * Proj objects provide transformation methods for point coordinates
+ * between geodetic latitude/longitude and a projected coordinate system.
+ * once they have been initialized with a projection code.
+ *
+ * Initialization of Proj objects is with a projection code, usually EPSG codes,
+ * which is the key that will be used with the Proj4js.defs array.
+ *
+ * The code passed in will be stripped of colons and converted to uppercase
+ * to locate projection definition files.
+ *
+ * A projection object has properties for units and title strings.
+ */
+Proj4js.Proj = Proj4js.Class({
+
+ /**
+ * Property: readyToUse
+ * Flag to indicate if initialization is complete for this Proj object
+ */
+ readyToUse: false,
+
+ /**
+ * Property: title
+ * The title to describe the projection
+ */
+ title: null,
+
+ /**
+ * Property: projName
+ * The projection class for this projection, e.g. lcc (lambert conformal conic,
+ * or merc for mercator. These are exactly equicvalent to their Proj4
+ * counterparts.
+ */
+ projName: null,
+ /**
+ * Property: units
+ * The units of the projection. Values include 'm' and 'degrees'
+ */
+ units: null,
+ /**
+ * Property: datum
+ * The datum specified for the projection
+ */
+ datum: null,
+
+ /**
+ * Constructor: initialize
+ * Constructor for Proj4js.Proj objects
+ *
+ * Parameters:
+ * srsCode - a code for map projection definition parameters. These are usually
+ * (but not always) EPSG codes.
+ */
+ initialize: function(srsCode) {
+ this.srsCode = srsCode.toUpperCase();
+ if (this.srsCode.indexOf("EPSG") == 0) {
+ this.srsCode = this.srsCode;
+ this.srsAuth = 'epsg';
+ this.srsProjNumber = this.srsCode.substring(5);
+ // DGR 2007-11-20 : authority IGNF
+ } else if (this.srsCode.indexOf("IGNF") == 0) {
+ this.srsCode = this.srsCode;
+ this.srsAuth = 'IGNF';
+ this.srsProjNumber = this.srsCode.substring(5);
+ // DGR 2008-06-19 : pseudo-authority CRS for WMS
+ } else if (this.srsCode.indexOf("CRS") == 0) {
+ this.srsCode = this.srsCode;
+ this.srsAuth = 'CRS';
+ this.srsProjNumber = this.srsCode.substring(4);
+ } else {
+ this.srsAuth = '';
+ this.srsProjNumber = this.srsCode;
+ }
+ this.loadProjDefinition();
+ },
+
+/**
+ * Function: loadProjDefinition
+ * Loads the coordinate system initialization string if required.
+ * Note that dynamic loading happens asynchronously so an application must
+ * wait for the readyToUse property is set to true.
+ * To prevent dynamic loading, include the defs through a script tag in
+ * your application.
+ *
+ */
+ loadProjDefinition: function() {
+ //check in memory
+ if (Proj4js.defs[this.srsCode]) {
+ this.defsLoaded();
+ return;
+ }
+
+ //else check for def on the server
+ var url = Proj4js.getScriptLocation() + 'defs/' + this.srsAuth.toUpperCase() + this.srsProjNumber + '.js';
+ Proj4js.loadScript(url,
+ Proj4js.bind(this.defsLoaded, this),
+ Proj4js.bind(this.loadFromService, this),
+ Proj4js.bind(this.checkDefsLoaded, this) );
+ },
+
+/**
+ * Function: loadFromService
+ * Creates the REST URL for loading the definition from a web service and
+ * loads it.
+ *
+ */
+ loadFromService: function() {
+ //else load from web service
+ var url = Proj4js.defsLookupService +'/' + this.srsAuth +'/'+ this.srsProjNumber + '/proj4js';
+ Proj4js.loadScript(url,
+ Proj4js.bind(this.defsLoaded, this),
+ Proj4js.bind(this.defsFailed, this),
+ Proj4js.bind(this.checkDefsLoaded, this) );
+ },
+
+/**
+ * Function: defsLoaded
+ * Continues the Proj object initilization once the def file is loaded
+ *
+ */
+ defsLoaded: function() {
+ this.parseDefs();
+ this.loadProjCode(this.projName);
+ },
+
+/**
+ * Function: checkDefsLoaded
+ * This is the loadCheck method to see if the def object exists
+ *
+ */
+ checkDefsLoaded: function() {
+ if (Proj4js.defs[this.srsCode]) {
+ return true;
+ } else {
+ return false;
+ }
+ },
+
+ /**
+ * Function: defsFailed
+ * Report an error in loading the defs file, but continue on using WGS84
+ *
+ */
+ defsFailed: function() {
+ Proj4js.reportError('failed to load projection definition for: '+this.srsCode);
+ Proj4js.extend(Proj4js.defs[this.srsCode], Proj4js.defs['WGS84']); //set it to something so it can at least continue
+ this.defsLoaded();
+ },
+
+/**
+ * Function: loadProjCode
+ * Loads projection class code dynamically if required.
+ * Projection code may be included either through a script tag or in
+ * a built version of proj4js
+ *
+ */
+ loadProjCode: function(projName) {
+ if (Proj4js.Proj[projName]) {
+ this.initTransforms();
+ return;
+ }
+
+ //the URL for the projection code
+ var url = Proj4js.getScriptLocation() + 'projCode/' + projName + '.js';
+ Proj4js.loadScript(url,
+ Proj4js.bind(this.loadProjCodeSuccess, this, projName),
+ Proj4js.bind(this.loadProjCodeFailure, this, projName),
+ Proj4js.bind(this.checkCodeLoaded, this, projName) );
+ },
+
+ /**
+ * Function: loadProjCodeSuccess
+ * Loads any proj dependencies or continue on to final initialization.
+ *
+ */
+ loadProjCodeSuccess: function(projName) {
+ if (Proj4js.Proj[projName].dependsOn){
+ this.loadProjCode(Proj4js.Proj[projName].dependsOn);
+ } else {
+ this.initTransforms();
+ }
+ },
+
+ /**
+ * Function: defsFailed
+ * Report an error in loading the proj file. Initialization of the Proj
+ * object has failed and the readyToUse flag will never be set.
+ *
+ */
+ loadProjCodeFailure: function(projName) {
+ Proj4js.reportError("failed to find projection file for: " + projName);
+ //TBD initialize with identity transforms so proj will still work?
+ },
+
+/**
+ * Function: checkCodeLoaded
+ * This is the loadCheck method to see if the projection code is loaded
+ *
+ */
+ checkCodeLoaded: function(projName) {
+ if (Proj4js.Proj[projName]) {
+ return true;
+ } else {
+ return false;
+ }
+ },
+
+/**
+ * Function: initTransforms
+ * Finalize the initialization of the Proj object
+ *
+ */
+ initTransforms: function() {
+ Proj4js.extend(this, Proj4js.Proj[this.projName]);
+ this.init();
+ this.readyToUse = true;
+ },
+
+/**
+ * Function: parseDefs
+ * Parses the PROJ.4 initialization string and sets the associated properties.
+ *
+ */
+ parseDefs: function() {
+ this.defData = Proj4js.defs[this.srsCode];
+ var paramName, paramVal;
+ var paramArray=this.defData.split("+");
+
+ for (var prop=0; prop<paramArray.length; prop++) {
+ var property = paramArray[prop].split("=");
+ paramName = property[0].toLowerCase();
+ paramVal = property[1];
+
+ switch (paramName.replace(/\s/gi,"")) { // trim out spaces
+ case "": break; // throw away nameless parameter
+ case "title": this.title = paramVal; break;
+ case "proj": this.projName = paramVal.replace(/\s/gi,""); break;
+ case "units": this.units = paramVal.replace(/\s/gi,""); break;
+ case "datum": this.datumCode = paramVal.replace(/\s/gi,""); break;
+ case "nadgrids": this.nagrids = paramVal.replace(/\s/gi,""); break;
+ case "ellps": this.ellps = paramVal.replace(/\s/gi,""); break;
+ case "a": this.a = parseFloat(paramVal); break; // semi-major radius
+ case "b": this.b = parseFloat(paramVal); break; // semi-minor radius
+ // DGR 2007-11-20
+ case "rf": this.rf = parseFloat(paramVal); break; // inverse flattening rf= a/(a-b)
+ case "lat_0": this.lat0 = paramVal*Proj4js.common.D2R; break; // phi0, central latitude
+ case "lat_1": this.lat1 = paramVal*Proj4js.common.D2R; break; //standard parallel 1
+ case "lat_2": this.lat2 = paramVal*Proj4js.common.D2R; break; //standard parallel 2
+ case "lat_ts": this.lat_ts = paramVal*Proj4js.common.D2R; break; // used in merc and eqc
+ case "lon_0": this.long0 = paramVal*Proj4js.common.D2R; break; // lam0, central longitude
+ case "alpha": this.alpha = parseFloat(paramVal)*Proj4js.common.D2R; break; //for somerc projection
+ case "lonc": this.longc = paramVal*Proj4js.common.D2R; break; //for somerc projection
+ case "x_0": this.x0 = parseFloat(paramVal); break; // false easting
+ case "y_0": this.y0 = parseFloat(paramVal); break; // false northing
+ case "k_0": this.k0 = parseFloat(paramVal); break; // projection scale factor
+ case "k": this.k0 = parseFloat(paramVal); break; // both forms returned
+ case "R_A": this.R = true; break; //Spheroid radius
+ case "zone": this.zone = parseInt(paramVal); break; // UTM Zone
+ case "south": this.utmSouth = true; break; // UTM north/south
+ case "towgs84":this.datum_params = paramVal.split(","); break;
+ case "to_meter": this.to_meter = parseFloat(paramVal); break; // cartesian scaling
+ case "from_greenwich": this.from_greenwich = paramVal*Proj4js.common.D2R; break;
+ // DGR 2008-07-09 : if pm is not a well-known prime meridian take
+ // the value instead of 0.0, then convert to radians
+ case "pm": paramVal = paramVal.replace(/\s/gi,"");
+ this.from_greenwich = Proj4js.PrimeMeridian[paramVal] ?
+ Proj4js.PrimeMeridian[paramVal] : parseFloat(paramVal);
+ this.from_greenwich *= Proj4js.common.D2R;
+ break;
+ case "no_defs": break;
+ default: //alert("Unrecognized parameter: " + paramName);
+ } // switch()
+ } // for paramArray
+ this.deriveConstants();
+ },
+
+/**
+ * Function: deriveConstants
+ * Sets several derived constant values and initialization of datum and ellipse
+ * parameters.
+ *
+ */
+ deriveConstants: function() {
+ if (this.nagrids == '@null') this.datumCode = 'none';
+ if (this.datumCode && this.datumCode != 'none') {
+ var datumDef = Proj4js.Datum[this.datumCode];
+ if (datumDef) {
+ this.datum_params = datumDef.towgs84.split(',');
+ this.ellps = datumDef.ellipse;
+ this.datumName = datumDef.datumName ? datumDef.datumName : this.datumCode;
+ }
+ }
+ if (!this.a) { // do we have an ellipsoid?
+ var ellipse = Proj4js.Ellipsoid[this.ellps] ? Proj4js.Ellipsoid[this.ellps] : Proj4js.Ellipsoid['WGS84'];
+ Proj4js.extend(this, ellipse);
+ }
+ if (this.rf && !this.b) this.b = (1.0 - 1.0/this.rf) * this.a;
+ if (Math.abs(this.a - this.b)<Proj4js.common.EPSLN) {
+ this.sphere = true;
+ this.b= this.a;
+ }
+ this.a2 = this.a * this.a; // used in geocentric
+ this.b2 = this.b * this.b; // used in geocentric
+ this.es = (this.a2-this.b2)/this.a2; // e ^ 2
+ this.e = Math.sqrt(this.es); // eccentricity
+ if (this.R_A) {
+ this.a *= 1. - this.es * (Proj4js.common.SIXTH + this.es * (Proj4js.RA4 + this.es * Proj4js.RA6));
+ this.a2 = this.a * this.a;
+ this.b2 = this.b * this.b;
+ this.es = 0.;
+ }
+ this.ep2=(this.a2-this.b2)/this.b2; // used in geocentric
+ if (!this.k0) this.k0 = 1.0; //default value
+
+ this.datum = new Proj4js.datum(this);
+ }
+});
+
+Proj4js.Proj.longlat = {
+ init: function() {
+ //no-op for longlat
+ },
+ forward: function(pt) {
+ //identity transform
+ return pt;
+ },
+ inverse: function(pt) {
+ //identity transform
+ return pt;
+ }
+};
+
+/**
+ Proj4js.defs is a collection of coordinate system definition objects in the
+ PROJ.4 command line format.
+ Generally a def is added by means of a separate .js file for example:
+
+ <SCRIPT type="text/javascript" src="defs/EPSG26912.js"></SCRIPT>
+
+ def is a CS definition in PROJ.4 WKT format, for example:
+ +proj="tmerc" //longlat, etc.
+ +a=majorRadius
+ +b=minorRadius
+ +lat0=somenumber
+ +long=somenumber
+*/
+Proj4js.defs = {
+ // These are so widely used, we'll go ahead and throw them in
+ // without requiring a separate .js file
+ 'WGS84': "+title=long/lat:WGS84 +proj=longlat +ellps=WGS84 +datum=WGS84 +units=degrees",
+ 'EPSG:4326': "+title=long/lat:WGS84 +proj=longlat +a=6378137.0 +b=6356752.31424518 +ellps=WGS84 +datum=WGS84 +units=degrees",
+ 'EPSG:4269': "+title=long/lat:NAD83 +proj=longlat +a=6378137.0 +b=6356752.31414036 +ellps=GRS80 +datum=NAD83 +units=degrees"
+};
+//+a=6378137.0 +b=6356752.31424518 +ellps=WGS84 +datum=WGS84",
+Proj4js.common = {
+ PI : 3.141592653589793238, //Math.PI,
+ HALF_PI : 1.570796326794896619, //Math.PI*0.5,
+ TWO_PI : 6.283185307179586477, //Math.PI*2,
+ FORTPI : 0.78539816339744833,
+ R2D : 57.29577951308232088,
+ D2R : 0.01745329251994329577,
+ SEC_TO_RAD : 4.84813681109535993589914102357e-6, /* SEC_TO_RAD = Pi/180/3600 */
+ EPSLN : 1.0e-10,
+ MAX_ITER : 20,
+ // following constants from geocent.c
+ COS_67P5 : 0.38268343236508977, /* cosine of 67.5 degrees */
+ AD_C : 1.0026000, /* Toms region 1 constant */
+
+ /* datum_type values */
+ PJD_UNKNOWN : 0,
+ PJD_3PARAM : 1,
+ PJD_7PARAM : 2,
+ PJD_GRIDSHIFT: 3,
+ PJD_WGS84 : 4, // WGS84 or equivalent
+ PJD_NODATUM : 5, // WGS84 or equivalent
+ SRS_WGS84_SEMIMAJOR : 6378137.0, // only used in grid shift transforms
+
+ // ellipoid pj_set_ell.c
+ SIXTH : .1666666666666666667, /* 1/6 */
+ RA4 : .04722222222222222222, /* 17/360 */
+ RA6 : .02215608465608465608, /* 67/3024 */
+ RV4 : .06944444444444444444, /* 5/72 */
+ RV6 : .04243827160493827160, /* 55/1296 */
+
+// Function to compute the constant small m which is the radius of
+// a parallel of latitude, phi, divided by the semimajor axis.
+// -----------------------------------------------------------------
+ msfnz : function(eccent, sinphi, cosphi) {
+ var con = eccent * sinphi;
+ return cosphi/(Math.sqrt(1.0 - con * con));
+ },
+
+// Function to compute the constant small t for use in the forward
+// computations in the Lambert Conformal Conic and the Polar
+// Stereographic projections.
+// -----------------------------------------------------------------
+ tsfnz : function(eccent, phi, sinphi) {
+ var con = eccent * sinphi;
+ var com = .5 * eccent;
+ con = Math.pow(((1.0 - con) / (1.0 + con)), com);
+ return (Math.tan(.5 * (this.HALF_PI - phi))/con);
+ },
+
+// Function to compute the latitude angle, phi2, for the inverse of the
+// Lambert Conformal Conic and Polar Stereographic projections.
+// ----------------------------------------------------------------
+ phi2z : function(eccent, ts) {
+ var eccnth = .5 * eccent;
+ var con, dphi;
+ var phi = this.HALF_PI - 2 * Math.atan(ts);
+ for (i = 0; i <= 15; i++) {
+ con = eccent * Math.sin(phi);
+ dphi = this.HALF_PI - 2 * Math.atan(ts *(Math.pow(((1.0 - con)/(1.0 + con)),eccnth))) - phi;
+ phi += dphi;
+ if (Math.abs(dphi) <= .0000000001) return phi;
+ }
+ alert("phi2z has NoConvergence");
+ return (-9999);
+ },
+
+/* Function to compute constant small q which is the radius of a
+ parallel of latitude, phi, divided by the semimajor axis.
+------------------------------------------------------------*/
+ qsfnz : function(eccent,sinphi,cosphi) {
+ var con;
+ if (eccent > 1.0e-7) {
+ con = eccent * sinphi;
+ return (( 1.0- eccent * eccent) * (sinphi /(1.0 - con * con) - (.5/eccent)*Math.log((1.0 - con)/(1.0 + con))));
+ } else {
+ return(2.0 * sinphi);
+ }
+ },
+
+/* Function to eliminate roundoff errors in asin
+----------------------------------------------*/
+ asinz : function(x) {
+ if (Math.abs(x)>1.0) {
+ x=(x>1.0)?1.0:-1.0;
+ }
+ return Math.asin(x);
+ },
+
+// following functions from gctpc cproj.c for transverse mercator projections
+ e0fn : function(x) {return(1.0-0.25*x*(1.0+x/16.0*(3.0+1.25*x)));},
+ e1fn : function(x) {return(0.375*x*(1.0+0.25*x*(1.0+0.46875*x)));},
+ e2fn : function(x) {return(0.05859375*x*x*(1.0+0.75*x));},
+ e3fn : function(x) {return(x*x*x*(35.0/3072.0));},
+ mlfn : function(e0,e1,e2,e3,phi) {return(e0*phi-e1*Math.sin(2.0*phi)+e2*Math.sin(4.0*phi)-e3*Math.sin(6.0*phi));},
+
+ srat : function(esinp, exp) {
+ return(Math.pow((1.0-esinp)/(1.0+esinp), exp));
+ },
+
+// Function to return the sign of an argument
+ sign : function(x) { if (x < 0.0) return(-1); else return(1);},
+
+// Function to adjust longitude to -180 to 180; input in radians
+ adjust_lon : function(x) {
+ x = (Math.abs(x) < this.PI) ? x: (x - (this.sign(x)*this.TWO_PI) );
+ return x;
+ },
+
+// IGNF - DGR : algorithms used by IGN France
+
+// Function to adjust latitude to -90 to 90; input in radians
+ adjust_lat : function(x) {
+ x= (Math.abs(x) < this.HALF_PI) ? x: (x - (this.sign(x)*this.PI) );
+ return x;
+ },
+
+// Latitude Isometrique - close to tsfnz ...
+ latiso : function(eccent, phi, sinphi)
+ {
+ if (Math.abs(phi) > this.HALF_PI) return +Number.NaN;
+ if (phi==this.HALF_PI) return Number.POSITIVE_INFINITY;
+ if (phi==-1.0*this.HALF_PI) return -1.0*Number.POSITIVE_INFINITY;
+
+ var con= eccent*sinphi;
+ return Math.log(Math.tan((this.HALF_PI+phi)/2.0))+eccent*Math.log((1.0-con)/(1.0+con))/2.0;
+ },
+
+ fL : function(x,L) {
+ return 2.0*Math.atan(x*Math.exp(L)) - this.HALF_PI;
+ },
+
+// Inverse Latitude Isometrique - close to ph2z
+ invlatiso : function(eccent, ts) {
+ var phi= this.fL(1.0,ts);
+ var Iphi= 0.0;
+ var con= 0.0;
+ do {
+ Iphi= phi;
+ con= eccent*Math.sin(Iphi);
+ phi= this.fL(Math.exp(eccent*Math.log((1.0+con)/(1.0-con))/2.0),ts)
+ } while (Math.abs(phi-Iphi)>1.0e-12);
+ return phi;
+ },
+
+// Needed for Gauss Laborde
+// Original: Denis Makarov (info at binarythings.com)
+// Web Site: http://www.binarythings.com
+ sinh : function(x)
+ {
+ var r= Math.exp(x);
+ r= (r-1.0/r)/2.0;
+ return r;
+ },
+
+ cosh : function(x)
+ {
+ var r= Math.exp(x);
+ r= (r+1.0/r)/2.0;
+ return r;
+ },
+
+ tanh : function(x)
+ {
+ var r= Math.exp(x);
+ r= (r-1.0/r)/(r+1.0/r);
+ return r;
+ },
+
+ asinh : function(x)
+ {
+ var s= (x>= 0? 1.0:-1.0);
+ return s*(Math.log( Math.abs(x) + Math.sqrt(x*x+1.0) ));
+ },
+
+ acosh : function(x)
+ {
+ return 2.0*Math.log(Math.sqrt((x+1.0)/2.0) + Math.sqrt((x-1.0)/2.0));
+ },
+
+ atanh : function(x)
+ {
+ return Math.log((x-1.0)/(x+1.0))/2.0;
+ },
+
+// Grande Normale
+ gN : function(a,e,sinphi)
+ {
+ var temp= e*sinphi;
+ return a/Math.sqrt(1.0 - temp*temp);
+ }
+
+};
+
+/** datum object
+*/
+Proj4js.datum = Proj4js.Class({
+
+ initialize : function(proj) {
+ this.datum_type = Proj4js.common.PJD_WGS84; //default setting
+ if (proj.datumCode && proj.datumCode == 'none') {
+ this.datum_type = Proj4js.common.PJD_NODATUM;
+ }
+ if (proj && proj.datum_params) {
+ for (var i=0; i<proj.datum_params.length; i++) {
+ proj.datum_params[i]=parseFloat(proj.datum_params[i]);
+ }
+ if (proj.datum_params[0] != 0 || proj.datum_params[1] != 0 || proj.datum_params[2] != 0 ) {
+ this.datum_type = Proj4js.common.PJD_3PARAM;
+ }
+ if (proj.datum_params.length > 3) {
+ if (proj.datum_params[3] != 0 || proj.datum_params[4] != 0 ||
+ proj.datum_params[5] != 0 || proj.datum_params[6] != 0 ) {
+ this.datum_type = Proj4js.common.PJD_7PARAM;
+ proj.datum_params[3] *= Proj4js.common.SEC_TO_RAD;
+ proj.datum_params[4] *= Proj4js.common.SEC_TO_RAD;
+ proj.datum_params[5] *= Proj4js.common.SEC_TO_RAD;
+ proj.datum_params[6] = (proj.datum_params[6]/1000000.0) + 1.0;
+ }
+ }
+ }
+ if (proj) {
+ this.a = proj.a; //datum object also uses these values
+ this.b = proj.b;
+ this.es = proj.es;
+ this.ep2 = proj.ep2;
+ this.datum_params = proj.datum_params;
+ }
+ },
+
+ /****************************************************************/
+ // cs_compare_datums()
+ // Returns 1 (TRUE) if the two datums match, otherwise 0 (FALSE).
+ compare_datums : function( dest ) {
+ if( this.datum_type != dest.datum_type ) {
+ return false; // false, datums are not equal
+ } else if( this.a != dest.a || Math.abs(this.es-dest.es) > 0.000000000050 ) {
+ // the tolerence for es is to ensure that GRS80 and WGS84
+ // are considered identical
+ return false;
+ } else if( this.datum_type == Proj4js.common.PJD_3PARAM ) {
+ return (this.datum_params[0] == dest.datum_params[0]
+ && this.datum_params[1] == dest.datum_params[1]
+ && this.datum_params[2] == dest.datum_params[2]);
+ } else if( this.datum_type == Proj4js.common.PJD_7PARAM ) {
+ return (this.datum_params[0] == dest.datum_params[0]
+ && this.datum_params[1] == dest.datum_params[1]
+ && this.datum_params[2] == dest.datum_params[2]
+ && this.datum_params[3] == dest.datum_params[3]
+ && this.datum_params[4] == dest.datum_params[4]
+ && this.datum_params[5] == dest.datum_params[5]
+ && this.datum_params[6] == dest.datum_params[6]);
+ } else if( this.datum_type == Proj4js.common.PJD_GRIDSHIFT ) {
+ return strcmp( pj_param(this.params,"snadgrids").s,
+ pj_param(dest.params,"snadgrids").s ) == 0;
+ } else {
+ return true; // datums are equal
+ }
+ }, // cs_compare_datums()
+
+ /*
+ * The function Convert_Geodetic_To_Geocentric converts geodetic coordinates
+ * (latitude, longitude, and height) to geocentric coordinates (X, Y, Z),
+ * according to the current ellipsoid parameters.
+ *
+ * Latitude : Geodetic latitude in radians (input)
+ * Longitude : Geodetic longitude in radians (input)
+ * Height : Geodetic height, in meters (input)
+ * X : Calculated Geocentric X coordinate, in meters (output)
+ * Y : Calculated Geocentric Y coordinate, in meters (output)
+ * Z : Calculated Geocentric Z coordinate, in meters (output)
+ *
+ */
+ geodetic_to_geocentric : function(p) {
+ var Longitude = p.x;
+ var Latitude = p.y;
+ var Height = p.z ? p.z : 0; //Z value not always supplied
+ var X; // output
+ var Y;
+ var Z;
+
+ var Error_Code=0; // GEOCENT_NO_ERROR;
+ var Rn; /* Earth radius at location */
+ var Sin_Lat; /* Math.sin(Latitude) */
+ var Sin2_Lat; /* Square of Math.sin(Latitude) */
+ var Cos_Lat; /* Math.cos(Latitude) */
+
+ /*
+ ** Don't blow up if Latitude is just a little out of the value
+ ** range as it may just be a rounding issue. Also removed longitude
+ ** test, it should be wrapped by Math.cos() and Math.sin(). NFW for PROJ.4, Sep/2001.
+ */
+ if( Latitude < -Proj4js.common.HALF_PI && Latitude > -1.001 * Proj4js.common.HALF_PI ) {
+ Latitude = -Proj4js.common.HALF_PI;
+ } else if( Latitude > Proj4js.common.HALF_PI && Latitude < 1.001 * Proj4js.common.HALF_PI ) {
+ Latitude = Proj4js.common.HALF_PI;
+ } else if ((Latitude < -Proj4js.common.HALF_PI) || (Latitude > Proj4js.common.HALF_PI)) {
+ /* Latitude out of range */
+ Proj4js.reportError('geocent:lat out of range:'+Latitude);
+ return null;
+ }
+
+ if (Longitude > Proj4js.common.PI) Longitude -= (2*Proj4js.common.PI);
+ Sin_Lat = Math.sin(Latitude);
+ Cos_Lat = Math.cos(Latitude);
+ Sin2_Lat = Sin_Lat * Sin_Lat;
+ Rn = this.a / (Math.sqrt(1.0e0 - this.es * Sin2_Lat));
+ X = (Rn + Height) * Cos_Lat * Math.cos(Longitude);
+ Y = (Rn + Height) * Cos_Lat * Math.sin(Longitude);
+ Z = ((Rn * (1 - this.es)) + Height) * Sin_Lat;
+
+ p.x = X;
+ p.y = Y;
+ p.z = Z;
+ return Error_Code;
+ }, // cs_geodetic_to_geocentric()
+
+
+ geocentric_to_geodetic : function (p) {
+/* local defintions and variables */
+/* end-criterium of loop, accuracy of sin(Latitude) */
+var genau = 1.E-12;
+var genau2 = (genau*genau);
+var maxiter = 30;
+
+ var P; /* distance between semi-minor axis and location */
+ var RR; /* distance between center and location */
+ var CT; /* sin of geocentric latitude */
+ var ST; /* cos of geocentric latitude */
+ var RX;
+ var RK;
+ var RN; /* Earth radius at location */
+ var CPHI0; /* cos of start or old geodetic latitude in iterations */
+ var SPHI0; /* sin of start or old geodetic latitude in iterations */
+ var CPHI; /* cos of searched geodetic latitude */
+ var SPHI; /* sin of searched geodetic latitude */
+ var SDPHI; /* end-criterium: addition-theorem of sin(Latitude(iter)-Latitude(iter-1)) */
+ var At_Pole; /* indicates location is in polar region */
+ var iter; /* # of continous iteration, max. 30 is always enough (s.a.) */
+
+ var X = p.x;
+ var Y = p.y;
+ var Z = p.z ? p.z : 0.0; //Z value not always supplied
+ var Longitude;
+ var Latitude;
+ var Height;
+
+ At_Pole = false;
+ P = Math.sqrt(X*X+Y*Y);
+ RR = Math.sqrt(X*X+Y*Y+Z*Z);
+
+/* special cases for latitude and longitude */
+ if (P/this.a < genau) {
+
+/* special case, if P=0. (X=0., Y=0.) */
+ At_Pole = true;
+ Longitude = 0.0;
+
+/* if (X,Y,Z)=(0.,0.,0.) then Height becomes semi-minor axis
+ * of ellipsoid (=center of mass), Latitude becomes PI/2 */
+ if (RR/this.a < genau) {
+ Latitude = Proj4js.common.HALF_PI;
+ Height = -this.b;
+ return;
+ }
+ } else {
+/* ellipsoidal (geodetic) longitude
+ * interval: -PI < Longitude <= +PI */
+ Longitude=Math.atan2(Y,X);
+ }
+
+/* --------------------------------------------------------------
+ * Following iterative algorithm was developped by
+ * "Institut für Erdmessung", University of Hannover, July 1988.
+ * Internet: www.ife.uni-hannover.de
+ * Iterative computation of CPHI,SPHI and Height.
+ * Iteration of CPHI and SPHI to 10**-12 radian resp.
+ * 2*10**-7 arcsec.
+ * --------------------------------------------------------------
+ */
+ CT = Z/RR;
+ ST = P/RR;
+ RX = 1.0/Math.sqrt(1.0-this.es*(2.0-this.es)*ST*ST);
+ CPHI0 = ST*(1.0-this.es)*RX;
+ SPHI0 = CT*RX;
+ iter = 0;
+
+/* loop to find sin(Latitude) resp. Latitude
+ * until |sin(Latitude(iter)-Latitude(iter-1))| < genau */
+ do
+ {
+ iter++;
+ RN = this.a/Math.sqrt(1.0-this.es*SPHI0*SPHI0);
+
+/* ellipsoidal (geodetic) height */
+ Height = P*CPHI0+Z*SPHI0-RN*(1.0-this.es*SPHI0*SPHI0);
+
+ RK = this.es*RN/(RN+Height);
+ RX = 1.0/Math.sqrt(1.0-RK*(2.0-RK)*ST*ST);
+ CPHI = ST*(1.0-RK)*RX;
+ SPHI = CT*RX;
+ SDPHI = SPHI*CPHI0-CPHI*SPHI0;
+ CPHI0 = CPHI;
+ SPHI0 = SPHI;
+ }
+ while (SDPHI*SDPHI > genau2 && iter < maxiter);
+
+/* ellipsoidal (geodetic) latitude */
+ Latitude=Math.atan(SPHI/Math.abs(CPHI));
+
+ p.x = Longitude;
+ p.y = Latitude;
+ p.z = Height;
+ return p;
+ }, // cs_geocentric_to_geodetic()
+
+ /** Convert_Geocentric_To_Geodetic
+ * The method used here is derived from 'An Improved Algorithm for
+ * Geocentric to Geodetic Coordinate Conversion', by Ralph Toms, Feb 1996
+ */
+ geocentric_to_geodetic_noniter : function (p) {
+ var X = p.x;
+ var Y = p.y;
+ var Z = p.z ? p.z : 0; //Z value not always supplied
+ var Longitude;
+ var Latitude;
+ var Height;
+
+ var W; /* distance from Z axis */
+ var W2; /* square of distance from Z axis */
+ var T0; /* initial estimate of vertical component */
+ var T1; /* corrected estimate of vertical component */
+ var S0; /* initial estimate of horizontal component */
+ var S1; /* corrected estimate of horizontal component */
+ var Sin_B0; /* Math.sin(B0), B0 is estimate of Bowring aux variable */
+ var Sin3_B0; /* cube of Math.sin(B0) */
+ var Cos_B0; /* Math.cos(B0) */
+ var Sin_p1; /* Math.sin(phi1), phi1 is estimated latitude */
+ var Cos_p1; /* Math.cos(phi1) */
+ var Rn; /* Earth radius at location */
+ var Sum; /* numerator of Math.cos(phi1) */
+ var At_Pole; /* indicates location is in polar region */
+
+ X = parseFloat(X); // cast from string to float
+ Y = parseFloat(Y);
+ Z = parseFloat(Z);
+
+ At_Pole = false;
+ if (X != 0.0)
+ {
+ Longitude = Math.atan2(Y,X);
+ }
+ else
+ {
+ if (Y > 0)
+ {
+ Longitude = Proj4js.common.HALF_PI;
+ }
+ else if (Y < 0)
+ {
+ Longitude = -Proj4js.common.HALF_PI;
+ }
+ else
+ {
+ At_Pole = true;
+ Longitude = 0.0;
+ if (Z > 0.0)
+ { /* north pole */
+ Latitude = Proj4js.common.HALF_PI;
+ }
+ else if (Z < 0.0)
+ { /* south pole */
+ Latitude = -Proj4js.common.HALF_PI;
+ }
+ else
+ { /* center of earth */
+ Latitude = Proj4js.common.HALF_PI;
+ Height = -this.b;
+ return;
+ }
+ }
+ }
+ W2 = X*X + Y*Y;
+ W = Math.sqrt(W2);
+ T0 = Z * Proj4js.common.AD_C;
+ S0 = Math.sqrt(T0 * T0 + W2);
+ Sin_B0 = T0 / S0;
+ Cos_B0 = W / S0;
+ Sin3_B0 = Sin_B0 * Sin_B0 * Sin_B0;
+ T1 = Z + this.b * this.ep2 * Sin3_B0;
+ Sum = W - this.a * this.es * Cos_B0 * Cos_B0 * Cos_B0;
+ S1 = Math.sqrt(T1*T1 + Sum * Sum);
+ Sin_p1 = T1 / S1;
+ Cos_p1 = Sum / S1;
+ Rn = this.a / Math.sqrt(1.0 - this.es * Sin_p1 * Sin_p1);
+ if (Cos_p1 >= Proj4js.common.COS_67P5)
+ {
+ Height = W / Cos_p1 - Rn;
+ }
+ else if (Cos_p1 <= -Proj4js.common.COS_67P5)
+ {
+ Height = W / -Cos_p1 - Rn;
+ }
+ else
+ {
+ Height = Z / Sin_p1 + Rn * (this.es - 1.0);
+ }
+ if (At_Pole == false)
+ {
+ Latitude = Math.atan(Sin_p1 / Cos_p1);
+ }
+
+ p.x = Longitude;
+ p.y = Latitude;
+ p.z = Height;
+ return p;
+ }, // geocentric_to_geodetic_noniter()
+
+ /****************************************************************/
+ // pj_geocentic_to_wgs84( p )
+ // p = point to transform in geocentric coordinates (x,y,z)
+ geocentric_to_wgs84 : function ( p ) {
+
+ if( this.datum_type == Proj4js.common.PJD_3PARAM )
+ {
+ // if( x[io] == HUGE_VAL )
+ // continue;
+ p.x += this.datum_params[0];
+ p.y += this.datum_params[1];
+ p.z += this.datum_params[2];
+
+ }
+ else if (this.datum_type == Proj4js.common.PJD_7PARAM)
+ {
+ var Dx_BF =this.datum_params[0];
+ var Dy_BF =this.datum_params[1];
+ var Dz_BF =this.datum_params[2];
+ var Rx_BF =this.datum_params[3];
+ var Ry_BF =this.datum_params[4];
+ var Rz_BF =this.datum_params[5];
+ var M_BF =this.datum_params[6];
+ // if( x[io] == HUGE_VAL )
+ // continue;
+ var x_out = M_BF*( p.x - Rz_BF*p.y + Ry_BF*p.z) + Dx_BF;
+ var y_out = M_BF*( Rz_BF*p.x + p.y - Rx_BF*p.z) + Dy_BF;
+ var z_out = M_BF*(-Ry_BF*p.x + Rx_BF*p.y + p.z) + Dz_BF;
+ p.x = x_out;
+ p.y = y_out;
+ p.z = z_out;
+ }
+ }, // cs_geocentric_to_wgs84
+
+ /****************************************************************/
+ // pj_geocentic_from_wgs84()
+ // coordinate system definition,
+ // point to transform in geocentric coordinates (x,y,z)
+ geocentric_from_wgs84 : function( p ) {
+
+ if( this.datum_type == Proj4js.common.PJD_3PARAM )
+ {
+ //if( x[io] == HUGE_VAL )
+ // continue;
+ p.x -= this.datum_params[0];
+ p.y -= this.datum_params[1];
+ p.z -= this.datum_params[2];
+
+ }
+ else if (this.datum_type == Proj4js.common.PJD_7PARAM)
+ {
+ var Dx_BF =this.datum_params[0];
+ var Dy_BF =this.datum_params[1];
+ var Dz_BF =this.datum_params[2];
+ var Rx_BF =this.datum_params[3];
+ var Ry_BF =this.datum_params[4];
+ var Rz_BF =this.datum_params[5];
+ var M_BF =this.datum_params[6];
+ var x_tmp = (p.x - Dx_BF) / M_BF;
+ var y_tmp = (p.y - Dy_BF) / M_BF;
+ var z_tmp = (p.z - Dz_BF) / M_BF;
+ //if( x[io] == HUGE_VAL )
+ // continue;
+
+ p.x = x_tmp + Rz_BF*y_tmp - Ry_BF*z_tmp;
+ p.y = -Rz_BF*x_tmp + y_tmp + Rx_BF*z_tmp;
+ p.z = Ry_BF*x_tmp - Rx_BF*y_tmp + z_tmp;
+ } //cs_geocentric_from_wgs84()
+ }
+});
+
+/** point object, nothing fancy, just allows values to be
+ passed back and forth by reference rather than by value.
+ Other point classes may be used as long as they have
+ x and y properties, which will get modified in the transform method.
+*/
+Proj4js.Point = Proj4js.Class({
+
+ /**
+ * Constructor! Proj4js.Point
+ *
+ * Parameters:
+ * - x {float} or {Array} either the first coordinates component or
+ * the full coordinates
+ * - y {float} the second component
+ * - z {float} the third component, optional.
+ */
+ initialize : function(x,y,z) {
+ if (typeof x == 'object') {
+ this.x = x[0];
+ this.y = x[1];
+ this.z = x[2] || 0.0;
+ } else if (typeof x == 'string') {
+ var coords = x.split(',');
+ this.x = parseFloat(coords[0]);
+ this.y = parseFloat(coords[1]);
+ this.z = parseFloat(coords[2]) || 0.0;
+ } else {
+ this.x = x;
+ this.y = y;
+ this.z = z || 0.0;
+ }
+ },
+
+ /**
+ * APIMethod: clone
+ * Build a copy of a Proj4js.Point object.
+ *
+ * Return:
+ * {Proj4js}.Point the cloned point.
+ */
+ clone : function() {
+ return new Proj4js.Point(this.x, this.y, this.z);
+ },
+
+ /**
+ * APIMethod: toString
+ * Return a readable string version of the point
+ *
+ * Return:
+ * {String} String representation of Proj4js.Point object.
+ * (ex. <i>"x=5,y=42"</i>)
+ */
+ toString : function() {
+ return ("x=" + this.x + ",y=" + this.y);
+ },
+
+ /**
+ * APIMethod: toShortString
+ * Return a short string version of the point.
+ *
+ * Return:
+ * {String} Shortened String representation of Proj4js.Point object.
+ * (ex. <i>"5, 42"</i>)
+ */
+ toShortString : function() {
+ return (this.x + ", " + this.y);
+ }
+});
+
+Proj4js.PrimeMeridian = {
+ "greenwich": 0.0, //"0dE",
+ "lisbon": -9.131906111111, //"9d07'54.862\"W",
+ "paris": 2.337229166667, //"2d20'14.025\"E",
+ "bogota": -74.080916666667, //"74d04'51.3\"W",
+ "madrid": -3.687938888889, //"3d41'16.58\"W",
+ "rome": 12.452333333333, //"12d27'8.4\"E",
+ "bern": 7.439583333333, //"7d26'22.5\"E",
+ "jakarta": 106.807719444444, //"106d48'27.79\"E",
+ "ferro": -17.666666666667, //"17d40'W",
+ "brussels": 4.367975, //"4d22'4.71\"E",
+ "stockholm": 18.058277777778, //"18d3'29.8\"E",
+ "athens": 23.7163375, //"23d42'58.815\"E",
+ "oslo": 10.722916666667 //"10d43'22.5\"E"
+};
+
+Proj4js.Ellipsoid = {
+ "MERIT": {a:6378137.0, rf:298.257, ellipseName:"MERIT 1983"},
+ "SGS85": {a:6378136.0, rf:298.257, ellipseName:"Soviet Geodetic System 85"},
+ "GRS80": {a:6378137.0, rf:298.257222101, ellipseName:"GRS 1980(IUGG, 1980)"},
+ "IAU76": {a:6378140.0, rf:298.257, ellipseName:"IAU 1976"},
+ "airy": {a:6377563.396, b:6356256.910, ellipseName:"Airy 1830"},
+ "APL4.": {a:6378137, rf:298.25, ellipseName:"Appl. Physics. 1965"},
+ "NWL9D": {a:6378145.0, rf:298.25, ellipseName:"Naval Weapons Lab., 1965"},
+ "mod_airy": {a:6377340.189, b:6356034.446, ellipseName:"Modified Airy"},
+ "andrae": {a:6377104.43, rf:300.0, ellipseName:"Andrae 1876 (Den., Iclnd.)"},
+ "aust_SA": {a:6378160.0, rf:298.25, ellipseName:"Australian Natl & S. Amer. 1969"},
+ "GRS67": {a:6378160.0, rf:298.2471674270, ellipseName:"GRS 67(IUGG 1967)"},
+ "bessel": {a:6377397.155, rf:299.1528128, ellipseName:"Bessel 1841"},
+ "bess_nam": {a:6377483.865, rf:299.1528128, ellipseName:"Bessel 1841 (Namibia)"},
+ "clrk66": {a:6378206.4, b:6356583.8, ellipseName:"Clarke 1866"},
+ "clrk80": {a:6378249.145, rf:293.4663, ellipseName:"Clarke 1880 mod."},
+ "CPM": {a:6375738.7, rf:334.29, ellipseName:"Comm. des Poids et Mesures 1799"},
+ "delmbr": {a:6376428.0, rf:311.5, ellipseName:"Delambre 1810 (Belgium)"},
+ "engelis": {a:6378136.05, rf:298.2566, ellipseName:"Engelis 1985"},
+ "evrst30": {a:6377276.345, rf:300.8017, ellipseName:"Everest 1830"},
+ "evrst48": {a:6377304.063, rf:300.8017, ellipseName:"Everest 1948"},
+ "evrst56": {a:6377301.243, rf:300.8017, ellipseName:"Everest 1956"},
+ "evrst69": {a:6377295.664, rf:300.8017, ellipseName:"Everest 1969"},
+ "evrstSS": {a:6377298.556, rf:300.8017, ellipseName:"Everest (Sabah & Sarawak)"},
+ "fschr60": {a:6378166.0, rf:298.3, ellipseName:"Fischer (Mercury Datum) 1960"},
+ "fschr60m": {a:6378155.0, rf:298.3, ellipseName:"Fischer 1960"},
+ "fschr68": {a:6378150.0, rf:298.3, ellipseName:"Fischer 1968"},
+ "helmert": {a:6378200.0, rf:298.3, ellipseName:"Helmert 1906"},
+ "hough": {a:6378270.0, rf:297.0, ellipseName:"Hough"},
+ "intl": {a:6378388.0, rf:297.0, ellipseName:"International 1909 (Hayford)"},
+ "kaula": {a:6378163.0, rf:298.24, ellipseName:"Kaula 1961"},
+ "lerch": {a:6378139.0, rf:298.257, ellipseName:"Lerch 1979"},
+ "mprts": {a:6397300.0, rf:191.0, ellipseName:"Maupertius 1738"},
+ "new_intl": {a:6378157.5, b:6356772.2, ellipseName:"New International 1967"},
+ "plessis": {a:6376523.0, rf:6355863.0, ellipseName:"Plessis 1817 (France)"},
+ "krass": {a:6378245.0, rf:298.3, ellipseName:"Krassovsky, 1942"},
+ "SEasia": {a:6378155.0, b:6356773.3205, ellipseName:"Southeast Asia"},
+ "walbeck": {a:6376896.0, b:6355834.8467, ellipseName:"Walbeck"},
+ "WGS60": {a:6378165.0, rf:298.3, ellipseName:"WGS 60"},
+ "WGS66": {a:6378145.0, rf:298.25, ellipseName:"WGS 66"},
+ "WGS72": {a:6378135.0, rf:298.26, ellipseName:"WGS 72"},
+ "WGS84": {a:6378137.0, rf:298.257223563, ellipseName:"WGS 84"},
+ "sphere": {a:6370997.0, b:6370997.0, ellipseName:"Normal Sphere (r=6370997)"}
+};
+
+Proj4js.Datum = {
+ "WGS84": {towgs84: "0,0,0", ellipse: "WGS84", datumName: "WGS84"},
+ "GGRS87": {towgs84: "-199.87,74.79,246.62", ellipse: "GRS80", datumName: "Greek_Geodetic_Reference_System_1987"},
+ "NAD83": {towgs84: "0,0,0", ellipse: "GRS80", datumName: "North_American_Datum_1983"},
+ "NAD27": {nadgrids: "@conus, at alaska, at ntv2_0.gsb, at ntv1_can.dat", ellipse: "clrk66", datumName: "North_American_Datum_1927"},
+ "potsdam": {towgs84: "606.0,23.0,413.0", ellipse: "bessel", datumName: "Potsdam Rauenberg 1950 DHDN"},
+ "carthage": {towgs84: "-263.0,6.0,431.0", ellipse: "clark80", datumName: "Carthage 1934 Tunisia"},
+ "hermannskogel": {towgs84: "653.0,-212.0,449.0", ellipse: "bessel", datumName: "Hermannskogel"},
+ "ire65": {towgs84: "482.530,-130.596,564.557,-1.042,-0.214,-0.631,8.15", ellipse: "mod_airy", datumName: "Ireland 1965"},
+ "nzgd49": {towgs84: "59.47,-5.04,187.44,0.47,-0.1,1.024,-4.5993", ellipse: "intl", datumName: "New Zealand Geodetic Datum 1949"},
+ "OSGB36": {towgs84: "446.448,-125.157,542.060,0.1502,0.2470,0.8421,-20.4894", ellipse: "airy", datumName: "Airy 1830"}
+};
+
+Proj4js.WGS84 = new Proj4js.Proj('WGS84');
+Proj4js.Datum['OSB36'] = Proj4js.Datum['OSGB36']; //as returned from spatialreference.org
Added: trunk/mapbender/http/extensions/proj4js/lib/projCode/aea.js
===================================================================
--- trunk/mapbender/http/extensions/proj4js/lib/projCode/aea.js (rev 0)
+++ trunk/mapbender/http/extensions/proj4js/lib/projCode/aea.js 2009-08-31 13:30:38 UTC (rev 4581)
@@ -0,0 +1,149 @@
+/*******************************************************************************
+NAME ALBERS CONICAL EQUAL AREA
+
+PURPOSE: Transforms input longitude and latitude to Easting and Northing
+ for the Albers Conical Equal Area projection. The longitude
+ and latitude must be in radians. The Easting and Northing
+ values will be returned in meters.
+
+PROGRAMMER DATE
+---------- ----
+T. Mittan, Feb, 1992
+
+ALGORITHM REFERENCES
+
+1. Snyder, John P., "Map Projections--A Working Manual", U.S. Geological
+ Survey Professional Paper 1395 (Supersedes USGS Bulletin 1532), United
+ State Government Printing Office, Washington D.C., 1987.
+
+2. Snyder, John P. and Voxland, Philip M., "An Album of Map Projections",
+ U.S. Geological Survey Professional Paper 1453 , United State Government
+ Printing Office, Washington D.C., 1989.
+*******************************************************************************/
+
+
+Proj4js.Proj.aea = {
+ init : function() {
+
+ if (Math.abs(this.lat1 + this.lat2) < Proj4js.common.EPSLN) {
+ Proj4js.reportError("aeaInitEqualLatitudes");
+ return;
+ }
+ this.temp = this.b / this.a;
+ this.es = 1.0 - Math.pow(this.temp,2);
+ this.e3 = Math.sqrt(this.es);
+
+ this.sin_po=Math.sin(this.lat1);
+ this.cos_po=Math.cos(this.lat1);
+ this.t1=this.sin_po
+ this.con = this.sin_po;
+ this.ms1 = Proj4js.common.msfnz(this.e3,this.sin_po,this.cos_po);
+ this.qs1 = Proj4js.common.qsfnz(this.e3,this.sin_po,this.cos_po);
+
+ this.sin_po=Math.sin(this.lat2);
+ this.cos_po=Math.cos(this.lat2);
+ this.t2=this.sin_po;
+ this.ms2 = Proj4js.common.msfnz(this.e3,this.sin_po,this.cos_po);
+ this.qs2 = Proj4js.common.qsfnz(this.e3,this.sin_po,this.cos_po);
+
+ this.sin_po=Math.sin(this.lat0);
+ this.cos_po=Math.cos(this.lat0);
+ this.t3=this.sin_po;
+ this.qs0 = Proj4js.common.qsfnz(this.e3,this.sin_po,this.cos_po);
+
+ if (Math.abs(this.lat1 - this.lat2) > Proj4js.common.EPSLN) {
+ this.ns0 = (this.ms1 * this.ms1 - this.ms2 *this.ms2)/ (this.qs2 - this.qs1);
+ } else {
+ this.ns0 = this.con;
+ }
+ this.c = this.ms1 * this.ms1 + this.ns0 * this.qs1;
+ this.rh = this.a * Math.sqrt(this.c - this.ns0 * this.qs0)/this.ns0;
+ },
+
+/* Albers Conical Equal Area forward equations--mapping lat,long to x,y
+ -------------------------------------------------------------------*/
+ forward: function(p){
+
+ var lon=p.x;
+ var lat=p.y;
+
+ this.sin_phi=Math.sin(lat);
+ this.cos_phi=Math.cos(lat);
+
+ var qs = Proj4js.common.qsfnz(this.e3,this.sin_phi,this.cos_phi);
+ var rh1 =this.a * Math.sqrt(this.c - this.ns0 * qs)/this.ns0;
+ var theta = this.ns0 * Proj4js.common.adjust_lon(lon - this.long0);
+ var x = rh1 * Math.sin(theta) + this.x0;
+ var y = this.rh - rh1 * Math.cos(theta) + this.y0;
+
+ p.x = x;
+ p.y = y;
+ return p;
+ },
+
+
+ inverse: function(p) {
+ var rh1,qs,con,theta,lon,lat;
+
+ p.x -= this.x0;
+ p.y = this.rh - p.y + this.y0;
+ if (this.ns0 >= 0) {
+ rh1 = Math.sqrt(p.x *p.x + p.y * p.y);
+ con = 1.0;
+ } else {
+ rh1 = -Math.sqrt(p.x * p.x + p.y *p.y);
+ con = -1.0;
+ }
+ theta = 0.0;
+ if (rh1 != 0.0) {
+ theta = Math.atan2(con * p.x, con * p.y);
+ }
+ con = rh1 * this.ns0 / this.a;
+ qs = (this.c - con * con) / this.ns0;
+ if (this.e3 >= 1e-10) {
+ con = 1 - .5 * (1.0 -this.es) * Math.log((1.0 - this.e3) / (1.0 + this.e3))/this.e3;
+ if (Math.abs(Math.abs(con) - Math.abs(qs)) > .0000000001 ) {
+ lat = this.phi1z(this.e3,qs);
+ } else {
+ if (qs >= 0) {
+ lat = .5 * PI;
+ } else {
+ lat = -.5 * PI;
+ }
+ }
+ } else {
+ lat = this.phi1z(e3,qs);
+ }
+
+ lon = Proj4js.common.adjust_lon(theta/this.ns0 + this.long0);
+ p.x = lon;
+ p.y = lat;
+ return p;
+ },
+
+/* Function to compute phi1, the latitude for the inverse of the
+ Albers Conical Equal-Area projection.
+-------------------------------------------*/
+ phi1z: function (eccent,qs) {
+ var con, com, dphi;
+ var phi = Proj4js.common.asinz(.5 * qs);
+ if (eccent < Proj4js.common.EPSLN) return phi;
+
+ var eccnts = eccent * eccent;
+ for (var i = 1; i <= 25; i++) {
+ sinphi = Math.sin(phi);
+ cosphi = Math.cos(phi);
+ con = eccent * sinphi;
+ com = 1.0 - con * con;
+ dphi = .5 * com * com / cosphi * (qs / (1.0 - eccnts) - sinphi / com + .5 / eccent * Math.log((1.0 - con) / (1.0 + con)));
+ phi = phi + dphi;
+ if (Math.abs(dphi) <= 1e-7) return phi;
+ }
+ Proj4js.reportError("aea:phi1z:Convergence error");
+ return null;
+ }
+
+};
+
+
+
Added: trunk/mapbender/http/extensions/proj4js/lib/projCode/aeqd.js
===================================================================
--- trunk/mapbender/http/extensions/proj4js/lib/projCode/aeqd.js (rev 0)
+++ trunk/mapbender/http/extensions/proj4js/lib/projCode/aeqd.js 2009-08-31 13:30:38 UTC (rev 4581)
@@ -0,0 +1,75 @@
+Proj4js.Proj.aeqd = {
+
+ init : function() {
+ this.sin_p12=Math.sin(this.lat0)
+ this.cos_p12=Math.cos(this.lat0)
+ },
+
+ forward: function(p) {
+ var lon=p.x;
+ var lat=p.y;
+ var ksp;
+
+ var sinphi=Math.sin(p.y);
+ var cosphi=Math.cos(p.y);
+ var dlon = Proj4js.common.adjust_lon(lon - this.long0);
+ var coslon = Math.cos(dlon);
+ var g = this.sin_p12 * sinphi + this.cos_p12 * cosphi * coslon;
+ if (Math.abs(Math.abs(g) - 1.0) < Proj4js.common.EPSLN) {
+ ksp = 1.0;
+ if (g < 0.0) {
+ Proj4js.reportError("aeqd:Fwd:PointError");
+ return;
+ }
+ } else {
+ var z = Math.acos(g);
+ ksp = z/Math.sin(z);
+ }
+ p.x = this.x0 + this.a * ksp * cosphi * Math.sin(dlon);
+ p.y = this.y0 + this.a * ksp * (this.cos_p12 * sinphi - this.sin_p12 * cosphi * coslon);
+ return p;
+ },
+
+ inverse: function(p){
+ p.x -= this.x0;
+ p.y -= this.y0;
+
+ var rh = Math.sqrt(p.x * p.x + p.y *p.y);
+ if (rh > (2.0 * Proj4js.common.HALF_PI * this.a)) {
+ Proj4js.reportError("aeqdInvDataError");
+ return;
+ }
+ var z = rh / this.a;
+
+ var sinz=Math.sin(z)
+ var cosz=Math.cos(z)
+
+ var lon = this.long0;
+ var lat;
+ if (Math.abs(rh) <= Proj4js.common.EPSLN) {
+ lat = this.lat0;
+ } else {
+ lat = Proj4js.common.asinz(cosz * this.sin_p12 + (p.y * sinz * this.cos_p12) / rh);
+ var con = Math.abs(this.lat0) - Proj4js.common.HALF_PI;
+ if (Math.abs(con) <= Proj4js.common.EPSLN) {
+ if (lat0 >= 0.0) {
+ lon = Proj4js.common.adjust_lon(this.long0 + Math.atan2(p.x , -p.y));
+ } else {
+ lon = Proj4js.common.adjust_lon(this.long0 - Math.atan2(-p.x , p.y));
+ }
+ } else {
+ con = cosz - this.sin_p12 * Math.sin(lat);
+ if ((Math.abs(con) < Proj4js.common.EPSLN) && (Math.abs(p.x) < Proj4js.common.EPSLN)) {
+ //no-op, just keep the lon value as is
+ } else {
+ var temp = Math.atan2((p.x * sinz * this.cos_p12), (con * rh));
+ lon = Proj4js.common.adjust_lon(this.long0 + Math.atan2((p.x * sinz * this.cos_p12), (con * rh)));
+ }
+ }
+ }
+
+ p.x = lon;
+ p.y = lat;
+ return p;
+ }
+};
Added: trunk/mapbender/http/extensions/proj4js/lib/projCode/eqc.js
===================================================================
--- trunk/mapbender/http/extensions/proj4js/lib/projCode/eqc.js (rev 0)
+++ trunk/mapbender/http/extensions/proj4js/lib/projCode/eqc.js 2009-08-31 13:30:38 UTC (rev 4581)
@@ -0,0 +1,42 @@
+/* similar to equi.js FIXME proj4 uses eqc */
+Proj4js.Proj.eqc = {
+ init : function() {
+
+ if(!this.x0) this.x0=0;
+ if(!this.y0) this.y0=0;
+ if(!this.lat0) this.lat0=0;
+ if(!this.long0) this.long0=0;
+ if(!this.lat_ts) this.lat_ts=0;
+ if (!this.title) this.title = "Equidistant Cylindrical (Plate Carre)";
+
+ this.rc= Math.cos(this.lat_ts);
+ },
+
+
+ // forward equations--mapping lat,long to x,y
+ // -----------------------------------------------------------------
+ forward : function(p) {
+
+ var lon= p.x;
+ var lat= p.y;
+
+ var dlon = Proj4js.common.adjust_lon(lon - this.long0);
+ var dlat = Proj4js.common.adjust_lat(lat - this.lat0 );
+ p.x= this.x0 + (this.a*dlon*this.rc);
+ p.y= this.y0 + (this.a*dlat );
+ return p;
+ },
+
+ // inverse equations--mapping x,y to lat/long
+ // -----------------------------------------------------------------
+ inverse : function(p) {
+
+ var x= p.x;
+ var y= p.y;
+
+ p.x= Proj4js.common.adjust_lon(this.long0 + ((x - this.x0)/(this.a*this.rc)));
+ p.y= Proj4js.common.adjust_lat(this.lat0 + ((y - this.y0)/(this.a )));
+ return p;
+ }
+
+};
Added: trunk/mapbender/http/extensions/proj4js/lib/projCode/eqdc.js
===================================================================
--- trunk/mapbender/http/extensions/proj4js/lib/projCode/eqdc.js (rev 0)
+++ trunk/mapbender/http/extensions/proj4js/lib/projCode/eqdc.js 2009-08-31 13:30:38 UTC (rev 4581)
@@ -0,0 +1,140 @@
+/*******************************************************************************
+NAME EQUIDISTANT CONIC
+
+PURPOSE: Transforms input longitude and latitude to Easting and Northing
+ for the Equidistant Conic projection. The longitude and
+ latitude must be in radians. The Easting and Northing values
+ will be returned in meters.
+
+PROGRAMMER DATE
+---------- ----
+T. Mittan Mar, 1993
+
+ALGORITHM REFERENCES
+
+1. Snyder, John P., "Map Projections--A Working Manual", U.S. Geological
+ Survey Professional Paper 1395 (Supersedes USGS Bulletin 1532), United
+ State Government Printing Office, Washington D.C., 1987.
+
+2. Snyder, John P. and Voxland, Philip M., "An Album of Map Projections",
+ U.S. Geological Survey Professional Paper 1453 , United State Government
+ Printing Office, Washington D.C., 1989.
+*******************************************************************************/
+
+/* Variables common to all subroutines in this code file
+ -----------------------------------------------------*/
+
+Proj4js.Proj.eqdc = {
+
+/* Initialize the Equidistant Conic projection
+ ------------------------------------------*/
+ init: function() {
+
+ /* Place parameters in static storage for common use
+ -------------------------------------------------*/
+
+ if(!this.mode) this.mode=0;//chosen default mode
+ this.temp = this.b / this.a;
+ this.es = 1.0 - Math.pow(this.temp,2);
+ this.e = Math.sqrt(this.es);
+ this.e0 = Proj4js.common.e0fn(this.es);
+ this.e1 = Proj4js.common.e1fn(this.es);
+ this.e2 = Proj4js.common.e2fn(this.es);
+ this.e3 = Proj4js.common.e3fn(this.es);
+
+ this.sinphi=Math.sin(this.lat1);
+ this.cosphi=Math.cos(this.lat1);
+
+ this.ms1 = Proj4js.common.msfnz(this.e,this.sinphi,this.cosphi);
+ this.ml1 = Proj4js.common.mlfn(this.e0, this.e1, this.e2,this.e3, this.lat1);
+
+ /* format B
+ ---------*/
+ if (this.mode != 0) {
+ if (Math.abs(this.lat1 + this.lat2) < Proj4js.common.EPSLN) {
+ Proj4js.reportError("eqdc:Init:EqualLatitudes");
+ //return(81);
+ }
+ this.sinphi=Math.sin(this.lat2);
+ this.cosphi=Math.cos(this.lat2);
+
+ this.ms2 = Proj4js.common.msfnz(this.e,this.sinphi,this.cosphi);
+ this.ml2 = Proj4js.common.mlfn(this.e0, this.e1, this.e2, this.e3, this.lat2);
+ if (Math.abs(this.lat1 - this.lat2) >= Proj4js.common.EPSLN) {
+ this.ns = (this.ms1 - this.ms2) / (this.ml2 - this.ml1);
+ } else {
+ this.ns = this.sinphi;
+ }
+ } else {
+ this.ns = this.sinphi;
+ }
+ this.g = this.ml1 + this.ms1/this.ns;
+ this.ml0 = Proj4js.common.mlfn(this.e0, this.e1,this. e2, this.e3, this.lat0);
+ this.rh = this.a * (this.g - this.ml0);
+ },
+
+
+/* Equidistant Conic forward equations--mapping lat,long to x,y
+ -----------------------------------------------------------*/
+ forward: function(p) {
+ var lon=p.x;
+ var lat=p.y;
+
+ /* Forward equations
+ -----------------*/
+ var ml = Proj4js.common.mlfn(this.e0, this.e1, this.e2, this.e3, lat);
+ var rh1 = this.a * (this.g - ml);
+ var theta = this.ns * Proj4js.common.adjust_lon(lon - this.long0);
+
+ var x = this.x0 + rh1 * Math.sin(theta);
+ var y = this.y0 + this.rh - rh1 * Math.cos(theta);
+ p.x=x;
+ p.y=y;
+ return p;
+ },
+
+/* Inverse equations
+ -----------------*/
+ inverse: function(p) {
+ p.x -= this.x0;
+ p.y = this.rh - p.y + this.y0;
+ var con, rh1;
+ if (this.ns >= 0) {
+ var rh1 = Math.sqrt(p.x *p.x + p.y * p.y);
+ var con = 1.0;
+ } else {
+ rh1 = -Math.sqrt(p.x *p. x +p. y * p.y);
+ con = -1.0;
+ }
+ var theta = 0.0;
+ if (rh1 != 0.0) theta = Math.atan2(con *p.x, con *p.y);
+ var ml = this.g - rh1 /this.a;
+ var lat = this.phi3z(this.ml,this.e0,this.e1,this.e2,this.e3);
+ var lon = Proj4js.common.adjust_lon(this.long0 + theta / this.ns);
+
+ p.x=lon;
+ p.y=lat;
+ return p;
+ },
+
+/* Function to compute latitude, phi3, for the inverse of the Equidistant
+ Conic projection.
+-----------------------------------------------------------------*/
+ phi3z: function(ml,e0,e1,e2,e3) {
+ var phi;
+ var dphi;
+
+ phi = ml;
+ for (var i = 0; i < 15; i++) {
+ dphi = (ml + e1 * Math.sin(2.0 * phi) - e2 * Math.sin(4.0 * phi) + e3 * Math.sin(6.0 * phi))/ e0 - phi;
+ phi += dphi;
+ if (Math.abs(dphi) <= .0000000001) {
+ return phi;
+ }
+ }
+ Proj4js.reportError("PHI3Z-CONV:Latitude failed to converge after 15 iterations");
+ return null;
+ }
+
+
+};
\ No newline at end of file
Added: trunk/mapbender/http/extensions/proj4js/lib/projCode/equi.js
===================================================================
--- trunk/mapbender/http/extensions/proj4js/lib/projCode/equi.js (rev 0)
+++ trunk/mapbender/http/extensions/proj4js/lib/projCode/equi.js 2009-08-31 13:30:38 UTC (rev 4581)
@@ -0,0 +1,72 @@
+/*******************************************************************************
+NAME EQUIRECTANGULAR
+
+PURPOSE: Transforms input longitude and latitude to Easting and
+ Northing for the Equirectangular projection. The
+ longitude and latitude must be in radians. The Easting
+ and Northing values will be returned in meters.
+
+PROGRAMMER DATE
+---------- ----
+T. Mittan Mar, 1993
+
+ALGORITHM REFERENCES
+
+1. Snyder, John P., "Map Projections--A Working Manual", U.S. Geological
+ Survey Professional Paper 1395 (Supersedes USGS Bulletin 1532), United
+ State Government Printing Office, Washington D.C., 1987.
+
+2. Snyder, John P. and Voxland, Philip M., "An Album of Map Projections",
+ U.S. Geological Survey Professional Paper 1453 , United State Government
+ Printing Office, Washington D.C., 1989.
+*******************************************************************************/
+Proj4js.Proj.equi = {
+
+ init: function() {
+ if(!this.x0) this.x0=0;
+ if(!this.y0) this.y0=0;
+ if(!this.lat0) this.lat0=0;
+ if(!this.long0) this.long0=0;
+ ///this.t2;
+ },
+
+
+
+/* Equirectangular forward equations--mapping lat,long to x,y
+ ---------------------------------------------------------*/
+ forward: function(p) {
+
+ var lon=p.x;
+ var lat=p.y;
+
+ var dlon = Proj4js.common.adjust_lon(lon - this.long0);
+ var x = this.x0 +this. a * dlon *Math.cos(this.lat0);
+ var y = this.y0 + this.a * lat;
+
+ this.t1=x;
+ this.t2=Math.cos(this.lat0);
+ p.x=x;
+ p.y=y;
+ return p;
+ }, //equiFwd()
+
+
+
+/* Equirectangular inverse equations--mapping x,y to lat/long
+ ---------------------------------------------------------*/
+ inverse: function(p) {
+
+ p.x -= this.x0;
+ p.y -= this.y0;
+ var lat = p.y /this. a;
+
+ if ( Math.abs(lat) > Proj4js.common.HALF_PI) {
+ Proj4js.reportError("equi:Inv:DataError");
+ }
+ var lon = Proj4js.common.adjust_lon(this.long0 + p.x / (this.a * Math.cos(this.lat0)));
+ p.x=lon;
+ p.y=lat;
+ }//equiInv()
+};
+
+
Added: trunk/mapbender/http/extensions/proj4js/lib/projCode/gauss.js
===================================================================
--- trunk/mapbender/http/extensions/proj4js/lib/projCode/gauss.js (rev 0)
+++ trunk/mapbender/http/extensions/proj4js/lib/projCode/gauss.js 2009-08-31 13:30:38 UTC (rev 4581)
@@ -0,0 +1,44 @@
+
+Proj4js.Proj.gauss = {
+
+ init : function() {
+ sphi = Math.sin(this.lat0);
+ cphi = Math.cos(this.lat0);
+ cphi *= cphi;
+ this.rc = Math.sqrt(1.0 - this.es) / (1.0 - this.es * sphi * sphi);
+ this.C = Math.sqrt(1.0 + this.es * cphi * cphi / (1.0 - this.es));
+ this.phic0 = Math.asin(sphi / this.C);
+ this.ratexp = 0.5 * this.C * this.e;
+ this.K = Math.tan(0.5 * this.phic0 + Proj4js.common.FORTPI) / (Math.pow(Math.tan(0.5*this.lat0 + Proj4js.common.FORTPI), this.C) * Proj4js.common.srat(this.e*sphi, this.ratexp));
+ },
+
+ forward : function(p) {
+ var lon = p.x;
+ var lat = p.y;
+
+ p.y = 2.0 * Math.atan( this.K * Math.pow(Math.tan(0.5 * lat + Proj4js.common.FORTPI), this.C) * Proj4js.common.srat(this.e * Math.sin(lat), this.ratexp) ) - Proj4js.common.HALF_PI;
+ p.x = this.C * lon;
+ return p;
+ },
+
+ inverse : function(p) {
+ var DEL_TOL = 1e-14;
+ var lon = p.x / this.C;
+ var lat = p.y;
+ num = Math.pow(Math.tan(0.5 * lat + Proj4js.common.FORTPI)/this.K, 1./this.C);
+ for (var i = Proj4js.common.MAX_ITER; i>0; --i) {
+ lat = 2.0 * Math.atan(num * Proj4js.common.srat(this.e * Math.sin(p.y), -0.5 * this.e)) - Proj4js.common.HALF_PI;
+ if (Math.abs(lat - p.y) < DEL_TOL) break;
+ p.y = lat;
+ }
+ /* convergence failed */
+ if (!i) {
+ Proj4js.reportError("gauss:inverse:convergence failed");
+ return null;
+ }
+ p.x = lon;
+ p.y = lat;
+ return p;
+ }
+};
+
Added: trunk/mapbender/http/extensions/proj4js/lib/projCode/geocent.js
===================================================================
--- trunk/mapbender/http/extensions/proj4js/lib/projCode/geocent.js (rev 0)
+++ trunk/mapbender/http/extensions/proj4js/lib/projCode/geocent.js 2009-08-31 13:30:38 UTC (rev 4581)
@@ -0,0 +1,264 @@
+/*
+Author: Richard Greenwood rich at greenwoodmap.com
+License: LGPL as per: http://www.gnu.org/copyleft/lesser.html
+*/
+
+/**
+ * convert between geodetic coordinates (longitude, latitude, height)
+ * and gecentric coordinates (X, Y, Z)
+ * ported from Proj 4.9.9 geocent.c
+*/
+
+
+// following constants #define'd in geocent.h
+// var GEOCENT_NO_ERROR = 0x0000;
+var GEOCENT_LAT_ERROR = 0x0001;
+// var GEOCENT_LON_ERROR = 0x0002;
+// var cs.a_ERROR = 0x0004;
+// var cs.b_ERROR = 0x0008;
+// var cs.a_LESS_B_ERROR = 0x0010;
+
+// following constants from geocent.c
+var COS_67P5 = 0.38268343236508977; /* cosine of 67.5 degrees */
+var AD_C = 1.0026000; /* Toms region 1 constant */
+
+function cs_geodetic_to_geocentric (cs, p) {
+
+/*
+ * The function Convert_Geodetic_To_Geocentric converts geodetic coordinates
+ * (latitude, longitude, and height) to geocentric coordinates (X, Y, Z),
+ * according to the current ellipsoid parameters.
+ *
+ * Latitude : Geodetic latitude in radians (input)
+ * Longitude : Geodetic longitude in radians (input)
+ * Height : Geodetic height, in meters (input)
+ * X : Calculated Geocentric X coordinate, in meters (output)
+ * Y : Calculated Geocentric Y coordinate, in meters (output)
+ * Z : Calculated Geocentric Z coordinate, in meters (output)
+ *
+ */
+
+ var Longitude = p.x;
+ var Latitude = p.y;
+ var Height = p.z;
+ var X; // output
+ var Y;
+ var Z;
+
+ var Error_Code=0; // GEOCENT_NO_ERROR;
+ var Rn; /* Earth radius at location */
+ var Sin_Lat; /* Math.sin(Latitude) */
+ var Sin2_Lat; /* Square of Math.sin(Latitude) */
+ var Cos_Lat; /* Math.cos(Latitude) */
+
+ /*
+ ** Don't blow up if Latitude is just a little out of the value
+ ** range as it may just be a rounding issue. Also removed longitude
+ ** test, it should be wrapped by Math.cos() and Math.sin(). NFW for PROJ.4, Sep/2001.
+ */
+ if( Latitude < -HALF_PI && Latitude > -1.001 * HALF_PI )
+ Latitude = -HALF_PI;
+ else if( Latitude > HALF_PI && Latitude < 1.001 * HALF_PI )
+ Latitude = HALF_PI;
+ else if ((Latitude < -HALF_PI) || (Latitude > HALF_PI))
+ { /* Latitude out of range */
+ Error_Code |= GEOCENT_LAT_ERROR;
+ }
+
+ if (!Error_Code)
+ { /* no errors */
+ if (Longitude > PI)
+ Longitude -= (2*PI);
+ Sin_Lat = Math.sin(Latitude);
+ Cos_Lat = Math.cos(Latitude);
+ Sin2_Lat = Sin_Lat * Sin_Lat;
+ Rn = cs.a / (Math.sqrt(1.0e0 - cs.es * Sin2_Lat));
+ X = (Rn + Height) * Cos_Lat * Math.cos(Longitude);
+ Y = (Rn + Height) * Cos_Lat * Math.sin(Longitude);
+ Z = ((Rn * (1 - cs.es)) + Height) * Sin_Lat;
+
+ }
+
+ p.x = X;
+ p.y = Y;
+ p.z = Z;
+ return Error_Code;
+} // cs_geodetic_to_geocentric()
+
+
+/** Convert_Geocentric_To_Geodetic
+ * The method used here is derived from 'An Improved Algorithm for
+ * Geocentric to Geodetic Coordinate Conversion', by Ralph Toms, Feb 1996
+ */
+
+function cs_geocentric_to_geodetic (cs, p) {
+
+ var X =p.x;
+ var Y = p.y;
+ var Z = p.z;
+ var Longitude;
+ var Latitude;
+ var Height;
+
+ var W; /* distance from Z axis */
+ var W2; /* square of distance from Z axis */
+ var T0; /* initial estimate of vertical component */
+ var T1; /* corrected estimate of vertical component */
+ var S0; /* initial estimate of horizontal component */
+ var S1; /* corrected estimate of horizontal component */
+ var Sin_B0; /* Math.sin(B0), B0 is estimate of Bowring aux variable */
+ var Sin3_B0; /* cube of Math.sin(B0) */
+ var Cos_B0; /* Math.cos(B0) */
+ var Sin_p1; /* Math.sin(phi1), phi1 is estimated latitude */
+ var Cos_p1; /* Math.cos(phi1) */
+ var Rn; /* Earth radius at location */
+ var Sum; /* numerator of Math.cos(phi1) */
+ var At_Pole; /* indicates location is in polar region */
+
+ X = parseFloat(X); // cast from string to float
+ Y = parseFloat(Y);
+ Z = parseFloat(Z);
+
+ At_Pole = false;
+ if (X != 0.0)
+ {
+ Longitude = Math.atan2(Y,X);
+ }
+ else
+ {
+ if (Y > 0)
+ {
+ Longitude = HALF_PI;
+ }
+ else if (Y < 0)
+ {
+ Longitude = -HALF_PI;
+ }
+ else
+ {
+ At_Pole = true;
+ Longitude = 0.0;
+ if (Z > 0.0)
+ { /* north pole */
+ Latitude = HALF_PI;
+ }
+ else if (Z < 0.0)
+ { /* south pole */
+ Latitude = -HALF_PI;
+ }
+ else
+ { /* center of earth */
+ Latitude = HALF_PI;
+ Height = -cs.b;
+ return;
+ }
+ }
+ }
+ W2 = X*X + Y*Y;
+ W = Math.sqrt(W2);
+ T0 = Z * AD_C;
+ S0 = Math.sqrt(T0 * T0 + W2);
+ Sin_B0 = T0 / S0;
+ Cos_B0 = W / S0;
+ Sin3_B0 = Sin_B0 * Sin_B0 * Sin_B0;
+ T1 = Z + cs.b * cs.ep2 * Sin3_B0;
+ Sum = W - cs.a * cs.es * Cos_B0 * Cos_B0 * Cos_B0;
+ S1 = Math.sqrt(T1*T1 + Sum * Sum);
+ Sin_p1 = T1 / S1;
+ Cos_p1 = Sum / S1;
+ Rn = cs.a / Math.sqrt(1.0 - cs.es * Sin_p1 * Sin_p1);
+ if (Cos_p1 >= COS_67P5)
+ {
+ Height = W / Cos_p1 - Rn;
+ }
+ else if (Cos_p1 <= -COS_67P5)
+ {
+ Height = W / -Cos_p1 - Rn;
+ }
+ else
+ {
+ Height = Z / Sin_p1 + Rn * (cs.es - 1.0);
+ }
+ if (At_Pole == false)
+ {
+ Latitude = Math.atan(Sin_p1 / Cos_p1);
+ }
+
+ p.x = Longitude;
+ p.y =Latitude;
+ p.z = Height;
+ return 0;
+} // cs_geocentric_to_geodetic()
+
+
+
+/****************************************************************/
+// pj_geocentic_to_wgs84(defn, p )
+// defn = coordinate system definition,
+// p = point to transform in geocentric coordinates (x,y,z)
+function cs_geocentric_to_wgs84( defn, p ) {
+
+ if( defn.datum_type == PJD_3PARAM )
+ {
+ // if( x[io] == HUGE_VAL )
+ // continue;
+ p.x += defn.datum_params[0];
+ p.y += defn.datum_params[1];
+ p.z += defn.datum_params[2];
+
+ }
+ else // if( defn.datum_type == PJD_7PARAM )
+ {
+ var Dx_BF =defn.datum_params[0];
+ var Dy_BF =defn.datum_params[1];
+ var Dz_BF =defn.datum_params[2];
+ var Rx_BF =defn.datum_params[3];
+ var Ry_BF =defn.datum_params[4];
+ var Rz_BF =defn.datum_params[5];
+ var M_BF =defn.datum_params[6];
+ // if( x[io] == HUGE_VAL )
+ // continue;
+ var x_out = M_BF*( p.x - Rz_BF*p.y + Ry_BF*p.z) + Dx_BF;
+ var y_out = M_BF*( Rz_BF*p.x + p.y - Rx_BF*p.z) + Dy_BF;
+ var z_out = M_BF*(-Ry_BF*p.x + Rx_BF*p.y + p.z) + Dz_BF;
+ p.x = x_out;
+ p.y = y_out;
+ p.z = z_out;
+ }
+} // cs_geocentric_to_wgs84
+
+/****************************************************************/
+// pj_geocentic_from_wgs84()
+// coordinate system definition,
+// point to transform in geocentric coordinates (x,y,z)
+function cs_geocentric_from_wgs84( defn, p ) {
+
+ if( defn.datum_type == PJD_3PARAM )
+ {
+ //if( x[io] == HUGE_VAL )
+ // continue;
+ p.x -= defn.datum_params[0];
+ p.y -= defn.datum_params[1];
+ p.z -= defn.datum_params[2];
+
+ }
+ else // if( defn.datum_type == PJD_7PARAM )
+ {
+ var Dx_BF =defn.datum_params[0];
+ var Dy_BF =defn.datum_params[1];
+ var Dz_BF =defn.datum_params[2];
+ var Rx_BF =defn.datum_params[3];
+ var Ry_BF =defn.datum_params[4];
+ var Rz_BF =defn.datum_params[5];
+ var M_BF =defn.datum_params[6];
+ var x_tmp = (p.x - Dx_BF) / M_BF;
+ var y_tmp = (p.y - Dy_BF) / M_BF;
+ var z_tmp = (p.z - Dz_BF) / M_BF;
+ //if( x[io] == HUGE_VAL )
+ // continue;
+
+ p.x = x_tmp + Rz_BF*y_tmp - Ry_BF*z_tmp;
+ p.y = -Rz_BF*x_tmp + y_tmp + Rx_BF*z_tmp;
+ p.z = Ry_BF*x_tmp - Rx_BF*y_tmp + z_tmp;
+ }
+} //cs_geocentric_from_wgs84()
\ No newline at end of file
Added: trunk/mapbender/http/extensions/proj4js/lib/projCode/gstmerc.js
===================================================================
--- trunk/mapbender/http/extensions/proj4js/lib/projCode/gstmerc.js (rev 0)
+++ trunk/mapbender/http/extensions/proj4js/lib/projCode/gstmerc.js 2009-08-31 13:30:38 UTC (rev 4581)
@@ -0,0 +1,52 @@
+Proj4js.Proj.gstmerc = {
+ init : function() {
+
+ // array of: a, b, lon0, lat0, k0, x0, y0
+ var temp= this.b / this.a;
+ this.e= Math.sqrt(1.0 - temp*temp);
+ this.lc= this.long0;
+ this.rs= Math.sqrt(1.0+this.e*this.e*Math.pow(Math.cos(this.lat0),4.0)/(1.0-this.e*this.e));
+ var sinz= Math.sin(this.lat0);
+ var pc= Math.asin(sinz/this.rs);
+ var sinzpc= Math.sin(pc);
+ this.cp= Proj4js.common.latiso(0.0,pc,sinzpc)-this.rs*Proj4js.common.latiso(this.e,this.lat0,sinz);
+ this.n2= this.k0*this.a*Math.sqrt(1.0-this.e*this.e)/(1.0-this.e*this.e*sinz*sinz);
+ this.xs= this.x0;
+ this.ys= this.y0-this.n2*pc;
+
+ if (!this.title) this.title = "Gauss Schreiber transverse mercator";
+ },
+
+
+ // forward equations--mapping lat,long to x,y
+ // -----------------------------------------------------------------
+ forward : function(p) {
+
+ var lon= p.x;
+ var lat= p.y;
+
+ var L= this.rs*(lon-this.lc);
+ var Ls= this.cp+(this.rs*Proj4js.common.latiso(this.e,lat,Math.sin(lat)));
+ var lat1= Math.asin(Math.sin(L)/Proj4js.common.cosh(Ls));
+ var Ls1= Proj4js.common.latiso(0.0,lat1,Math.sin(lat1));
+ p.x= this.xs+(this.n2*Ls1);
+ p.y= this.ys+(this.n2*Math.atan(Proj4js.common.sinh(Ls)/Math.cos(L)));
+ return p;
+ },
+
+ // inverse equations--mapping x,y to lat/long
+ // -----------------------------------------------------------------
+ inverse : function(p) {
+
+ var x= p.x;
+ var y= p.y;
+
+ var L= Math.atan(Proj4js.common.sinh((x-this.xs)/this.n2)/Math.cos((y-this.ys)/this.n2));
+ var lat1= Math.asin(Math.sin((y-this.ys)/this.n2)/Proj4js.common.cosh((x-this.xs)/this.n2));
+ var LC= Proj4js.common.latiso(0.0,lat1,Math.sin(lat1));
+ p.x= this.lc+L/this.rs;
+ p.y= Proj4js.common.invlatiso(this.e,(LC-this.cp)/this.rs);
+ return p;
+ }
+
+};
Added: trunk/mapbender/http/extensions/proj4js/lib/projCode/laea.js
===================================================================
--- trunk/mapbender/http/extensions/proj4js/lib/projCode/laea.js (rev 0)
+++ trunk/mapbender/http/extensions/proj4js/lib/projCode/laea.js 2009-08-31 13:30:38 UTC (rev 4581)
@@ -0,0 +1,111 @@
+/*******************************************************************************
+NAME LAMBERT AZIMUTHAL EQUAL-AREA
+
+PURPOSE: Transforms input longitude and latitude to Easting and
+ Northing for the Lambert Azimuthal Equal-Area projection. The
+ longitude and latitude must be in radians. The Easting
+ and Northing values will be returned in meters.
+
+PROGRAMMER DATE
+---------- ----
+D. Steinwand, EROS March, 1991
+
+This function was adapted from the Lambert Azimuthal Equal Area projection
+code (FORTRAN) in the General Cartographic Transformation Package software
+which is available from the U.S. Geological Survey National Mapping Division.
+
+ALGORITHM REFERENCES
+
+1. "New Equal-Area Map Projections for Noncircular Regions", John P. Snyder,
+ The American Cartographer, Vol 15, No. 4, October 1988, pp. 341-355.
+
+2. Snyder, John P., "Map Projections--A Working Manual", U.S. Geological
+ Survey Professional Paper 1395 (Supersedes USGS Bulletin 1532), United
+ State Government Printing Office, Washington D.C., 1987.
+
+3. "Software Documentation for GCTP General Cartographic Transformation
+ Package", U.S. Geological Survey National Mapping Division, May 1982.
+*******************************************************************************/
+
+Proj4js.Proj.laea = {
+
+
+/* Initialize the Lambert Azimuthal Equal Area projection
+ ------------------------------------------------------*/
+ init: function() {
+ this.sin_lat_o=Math.sin(this.lat0);
+ this.cos_lat_o=Math.cos(this.lat0);
+ },
+
+/* Lambert Azimuthal Equal Area forward equations--mapping lat,long to x,y
+ -----------------------------------------------------------------------*/
+ forward: function(p) {
+
+ /* Forward equations
+ -----------------*/
+ var lon=p.x;
+ var lat=p.y;
+ var delta_lon = Proj4js.common.adjust_lon(lon - this.long0);
+
+ //v 1.0
+ var sin_lat=Math.sin(lat);
+ var cos_lat=Math.cos(lat);
+
+ var sin_delta_lon=Math.sin(delta_lon);
+ var cos_delta_lon=Math.cos(delta_lon);
+
+ var g =this.sin_lat_o * sin_lat +this.cos_lat_o * cos_lat * cos_delta_lon;
+ if (g == -1.0) {
+ Proj4js.reportError("laea:fwd:Point projects to a circle of radius "+ 2.0 * R);
+ return null;
+ }
+ var ksp = this.a * Math.sqrt(2.0 / (1.0 + g));
+ var x = ksp * cos_lat * sin_delta_lon + this.x0;
+ var y = ksp * (this.cos_lat_o * sin_lat - this.sin_lat_o * cos_lat * cos_delta_lon) + this.y0;
+ p.x = x;
+ p.y = y
+ return p;
+ },//lamazFwd()
+
+/* Inverse equations
+ -----------------*/
+ inverse: function(p) {
+ p.x -= this.x0;
+ p.y -= this.y0;
+
+ var Rh = Math.sqrt(p.x *p.x +p.y * p.y);
+ var temp = Rh / (2.0 * this.a);
+
+ if (temp > 1) {
+ Proj4js.reportError("laea:Inv:DataError");
+ return null;
+ }
+
+ var z = 2.0 * Proj4js.common.asinz(temp);
+ var sin_z=Math.sin(z);
+ var cos_z=Math.cos(z);
+
+ var lon =this.long0;
+ if (Math.abs(Rh) > Proj4js.common.EPSLN) {
+ var lat = Proj4js.common.asinz(this.sin_lat_o * cos_z +this. cos_lat_o * sin_z *p.y / Rh);
+ var temp =Math.abs(this.lat0) - Proj4js.common.HALF_PI;
+ if (Math.abs(temp) > Proj4js.common.EPSLN) {
+ temp = cos_z -this.sin_lat_o * Math.sin(lat);
+ if(temp!=0.0) lon=Proj4js.common.adjust_lon(this.long0+Math.atan2(p.x*sin_z*this.cos_lat_o,temp*Rh));
+ } else if (this.lat0 < 0.0) {
+ lon = Proj4js.common.adjust_lon(this.long0 - Math.atan2(-p.x,p.y));
+ } else {
+ lon = Proj4js.common.adjust_lon(this.long0 + Math.atan2(p.x, -p.y));
+ }
+ } else {
+ lat = this.lat0;
+ }
+ //return(OK);
+ p.x = lon;
+ p.y = lat;
+ return p;
+ }//lamazInv()
+};
+
+
+
Added: trunk/mapbender/http/extensions/proj4js/lib/projCode/lcc.js
===================================================================
--- trunk/mapbender/http/extensions/proj4js/lib/projCode/lcc.js (rev 0)
+++ trunk/mapbender/http/extensions/proj4js/lib/projCode/lcc.js 2009-08-31 13:30:38 UTC (rev 4581)
@@ -0,0 +1,148 @@
+/*******************************************************************************
+NAME LAMBERT CONFORMAL CONIC
+
+PURPOSE: Transforms input longitude and latitude to Easting and
+ Northing for the Lambert Conformal Conic projection. The
+ longitude and latitude must be in radians. The Easting
+ and Northing values will be returned in meters.
+
+
+ALGORITHM REFERENCES
+
+1. Snyder, John P., "Map Projections--A Working Manual", U.S. Geological
+ Survey Professional Paper 1395 (Supersedes USGS Bulletin 1532), United
+ State Government Printing Office, Washington D.C., 1987.
+
+2. Snyder, John P. and Voxland, Philip M., "An Album of Map Projections",
+ U.S. Geological Survey Professional Paper 1453 , United State Government
+*******************************************************************************/
+
+
+//<2104> +proj=lcc +lat_1=10.16666666666667 +lat_0=10.16666666666667 +lon_0=-71.60561777777777 +k_0=1 +x0=-17044 +x0=-23139.97 +ellps=intl +units=m +no_defs no_defs
+
+// Initialize the Lambert Conformal conic projection
+// -----------------------------------------------------------------
+
+//Proj4js.Proj.lcc = Class.create();
+Proj4js.Proj.lcc = {
+ init : function() {
+
+ // array of: r_maj,r_min,lat1,lat2,c_lon,c_lat,false_east,false_north
+ //double c_lat; /* center latitude */
+ //double c_lon; /* center longitude */
+ //double lat1; /* first standard parallel */
+ //double lat2; /* second standard parallel */
+ //double r_maj; /* major axis */
+ //double r_min; /* minor axis */
+ //double false_east; /* x offset in meters */
+ //double false_north; /* y offset in meters */
+
+ if (!this.lat2){this.lat2=this.lat0;}//if lat2 is not defined
+ if (!this.k0) this.k0 = 1.0;
+
+ // Standard Parallels cannot be equal and on opposite sides of the equator
+ if (Math.abs(this.lat1+this.lat2) < Proj4js.common.EPSLN) {
+ Proj4js.reportError("lcc:init: Equal Latitudes");
+ return;
+ }
+
+ var temp = this.b / this.a;
+ this.e = Math.sqrt(1.0 - temp*temp);
+
+ var sin1 = Math.sin(this.lat1);
+ var cos1 = Math.cos(this.lat1);
+ var ms1 = Proj4js.common.msfnz(this.e, sin1, cos1);
+ var ts1 = Proj4js.common.tsfnz(this.e, this.lat1, sin1);
+
+ var sin2 = Math.sin(this.lat2);
+ var cos2 = Math.cos(this.lat2);
+ var ms2 = Proj4js.common.msfnz(this.e, sin2, cos2);
+ var ts2 = Proj4js.common.tsfnz(this.e, this.lat2, sin2);
+
+ var ts0 = Proj4js.common.tsfnz(this.e, this.lat0, Math.sin(this.lat0));
+
+ if (Math.abs(this.lat1 - this.lat2) > Proj4js.common.EPSLN) {
+ this.ns = Math.log(ms1/ms2)/Math.log(ts1/ts2);
+ } else {
+ this.ns = sin1;
+ }
+ this.f0 = ms1 / (this.ns * Math.pow(ts1, this.ns));
+ this.rh = this.a * this.f0 * Math.pow(ts0, this.ns);
+ if (!this.title) this.title = "Lambert Conformal Conic";
+ },
+
+
+ // Lambert Conformal conic forward equations--mapping lat,long to x,y
+ // -----------------------------------------------------------------
+ forward : function(p) {
+
+ var lon = p.x;
+ var lat = p.y;
+
+ // convert to radians
+ if ( lat <= 90.0 && lat >= -90.0 && lon <= 180.0 && lon >= -180.0) {
+ //lon = lon * Proj4js.common.D2R;
+ //lat = lat * Proj4js.common.D2R;
+ } else {
+ Proj4js.reportError("lcc:forward: llInputOutOfRange: "+ lon +" : " + lat);
+ return null;
+ }
+
+ var con = Math.abs( Math.abs(lat) - Proj4js.common.HALF_PI);
+ var ts;
+ if (con > Proj4js.common.EPSLN) {
+ ts = Proj4js.common.tsfnz(this.e, lat, Math.sin(lat) );
+ rh1 = this.a * this.f0 * Math.pow(ts, this.ns);
+ } else {
+ con = lat * this.ns;
+ if (con <= 0) {
+ Proj4js.reportError("lcc:forward: No Projection");
+ return null;
+ }
+ rh1 = 0;
+ }
+ var theta = this.ns * Proj4js.common.adjust_lon(lon - this.long0);
+ p.x = this.k0 * (rh1 * Math.sin(theta)) + this.x0;
+ p.y = this.k0 * (this.rh - rh1 * Math.cos(theta)) + this.y0;
+
+ return p;
+ },
+
+ // Lambert Conformal Conic inverse equations--mapping x,y to lat/long
+ // -----------------------------------------------------------------
+ inverse : function(p) {
+
+ var rh1, con, ts;
+ var lat, lon;
+ x = (p.x - this.x0)/this.k0;
+ y = (this.rh - (p.y - this.y0)/this.k0);
+ if (this.ns > 0) {
+ rh1 = Math.sqrt (x * x + y * y);
+ con = 1.0;
+ } else {
+ rh1 = -Math.sqrt (x * x + y * y);
+ con = -1.0;
+ }
+ var theta = 0.0;
+ if (rh1 != 0) {
+ theta = Math.atan2((con * x),(con * y));
+ }
+ if ((rh1 != 0) || (this.ns > 0.0)) {
+ con = 1.0/this.ns;
+ ts = Math.pow((rh1/(this.a * this.f0)), con);
+ lat = Proj4js.common.phi2z(this.e, ts);
+ if (lat == -9999) return null;
+ } else {
+ lat = -Proj4js.common.HALF_PI;
+ }
+ lon = Proj4js.common.adjust_lon(theta/this.ns + this.long0);
+
+ p.x = lon;
+ p.y = lat;
+ return p;
+ }
+};
+
+
+
+
Added: trunk/mapbender/http/extensions/proj4js/lib/projCode/merc.js
===================================================================
--- trunk/mapbender/http/extensions/proj4js/lib/projCode/merc.js (rev 0)
+++ trunk/mapbender/http/extensions/proj4js/lib/projCode/merc.js 2009-08-31 13:30:38 UTC (rev 4581)
@@ -0,0 +1,115 @@
+/*******************************************************************************
+NAME MERCATOR
+
+PURPOSE: Transforms input longitude and latitude to Easting and
+ Northing for the Mercator projection. The
+ longitude and latitude must be in radians. The Easting
+ and Northing values will be returned in meters.
+
+PROGRAMMER DATE
+---------- ----
+D. Steinwand, EROS Nov, 1991
+T. Mittan Mar, 1993
+
+ALGORITHM REFERENCES
+
+1. Snyder, John P., "Map Projections--A Working Manual", U.S. Geological
+ Survey Professional Paper 1395 (Supersedes USGS Bulletin 1532), United
+ State Government Printing Office, Washington D.C., 1987.
+
+2. Snyder, John P. and Voxland, Philip M., "An Album of Map Projections",
+ U.S. Geological Survey Professional Paper 1453 , United State Government
+ Printing Office, Washington D.C., 1989.
+*******************************************************************************/
+
+//static double r_major = a; /* major axis */
+//static double r_minor = b; /* minor axis */
+//static double lon_center = long0; /* Center longitude (projection center) */
+//static double lat_origin = lat0; /* center latitude */
+//static double e,es; /* eccentricity constants */
+//static double m1; /* small value m */
+//static double false_northing = y0; /* y offset in meters */
+//static double false_easting = x0; /* x offset in meters */
+//scale_fact = k0
+
+Proj4js.Proj.merc = {
+ init : function() {
+ //?this.temp = this.r_minor / this.r_major;
+ //this.temp = this.b / this.a;
+ //this.es = 1.0 - Math.sqrt(this.temp);
+ //this.e = Math.sqrt( this.es );
+ //?this.m1 = Math.cos(this.lat_origin) / (Math.sqrt( 1.0 - this.es * Math.sin(this.lat_origin) * Math.sin(this.lat_origin)));
+ //this.m1 = Math.cos(0.0) / (Math.sqrt( 1.0 - this.es * Math.sin(0.0) * Math.sin(0.0)));
+ if (this.lat_ts) {
+ if (this.sphere) {
+ this.k0 = Math.cos(this.lat_ts);
+ } else {
+ this.k0 = Proj4js.common.msfnz(this.es, Math.sin(this.lat_ts), Math.cos(this.lat_ts));
+ }
+ }
+ },
+
+/* Mercator forward equations--mapping lat,long to x,y
+ --------------------------------------------------*/
+
+ forward : function(p) {
+ //alert("ll2m coords : "+coords);
+ var lon = p.x;
+ var lat = p.y;
+ // convert to radians
+ if ( lat*Proj4js.common.R2D > 90.0 &&
+ lat*Proj4js.common.R2D < -90.0 &&
+ lon*Proj4js.common.R2D > 180.0 &&
+ lon*Proj4js.common.R2D < -180.0) {
+ Proj4js.reportError("merc:forward: llInputOutOfRange: "+ lon +" : " + lat);
+ return null;
+ }
+
+ var x,y;
+ if(Math.abs( Math.abs(lat) - Proj4js.common.HALF_PI) <= Proj4js.common.EPSLN) {
+ Proj4js.reportError("merc:forward: ll2mAtPoles");
+ return null;
+ } else {
+ if (this.sphere) {
+ x = this.x0 + this.a * this.k0 * Proj4js.common.adjust_lon(lon - this.long0);
+ y = this.y0 + this.a * this.k0 * Math.log(Math.tan(Proj4js.common.FORTPI + 0.5*lat));
+ } else {
+ var sinphi = Math.sin(lat);
+ var ts = Proj4js.common.tsfnz(this.e,lat,sinphi);
+ x = this.x0 + this.a * this.k0 * Proj4js.common.adjust_lon(lon - this.long0);
+ y = this.y0 - this.a * this.k0 * Math.log(ts);
+ }
+ p.x = x;
+ p.y = y;
+ return p;
+ }
+ },
+
+
+ /* Mercator inverse equations--mapping x,y to lat/long
+ --------------------------------------------------*/
+ inverse : function(p) {
+
+ var x = p.x - this.x0;
+ var y = p.y - this.y0;
+ var lon,lat;
+
+ if (this.sphere) {
+ lat = Proj4js.common.HALF_PI - 2.0 * Math.atan(Math.exp(-y / this.a * this.k0));
+ } else {
+ var ts = Math.exp(-y / (this.a * this.k0));
+ lat = Proj4js.common.phi2z(this.e,ts);
+ if(lat == -9999) {
+ Proj4js.reportError("merc:inverse: lat = -9999");
+ return null;
+ }
+ }
+ lon = Proj4js.common.adjust_lon(this.long0+ x / (this.a * this.k0));
+
+ p.x = lon;
+ p.y = lat;
+ return p;
+ }
+};
+
+
Added: trunk/mapbender/http/extensions/proj4js/lib/projCode/mill.js
===================================================================
--- trunk/mapbender/http/extensions/proj4js/lib/projCode/mill.js (rev 0)
+++ trunk/mapbender/http/extensions/proj4js/lib/projCode/mill.js 2009-08-31 13:30:38 UTC (rev 4581)
@@ -0,0 +1,68 @@
+/*******************************************************************************
+NAME MILLER CYLINDRICAL
+
+PURPOSE: Transforms input longitude and latitude to Easting and
+ Northing for the Miller Cylindrical projection. The
+ longitude and latitude must be in radians. The Easting
+ and Northing values will be returned in meters.
+
+PROGRAMMER DATE
+---------- ----
+T. Mittan March, 1993
+
+This function was adapted from the Lambert Azimuthal Equal Area projection
+code (FORTRAN) in the General Cartographic Transformation Package software
+which is available from the U.S. Geological Survey National Mapping Division.
+
+ALGORITHM REFERENCES
+
+1. "New Equal-Area Map Projections for Noncircular Regions", John P. Snyder,
+ The American Cartographer, Vol 15, No. 4, October 1988, pp. 341-355.
+
+2. Snyder, John P., "Map Projections--A Working Manual", U.S. Geological
+ Survey Professional Paper 1395 (Supersedes USGS Bulletin 1532), United
+ State Government Printing Office, Washington D.C., 1987.
+
+3. "Software Documentation for GCTP General Cartographic Transformation
+ Package", U.S. Geological Survey National Mapping Division, May 1982.
+*******************************************************************************/
+
+Proj4js.Proj.mill = {
+
+/* Initialize the Miller Cylindrical projection
+ -------------------------------------------*/
+ init: function() {
+ //no-op
+ },
+
+
+ /* Miller Cylindrical forward equations--mapping lat,long to x,y
+ ------------------------------------------------------------*/
+ forward: function(p) {
+ var lon=p.x;
+ var lat=p.y;
+ /* Forward equations
+ -----------------*/
+ dlon = Proj4js.common.adjust_lon(lon -this.long0);
+ var x = this.x0 + this.a * dlon;
+ var y = this.y0 + this.a * Math.log(Math.tan((Proj4js.common.PI / 4.0) + (lat / 2.5))) * 1.25;
+
+ p.x=x;
+ p.y=y;
+ return p;
+ },//millFwd()
+
+ /* Miller Cylindrical inverse equations--mapping x,y to lat/long
+ ------------------------------------------------------------*/
+ inverse: function(p) {
+ p.x -= this.x0;
+ p.y -= this.y0;
+
+ var lon = Proj4js.common.adjust_lon(this.long0 + p.x /this.a);
+ var lat = 2.5 * (Math.atan(Math.exp(0.8*p.y/this.a)) - Proj4js.common.PI / 4.0);
+
+ p.x=lon;
+ p.y=lat;
+ return p;
+ }//millInv()
+};
Added: trunk/mapbender/http/extensions/proj4js/lib/projCode/moll.js
===================================================================
--- trunk/mapbender/http/extensions/proj4js/lib/projCode/moll.js (rev 0)
+++ trunk/mapbender/http/extensions/proj4js/lib/projCode/moll.js 2009-08-31 13:30:38 UTC (rev 4581)
@@ -0,0 +1,100 @@
+/*******************************************************************************
+NAME MOLLWEIDE
+
+PURPOSE: Transforms input longitude and latitude to Easting and
+ Northing for the MOllweide projection. The
+ longitude and latitude must be in radians. The Easting
+ and Northing values will be returned in meters.
+
+PROGRAMMER DATE
+---------- ----
+D. Steinwand, EROS May, 1991; Updated Sept, 1992; Updated Feb, 1993
+S. Nelson, EDC Jun, 2993; Made corrections in precision and
+ number of iterations.
+
+ALGORITHM REFERENCES
+
+1. Snyder, John P. and Voxland, Philip M., "An Album of Map Projections",
+ U.S. Geological Survey Professional Paper 1453 , United State Government
+ Printing Office, Washington D.C., 1989.
+
+2. Snyder, John P., "Map Projections--A Working Manual", U.S. Geological
+ Survey Professional Paper 1395 (Supersedes USGS Bulletin 1532), United
+ State Government Printing Office, Washington D.C., 1987.
+*******************************************************************************/
+
+Proj4js.Proj.moll = {
+
+ /* Initialize the Mollweide projection
+ ------------------------------------*/
+ init: function(){
+ //no-op
+ },
+
+ /* Mollweide forward equations--mapping lat,long to x,y
+ ----------------------------------------------------*/
+ forward: function(p) {
+
+ /* Forward equations
+ -----------------*/
+ var lon=p.x;
+ var lat=p.y;
+
+ var delta_lon = Proj4js.common.adjust_lon(lon - this.long0);
+ var theta = lat;
+ var con = Proj4js.common.PI * Math.sin(lat);
+
+ /* Iterate using the Newton-Raphson method to find theta
+ -----------------------------------------------------*/
+ for (var i=0;;i++) {
+ var delta_theta = -(theta + Math.sin(theta) - con)/ (1.0 + Math.cos(theta));
+ theta += delta_theta;
+ if (Math.abs(delta_theta) < Proj4js.common.EPSLN) break;
+ if (i >= 50) {
+ Proj4js.reportError("moll:Fwd:IterationError");
+ //return(241);
+ }
+ }
+ theta /= 2.0;
+
+ /* If the latitude is 90 deg, force the x coordinate to be "0 + false easting"
+ this is done here because of precision problems with "cos(theta)"
+ --------------------------------------------------------------------------*/
+ if (Proj4js.common.PI/2 - Math.abs(lat) < Proj4js.common.EPSLN) delta_lon =0;
+ var x = 0.900316316158 * this.a * delta_lon * Math.cos(theta) + this.x0;
+ var y = 1.4142135623731 * this.a * Math.sin(theta) + this.y0;
+
+ p.x=x;
+ p.y=y;
+ return p;
+ },
+
+ inverse: function(p){
+ var theta;
+ var arg;
+
+ /* Inverse equations
+ -----------------*/
+ p.x-= this.x0;
+ //~ p.y -= this.y0;
+ var arg = p.y / (1.4142135623731 * this.a);
+
+ /* Because of division by zero problems, 'arg' can not be 1.0. Therefore
+ a number very close to one is used instead.
+ -------------------------------------------------------------------*/
+ if(Math.abs(arg) > 0.999999999999) arg=0.999999999999;
+ var theta =Math.asin(arg);
+ var lon = Proj4js.common.adjust_lon(this.long0 + (p.x / (0.900316316158 * this.a * Math.cos(theta))));
+ if(lon < (-Proj4js.common.PI)) lon= -Proj4js.common.PI;
+ if(lon > Proj4js.common.PI) lon= Proj4js.common.PI;
+ arg = (2.0 * theta + Math.sin(2.0 * theta)) / Proj4js.common.PI;
+ if(Math.abs(arg) > 1.0)arg=1.0;
+ var lat = Math.asin(arg);
+ //return(OK);
+
+ p.x=lon;
+ p.y=lat;
+ return p;
+ }
+};
+
Added: trunk/mapbender/http/extensions/proj4js/lib/projCode/nzmg.js
===================================================================
--- trunk/mapbender/http/extensions/proj4js/lib/projCode/nzmg.js (rev 0)
+++ trunk/mapbender/http/extensions/proj4js/lib/projCode/nzmg.js 2009-08-31 13:30:38 UTC (rev 4581)
@@ -0,0 +1,286 @@
+/*******************************************************************************
+NAME NEW ZEALAND MAP GRID
+
+PURPOSE: Transforms input longitude and latitude to Easting and
+ Northing for the New Zealand Map Grid projection. The
+ longitude and latitude must be in radians. The Easting
+ and Northing values will be returned in meters.
+
+
+ALGORITHM REFERENCES
+
+1. Department of Land and Survey Technical Circular 1973/32
+ http://www.linz.govt.nz/docs/miscellaneous/nz-map-definition.pdf
+
+2. OSG Technical Report 4.1
+ http://www.linz.govt.nz/docs/miscellaneous/nzmg.pdf
+
+
+IMPLEMENTATION NOTES
+
+The two references use different symbols for the calculated values. This
+implementation uses the variable names similar to the symbols in reference [1].
+
+The alogrithm uses different units for delta latitude and delta longitude.
+The delta latitude is assumed to be in units of seconds of arc x 10^-5.
+The delta longitude is the usual radians. Look out for these conversions.
+
+The algorithm is described using complex arithmetic. There were three
+options:
+ * find and use a Javascript library for complex arithmetic
+ * write my own complex library
+ * expand the complex arithmetic by hand to simple arithmetic
+
+This implementation has expanded the complex multiplication operations
+into parallel simple arithmetic operations for the real and imaginary parts.
+The imaginary part is way over to the right of the display; this probably
+violates every coding standard in the world, but, to me, it makes it much
+more obvious what is going on.
+
+The following complex operations are used:
+ - addition
+ - multiplication
+ - division
+ - complex number raised to integer power
+ - summation
+
+A summary of complex arithmetic operations:
+ (from http://en.wikipedia.org/wiki/Complex_arithmetic)
+ addition: (a + bi) + (c + di) = (a + c) + (b + d)i
+ subtraction: (a + bi) - (c + di) = (a - c) + (b - d)i
+ multiplication: (a + bi) x (c + di) = (ac - bd) + (bc + ad)i
+ division: (a + bi) / (c + di) = [(ac + bd)/(cc + dd)] + [(bc - ad)/(cc + dd)]i
+
+The algorithm needs to calculate summations of simple and complex numbers. This is
+implemented using a for-loop, pre-loading the summed value to zero.
+
+The algorithm needs to calculate theta^2, theta^3, etc while doing a summation.
+There are three possible implementations:
+ - use Math.pow in the summation loop - except for complex numbers
+ - precalculate the values before running the loop
+ - calculate theta^n = theta^(n-1) * theta during the loop
+This implementation uses the third option for both real and complex arithmetic.
+
+For example
+ psi_n = 1;
+ sum = 0;
+ for (n = 1; n <=6; n++) {
+ psi_n1 = psi_n * psi; // calculate psi^(n+1)
+ psi_n = psi_n1;
+ sum = sum + A[n] * psi_n;
+ }
+
+
+TEST VECTORS
+
+NZMG E, N: 2487100.638 6751049.719 metres
+NZGD49 long, lat: 172.739194 -34.444066 degrees
+
+NZMG E, N: 2486533.395 6077263.661 metres
+NZGD49 long, lat: 172.723106 -40.512409 degrees
+
+NZMG E, N: 2216746.425 5388508.765 metres
+NZGD49 long, lat: 169.172062 -46.651295 degrees
+
+Note that these test vectors convert from NZMG metres to lat/long referenced
+to NZGD49, not the more usual WGS84. The difference is about 70m N/S and about
+10m E/W.
+
+These test vectors are provided in reference [1]. Many more test
+vectors are available in
+ http://www.linz.govt.nz/docs/topography/topographicdata/placenamesdatabase/nznamesmar08.zip
+which is a catalog of names on the 260-series maps.
+
+
+EPSG CODES
+
+NZMG EPSG:27200
+NZGD49 EPSG:4272
+
+http://spatialreference.org/ defines these as
+ Proj4js.defs["EPSG:4272"] = "+proj=longlat +ellps=intl +datum=nzgd49 +no_defs ";
+ Proj4js.defs["EPSG:27200"] = "+proj=nzmg +lat_0=-41 +lon_0=173 +x_0=2510000 +y_0=6023150 +ellps=intl +datum=nzgd49 +units=m +no_defs ";
+
+
+LICENSE
+ Copyright: Stephen Irons 2008
+ Released under terms of the LGPL as per: http://www.gnu.org/copyleft/lesser.html
+
+*******************************************************************************/
+
+
+/**
+ Initialize New Zealand Map Grip projection
+*/
+
+Proj4js.Proj.nzmg = {
+
+ /**
+ * iterations: Number of iterations to refine inverse transform.
+ * 0 -> km accuracy
+ * 1 -> m accuracy -- suitable for most mapping applications
+ * 2 -> mm accuracy
+ */
+ iterations: 1,
+
+ init : function() {
+ this.A = new Array();
+ this.A[1] = +0.6399175073;
+ this.A[2] = -0.1358797613;
+ this.A[3] = +0.063294409;
+ this.A[4] = -0.02526853;
+ this.A[5] = +0.0117879;
+ this.A[6] = -0.0055161;
+ this.A[7] = +0.0026906;
+ this.A[8] = -0.001333;
+ this.A[9] = +0.00067;
+ this.A[10] = -0.00034;
+
+ this.B_re = new Array(); this.B_im = new Array();
+ this.B_re[1] = +0.7557853228; this.B_im[1] = 0.0;
+ this.B_re[2] = +0.249204646; this.B_im[2] = +0.003371507;
+ this.B_re[3] = -0.001541739; this.B_im[3] = +0.041058560;
+ this.B_re[4] = -0.10162907; this.B_im[4] = +0.01727609;
+ this.B_re[5] = -0.26623489; this.B_im[5] = -0.36249218;
+ this.B_re[6] = -0.6870983; this.B_im[6] = -1.1651967;
+
+ this.C_re = new Array(); this.C_im = new Array();
+ this.C_re[1] = +1.3231270439; this.C_im[1] = 0.0;
+ this.C_re[2] = -0.577245789; this.C_im[2] = -0.007809598;
+ this.C_re[3] = +0.508307513; this.C_im[3] = -0.112208952;
+ this.C_re[4] = -0.15094762; this.C_im[4] = +0.18200602;
+ this.C_re[5] = +1.01418179; this.C_im[5] = +1.64497696;
+ this.C_re[6] = +1.9660549; this.C_im[6] = +2.5127645;
+
+ this.D = new Array();
+ this.D[1] = +1.5627014243;
+ this.D[2] = +0.5185406398;
+ this.D[3] = -0.03333098;
+ this.D[4] = -0.1052906;
+ this.D[5] = -0.0368594;
+ this.D[6] = +0.007317;
+ this.D[7] = +0.01220;
+ this.D[8] = +0.00394;
+ this.D[9] = -0.0013;
+ },
+
+ /**
+ New Zealand Map Grid Forward - long/lat to x/y
+ long/lat in radians
+ */
+ forward : function(p) {
+ var lon = p.x;
+ var lat = p.y;
+
+ var delta_lat = lat - this.lat0;
+ var delta_lon = lon - this.long0;
+
+ // 1. Calculate d_phi and d_psi ... // and d_lambda
+ // For this algorithm, delta_latitude is in seconds of arc x 10-5, so we need to scale to those units. Longitude is radians.
+ var d_phi = delta_lat / Proj4js.common.SEC_TO_RAD * 1E-5; var d_lambda = delta_lon;
+ var d_phi_n = 1; // d_phi^0
+
+ var d_psi = 0;
+ for (n = 1; n <= 10; n++) {
+ d_phi_n = d_phi_n * d_phi;
+ d_psi = d_psi + this.A[n] * d_phi_n;
+ }
+
+ // 2. Calculate theta
+ var th_re = d_psi; var th_im = d_lambda;
+
+ // 3. Calculate z
+ var th_n_re = 1; var th_n_im = 0; // theta^0
+ var th_n_re1; var th_n_im1;
+
+ var z_re = 0; var z_im = 0;
+ for (n = 1; n <= 6; n++) {
+ th_n_re1 = th_n_re*th_re - th_n_im*th_im; th_n_im1 = th_n_im*th_re + th_n_re*th_im;
+ th_n_re = th_n_re1; th_n_im = th_n_im1;
+ z_re = z_re + this.B_re[n]*th_n_re - this.B_im[n]*th_n_im; z_im = z_im + this.B_im[n]*th_n_re + this.B_re[n]*th_n_im;
+ }
+
+ // 4. Calculate easting and northing
+ x = (z_im * this.a) + this.x0;
+ y = (z_re * this.a) + this.y0;
+
+ p.x = x; p.y = y;
+
+ return p;
+ },
+
+
+ /**
+ New Zealand Map Grid Inverse - x/y to long/lat
+ */
+ inverse : function(p) {
+
+ var x = p.x;
+ var y = p.y;
+
+ var delta_x = x - this.x0;
+ var delta_y = y - this.y0;
+
+ // 1. Calculate z
+ var z_re = delta_y / this.a; var z_im = delta_x / this.a;
+
+ // 2a. Calculate theta - first approximation gives km accuracy
+ var z_n_re = 1; var z_n_im = 0; // z^0
+ var z_n_re1; var z_n_im1;
+
+ var th_re = 0; var th_im = 0;
+ for (n = 1; n <= 6; n++) {
+ z_n_re1 = z_n_re*z_re - z_n_im*z_im; z_n_im1 = z_n_im*z_re + z_n_re*z_im;
+ z_n_re = z_n_re1; z_n_im = z_n_im1;
+ th_re = th_re + this.C_re[n]*z_n_re - this.C_im[n]*z_n_im; th_im = th_im + this.C_im[n]*z_n_re + this.C_re[n]*z_n_im;
+ }
+
+ // 2b. Iterate to refine the accuracy of the calculation
+ // 0 iterations gives km accuracy
+ // 1 iteration gives m accuracy -- good enough for most mapping applications
+ // 2 iterations bives mm accuracy
+ for (i = 0; i < this.iterations; i++) {
+ var th_n_re = th_re; var th_n_im = th_im;
+ var th_n_re1; var th_n_im1;
+
+ var num_re = z_re; var num_im = z_im;
+ for (n = 2; n <= 6; n++) {
+ th_n_re1 = th_n_re*th_re - th_n_im*th_im; th_n_im1 = th_n_im*th_re + th_n_re*th_im;
+ th_n_re = th_n_re1; th_n_im = th_n_im1;
+ num_re = num_re + (n-1)*(this.B_re[n]*th_n_re - this.B_im[n]*th_n_im); num_im = num_im + (n-1)*(this.B_im[n]*th_n_re + this.B_re[n]*th_n_im);
+ }
+
+ th_n_re = 1; th_n_im = 0;
+ var den_re = this.B_re[1]; var den_im = this.B_im[1];
+ for (n = 2; n <= 6; n++) {
+ th_n_re1 = th_n_re*th_re - th_n_im*th_im; th_n_im1 = th_n_im*th_re + th_n_re*th_im;
+ th_n_re = th_n_re1; th_n_im = th_n_im1;
+ den_re = den_re + n * (this.B_re[n]*th_n_re - this.B_im[n]*th_n_im); den_im = den_im + n * (this.B_im[n]*th_n_re + this.B_re[n]*th_n_im);
+ }
+
+ // Complex division
+ var den2 = den_re*den_re + den_im*den_im;
+ th_re = (num_re*den_re + num_im*den_im) / den2; th_im = (num_im*den_re - num_re*den_im) / den2;
+ }
+
+ // 3. Calculate d_phi ... // and d_lambda
+ var d_psi = th_re; var d_lambda = th_im;
+ var d_psi_n = 1; // d_psi^0
+
+ var d_phi = 0;
+ for (n = 1; n <= 9; n++) {
+ d_psi_n = d_psi_n * d_psi;
+ d_phi = d_phi + this.D[n] * d_psi_n;
+ }
+
+ // 4. Calculate latitude and longitude
+ // d_phi is calcuated in second of arc * 10^-5, so we need to scale back to radians. d_lambda is in radians.
+ var lat = this.lat0 + (d_phi * Proj4js.common.SEC_TO_RAD * 1E5);
+ var lon = this.long0 + d_lambda;
+
+ p.x = lon;
+ p.y = lat;
+
+ return p;
+ }
+};
Added: trunk/mapbender/http/extensions/proj4js/lib/projCode/omerc.js
===================================================================
--- trunk/mapbender/http/extensions/proj4js/lib/projCode/omerc.js (rev 0)
+++ trunk/mapbender/http/extensions/proj4js/lib/projCode/omerc.js 2009-08-31 13:30:38 UTC (rev 4581)
@@ -0,0 +1,256 @@
+/*******************************************************************************
+NAME OBLIQUE MERCATOR (HOTINE)
+
+PURPOSE: Transforms input longitude and latitude to Easting and
+ Northing for the Oblique Mercator projection. The
+ longitude and latitude must be in radians. The Easting
+ and Northing values will be returned in meters.
+
+PROGRAMMER DATE
+---------- ----
+T. Mittan Mar, 1993
+
+ALGORITHM REFERENCES
+
+1. Snyder, John P., "Map Projections--A Working Manual", U.S. Geological
+ Survey Professional Paper 1395 (Supersedes USGS Bulletin 1532), United
+ State Government Printing Office, Washington D.C., 1987.
+
+2. Snyder, John P. and Voxland, Philip M., "An Album of Map Projections",
+ U.S. Geological Survey Professional Paper 1453 , United State Government
+ Printing Office, Washington D.C., 1989.
+*******************************************************************************/
+
+Proj4js.Proj.omerc = {
+
+ /* Initialize the Oblique Mercator projection
+ ------------------------------------------*/
+ init: function() {
+ if (!this.mode) this.mode=0;
+ if (!this.lon1) {this.lon1=0;this.mode=1;}
+ if (!this.lon2) this.lon2=0;
+ if (!this.lat2) this.lat2=0;
+
+ /* Place parameters in static storage for common use
+ -------------------------------------------------*/
+ var temp = this.b/ this.a;
+ var es = 1.0 - Math.pow(temp,2);
+ var e = Math.sqrt(es);
+
+ this.sin_p20=Math.sin(this.lat0);
+ this.cos_p20=Math.cos(this.lat0);
+
+ this.con = 1.0 - this.es * this.sin_p20 * this.sin_p20;
+ this.com = Math.sqrt(1.0 - es);
+ this.bl = Math.sqrt(1.0 + this.es * Math.pow(this.cos_p20,4.0)/(1.0 - es));
+ this.al = this.a * this.bl * this.k0 * this.com / this.con;
+ if (Math.abs(this.lat0) < Proj4js.common.EPSLN) {
+ this.ts = 1.0;
+ this.d = 1.0;
+ this.el = 1.0;
+ } else {
+ this.ts = Proj4js.common.tsfnz(this.e,this.lat0,this.sin_p20);
+ this.con = Math.sqrt(this.con);
+ this.d = this.bl * this.com / (this.cos_p20 * this.con);
+ if ((this.d * this.d - 1.0) > 0.0) {
+ if (this.lat0 >= 0.0) {
+ this.f = this.d + Math.sqrt(this.d * this.d - 1.0);
+ } else {
+ this.f = this.d - Math.sqrt(this.d * this.d - 1.0);
+ }
+ } else {
+ this.f = this.d;
+ }
+ this.el = this.f * Math.pow(this.ts,this.bl);
+ }
+
+ //this.longc=52.60353916666667;
+
+ if (this.mode != 0) {
+ this.g = .5 * (this.f - 1.0/this.f);
+ this.gama = Proj4js.common.asinz(Math.sin(this.alpha) / this.d);
+ this.longc= this.longc - Proj4js.common.asinz(this.g * Math.tan(this.gama))/this.bl;
+
+ /* Report parameters common to format B
+ -------------------------------------*/
+ //genrpt(azimuth * R2D,"Azimuth of Central Line: ");
+ //cenlon(lon_origin);
+ // cenlat(lat_origin);
+
+ this.con = Math.abs(this.lat0);
+ if ((this.con > Proj4js.common.EPSLN) && (Math.abs(this.con - Proj4js.common.HALF_PI) > Proj4js.common.EPSLN)) {
+ this.singam=Math.sin(this.gama);
+ this.cosgam=Math.cos(this.gama);
+
+ this.sinaz=Math.sin(this.alpha);
+ this.cosaz=Math.cos(this.alpha);
+
+ if (this.lat0>= 0) {
+ this.u = (this.al / this.bl) * Math.atan(Math.sqrt(this.d*this.d - 1.0)/this.cosaz);
+ } else {
+ this.u = -(this.al / this.bl) *Math.atan(Math.sqrt(this.d*this.d - 1.0)/this.cosaz);
+ }
+ } else {
+ Proj4js.reportError("omerc:Init:DataError");
+ }
+ } else {
+ this.sinphi =Math. sin(this.at1);
+ this.ts1 = Proj4js.common.tsfnz(this.e,this.lat1,this.sinphi);
+ this.sinphi = Math.sin(this.lat2);
+ this.ts2 = Proj4js.common.tsfnz(this.e,this.lat2,this.sinphi);
+ this.h = Math.pow(this.ts1,this.bl);
+ this.l = Math.pow(this.ts2,this.bl);
+ this.f = this.el/this.h;
+ this.g = .5 * (this.f - 1.0/this.f);
+ this.j = (this.el * this.el - this.l * this.h)/(this.el * this.el + this.l * this.h);
+ this.p = (this.l - this.h) / (this.l + this.h);
+ this.dlon = this.lon1 - this.lon2;
+ if (this.dlon < -Proj4js.common.PI) this.lon2 = this.lon2 - 2.0 * Proj4js.common.PI;
+ if (this.dlon > Proj4js.common.PI) this.lon2 = this.lon2 + 2.0 * Proj4js.common.PI;
+ this.dlon = this.lon1 - this.lon2;
+ this.longc = .5 * (this.lon1 + this.lon2) -Math.atan(this.j * Math.tan(.5 * this.bl * this.dlon)/this.p)/this.bl;
+ this.dlon = Proj4js.common.adjust_lon(this.lon1 - this.longc);
+ this.gama = Math.atan(Math.sin(this.bl * this.dlon)/this.g);
+ this.alpha = Proj4js.common.asinz(this.d * Math.sin(this.gama));
+
+ /* Report parameters common to format A
+ -------------------------------------*/
+
+ if (Math.abs(this.lat1 - this.lat2) <= Proj4js.common.EPSLN) {
+ Proj4js.reportError("omercInitDataError");
+ //return(202);
+ } else {
+ this.con = Math.abs(this.lat1);
+ }
+ if ((this.con <= Proj4js.common.EPSLN) || (Math.abs(this.con - HALF_PI) <= Proj4js.common.EPSLN)) {
+ Proj4js.reportError("omercInitDataError");
+ //return(202);
+ } else {
+ if (Math.abs(Math.abs(this.lat0) - Proj4js.common.HALF_PI) <= Proj4js.common.EPSLN) {
+ Proj4js.reportError("omercInitDataError");
+ //return(202);
+ }
+ }
+
+ this.singam=Math.sin(this.gam);
+ this.cosgam=Math.cos(this.gam);
+
+ this.sinaz=Math.sin(this.alpha);
+ this.cosaz=Math.cos(this.alpha);
+
+
+ if (this.lat0 >= 0) {
+ this.u = (this.al/this.bl) * Math.atan(Math.sqrt(this.d * this.d - 1.0)/this.cosaz);
+ } else {
+ this.u = -(this.al/this.bl) * Math.atan(Math.sqrt(this.d * this.d - 1.0)/this.cosaz);
+ }
+ }
+ },
+
+
+ /* Oblique Mercator forward equations--mapping lat,long to x,y
+ ----------------------------------------------------------*/
+ forward: function(p) {
+ var theta; /* angle */
+ var sin_phi, cos_phi;/* sin and cos value */
+ var b; /* temporary values */
+ var c, t, tq; /* temporary values */
+ var con, n, ml; /* cone constant, small m */
+ var q,us,vl;
+ var ul,vs;
+ var s;
+ var dlon;
+ var ts1;
+
+ var lon=p.x;
+ var lat=p.y;
+ /* Forward equations
+ -----------------*/
+ sin_phi = Math.sin(lat);
+ dlon = Proj4js.common.adjust_lon(lon - this.longc);
+ vl = Math.sin(this.bl * dlon);
+ if (Math.abs(Math.abs(lat) - Proj4js.common.HALF_PI) > Proj4js.common.EPSLN) {
+ ts1 = Proj4js.common.tsfnz(this.e,lat,sin_phi);
+ q = this.el / (Math.pow(ts1,this.bl));
+ s = .5 * (q - 1.0 / q);
+ t = .5 * (q + 1.0/ q);
+ ul = (s * this.singam - vl * this.cosgam) / t;
+ con = Math.cos(this.bl * dlon);
+ if (Math.abs(con) < .0000001) {
+ us = this.al * this.bl * dlon;
+ } else {
+ us = this.al * Math.atan((s * this.cosgam + vl * this.singam) / con)/this.bl;
+ if (con < 0) us = us + Proj4js.common.PI * this.al / this.bl;
+ }
+ } else {
+ if (lat >= 0) {
+ ul = this.singam;
+ } else {
+ ul = -this.singam;
+ }
+ us = this.al * lat / this.bl;
+ }
+ if (Math.abs(Math.abs(ul) - 1.0) <= Proj4js.common.EPSLN) {
+ //alert("Point projects into infinity","omer-for");
+ Proj4js.reportError("omercFwdInfinity");
+ //return(205);
+ }
+ vs = .5 * this.al * Math.log((1.0 - ul)/(1.0 + ul)) / this.bl;
+ us = us - this.u;
+ var x = this.x0 + vs * this.cosaz + us * this.sinaz;
+ var y = this.y0 + us * this.cosaz - vs * this.sinaz;
+
+ p.x=x;
+ p.y=y;
+ return p;
+ },
+
+ inverse: function(p) {
+ var delta_lon; /* Delta longitude (Given longitude - center */
+ var theta; /* angle */
+ var delta_theta; /* adjusted longitude */
+ var sin_phi, cos_phi;/* sin and cos value */
+ var b; /* temporary values */
+ var c, t, tq; /* temporary values */
+ var con, n, ml; /* cone constant, small m */
+ var vs,us,q,s,ts1;
+ var vl,ul,bs;
+ var dlon;
+ var flag;
+
+ /* Inverse equations
+ -----------------*/
+ p.x -= this.x0;
+ p.y -= this.y0;
+ flag = 0;
+ vs = p.x * this.cosaz - p.y * this.sinaz;
+ us = p.y * this.cosaz + p.x * this.sinaz;
+ us = us + this.u;
+ q = Math.exp(-this.bl * vs / this.al);
+ s = .5 * (q - 1.0/q);
+ t = .5 * (q + 1.0/q);
+ vl = Math.sin(this.bl * us / this.al);
+ ul = (vl * this.cosgam + s * this.singam)/t;
+ if (Math.abs(Math.abs(ul) - 1.0) <= Proj4js.common.EPSLN)
+ {
+ lon = this.longc;
+ if (ul >= 0.0) {
+ lat = Proj4js.common.HALF_PI;
+ } else {
+ lat = -Proj4js.common.HALF_PI;
+ }
+ } else {
+ con = 1.0 / this.bl;
+ ts1 =Math.pow((this.el / Math.sqrt((1.0 + ul) / (1.0 - ul))),con);
+ lat = Proj4js.common.phi2z(this.e,ts1);
+ //if (flag != 0)
+ //return(flag);
+ //~ con = Math.cos(this.bl * us /al);
+ theta = this.longc - Math.atan2((s * this.cosgam - vl * this.singam) , con)/this.bl;
+ lon = Proj4js.common.adjust_lon(theta);
+ }
+ p.x=lon;
+ p.y=lat;
+ return p;
+ }
+};
Added: trunk/mapbender/http/extensions/proj4js/lib/projCode/ortho.js
===================================================================
--- trunk/mapbender/http/extensions/proj4js/lib/projCode/ortho.js (rev 0)
+++ trunk/mapbender/http/extensions/proj4js/lib/projCode/ortho.js 2009-08-31 13:30:38 UTC (rev 4581)
@@ -0,0 +1,113 @@
+/*******************************************************************************
+NAME ORTHOGRAPHIC
+
+PURPOSE: Transforms input longitude and latitude to Easting and
+ Northing for the Orthographic projection. The
+ longitude and latitude must be in radians. The Easting
+ and Northing values will be returned in meters.
+
+PROGRAMMER DATE
+---------- ----
+T. Mittan Mar, 1993
+
+ALGORITHM REFERENCES
+
+1. Snyder, John P., "Map Projections--A Working Manual", U.S. Geological
+ Survey Professional Paper 1395 (Supersedes USGS Bulletin 1532), United
+ State Government Printing Office, Washington D.C., 1987.
+
+2. Snyder, John P. and Voxland, Philip M., "An Album of Map Projections",
+ U.S. Geological Survey Professional Paper 1453 , United State Government
+ Printing Office, Washington D.C., 1989.
+*******************************************************************************/
+
+Proj4js.Proj.ortho = {
+
+ /* Initialize the Orthographic projection
+ -------------------------------------*/
+ init: function(def) {
+ //double temp; /* temporary variable */
+
+ /* Place parameters in static storage for common use
+ -------------------------------------------------*/;
+ this.sin_p14=Math.sin(this.lat0);
+ this.cos_p14=Math.cos(this.lat0);
+ },
+
+
+ /* Orthographic forward equations--mapping lat,long to x,y
+ ---------------------------------------------------*/
+ forward: function(p) {
+ var sinphi, cosphi; /* sin and cos value */
+ var dlon; /* delta longitude value */
+ var coslon; /* cos of longitude */
+ var ksp; /* scale factor */
+ var g;
+ var lon=p.x;
+ var lat=p.y;
+ /* Forward equations
+ -----------------*/
+ dlon = Proj4js.common.adjust_lon(lon - this.long0);
+
+ sinphi=Math.sin(lat);
+ cosphi=Math.cos(lat);
+
+ coslon = Math.cos(dlon);
+ g = this.sin_p14 * sinphi + this.cos_p14 * cosphi * coslon;
+ ksp = 1.0;
+ if ((g > 0) || (Math.abs(g) <= Proj4js.common.EPSLN)) {
+ var x = this.a * ksp * cosphi * Math.sin(dlon);
+ var y = this.y0 + this.a * ksp * (this.cos_p14 * sinphi - this.sin_p14 * cosphi * coslon);
+ } else {
+ Proj4js.reportError("orthoFwdPointError");
+ }
+ p.x=x;
+ p.y=y;
+ return p;
+ },
+
+
+ inverse: function(p) {
+ var rh; /* height above ellipsoid */
+ var z; /* angle */
+ var sinz,cosz; /* sin of z and cos of z */
+ var temp;
+ var con;
+ var lon , lat;
+ /* Inverse equations
+ -----------------*/
+ p.x -= this.x0;
+ p.y -= this.y0;
+ rh = Math.sqrt(p.x * p.x + p.y * p.y);
+ if (rh > this.a + .0000001) {
+ Proj4js.reportError("orthoInvDataError");
+ }
+ z = Proj4js.common.asinz(rh / this.a);
+
+ sinz=Math.sin(z);
+ cosi=Math.cos(z);
+
+ lon = this.long0;
+ if (Math.abs(rh) <= Proj4js.common.EPSLN) {
+ lat = this.lat0;
+ }
+ lat = Proj4js.common.asinz(cosz * this.sin_p14 + (y * sinz * this.cos_p14)/rh);
+ con = Math.abs(lat0) - Proj4js.common.HALF_PI;
+ if (Math.abs(con) <= Proj4js.common.EPSLN) {
+ if (this.lat0 >= 0) {
+ lon = Proj4js.common.adjust_lon(this.long0 + Math.atan2(p.x, -p.y));
+ } else {
+ lon = Proj4js.common.adjust_lon(this.long0 -Math.atan2(-p.x, p.y));
+ }
+ }
+ con = cosz - this.sin_p14 * Math.sin(lat);
+ if ((Math.abs(con) >= Proj4js.common.EPSLN) || (Math.abs(x) >= Proj4js.common.EPSLN)) {
+ lon = Proj4js.common.adjust_lon(this.long0 + Math.atan2((p.x * sinz * this.cos_p14), (con * rh)));
+ }
+ p.x=lon;
+ p.y=lat;
+ return p;
+ }
+};
+
+
Added: trunk/mapbender/http/extensions/proj4js/lib/projCode/poly.js
===================================================================
--- trunk/mapbender/http/extensions/proj4js/lib/projCode/poly.js (rev 0)
+++ trunk/mapbender/http/extensions/proj4js/lib/projCode/poly.js 2009-08-31 13:30:38 UTC (rev 4581)
@@ -0,0 +1,157 @@
+/* Function to compute, phi4, the latitude for the inverse of the
+ Polyconic projection.
+------------------------------------------------------------*/
+function phi4z (eccent,e0,e1,e2,e3,a,b,c,phi) {
+ var sinphi, sin2ph, tanph, ml, mlp, con1, con2, con3, dphi, i;
+
+ phi = a;
+ for (i = 1; i <= 15; i++) {
+ sinphi = Math.sin(phi);
+ tanphi = Math.tan(phi);
+ c = tanphi * Math.sqrt (1.0 - eccent * sinphi * sinphi);
+ sin2ph = Math.sin (2.0 * phi);
+ /*
+ ml = e0 * *phi - e1 * sin2ph + e2 * sin (4.0 * *phi);
+ mlp = e0 - 2.0 * e1 * cos (2.0 * *phi) + 4.0 * e2 * cos (4.0 * *phi);
+ */
+ ml = e0 * phi - e1 * sin2ph + e2 * Math.sin (4.0 * phi) - e3 * Math.sin (6.0 * phi);
+ mlp = e0 - 2.0 * e1 * Math.cos (2.0 * phi) + 4.0 * e2 * Math.cos (4.0 * phi) - 6.0 * e3 * Math.cos (6.0 * phi);
+ con1 = 2.0 * ml + c * (ml * ml + b) - 2.0 * a * (c * ml + 1.0);
+ con2 = eccent * sin2ph * (ml * ml + b - 2.0 * a * ml) / (2.0 *c);
+ con3 = 2.0 * (a - ml) * (c * mlp - 2.0 / sin2ph) - 2.0 * mlp;
+ dphi = con1 / (con2 + con3);
+ phi += dphi;
+ if (Math.abs(dphi) <= .0000000001 ) return(phi);
+ }
+ Proj4js.reportError("phi4z: No convergence");
+ return null;
+}
+
+
+/* Function to compute the constant e4 from the input of the eccentricity
+ of the spheroid, x. This constant is used in the Polar Stereographic
+ projection.
+--------------------------------------------------------------------*/
+function e4fn(x) {
+ var con, com;
+ con = 1.0 + x;
+ com = 1.0 - x;
+ return (Math.sqrt((Math.pow(con,con))*(Math.pow(com,com))));
+}
+
+
+
+
+
+/*******************************************************************************
+NAME POLYCONIC
+
+PURPOSE: Transforms input longitude and latitude to Easting and
+ Northing for the Polyconic projection. The
+ longitude and latitude must be in radians. The Easting
+ and Northing values will be returned in meters.
+
+PROGRAMMER DATE
+---------- ----
+T. Mittan Mar, 1993
+
+ALGORITHM REFERENCES
+
+1. Snyder, John P., "Map Projections--A Working Manual", U.S. Geological
+ Survey Professional Paper 1395 (Supersedes USGS Bulletin 1532), United
+ State Government Printing Office, Washington D.C., 1987.
+
+2. Snyder, John P. and Voxland, Philip M., "An Album of Map Projections",
+ U.S. Geological Survey Professional Paper 1453 , United State Government
+ Printing Office, Washington D.C., 1989.
+*******************************************************************************/
+
+Proj4js.Proj.poly = {
+
+ /* Initialize the POLYCONIC projection
+ ----------------------------------*/
+ init: function() {
+ var temp; /* temporary variable */
+ if (this.lat0=0) this.lat0=90;//this.lat0 ca
+
+ /* Place parameters in static storage for common use
+ -------------------------------------------------*/
+ this.temp = this.b / this.a;
+ this.es = 1.0 - Math.pow(this.temp,2);// devait etre dans tmerc.js mais n y est pas donc je commente sinon retour de valeurs nulles
+ this.e = Math.sqrt(this.es);
+ this.e0 = Proj4js.common.e0fn(this.es);
+ this.e1 = Proj4js.common.e1fn(this.es);
+ this.e2 = Proj4js.common.e2fn(this.es);
+ this.e3 = Proj4js.common.e3fn(this.es);
+ this.ml0 = Proj4js.common.mlfn(this.e0, this.e1,this.e2, this.e3, this.lat0);//si que des zeros le calcul ne se fait pas
+ //if (!this.ml0) {this.ml0=0;}
+ },
+
+
+ /* Polyconic forward equations--mapping lat,long to x,y
+ ---------------------------------------------------*/
+ forward: function(p) {
+ var sinphi, cosphi; /* sin and cos value */
+ var al; /* temporary values */
+ var c; /* temporary values */
+ var con, ml; /* cone constant, small m */
+ var ms; /* small m */
+ var x,y;
+
+ var lon=p.x;
+ var lat=p.y;
+
+ con = Proj4js.common.adjust_lon(lon - this.long0);
+ if (Math.abs(lat) <= .0000001) {
+ x = this.x0 + this.a * con;
+ y = this.y0 - this.a * this.ml0;
+ } else {
+ sinphi = Math.sin(lat);
+ cosphi = Math.cos(lat);
+
+ ml = Proj4js.common.mlfn(this.e0, this.e1, this.e2, this.e3, lat);
+ ms = Proj4js.common.msfnz(this.e,sinphi,cosphi);
+ con = sinphi;
+ x = this.x0 + this.a * ms * Math.sin(con)/sinphi;
+ y = this.y0 + this.a * (ml - this.ml0 + ms * (1.0 - Math.cos(con))/sinphi);
+ }
+
+ p.x=x;
+ p.y=y;
+ return p;
+ },
+
+
+ /* Inverse equations
+ -----------------*/
+ inverse: function(p) {
+ var sin_phi, cos_phi; /* sin and cos value */
+ var al; /* temporary values */
+ var b; /* temporary values */
+ var c; /* temporary values */
+ var con, ml; /* cone constant, small m */
+ var iflg; /* error flag */
+ var lon,lat;
+ p.x -= this.x0;
+ p.y -= this.y0;
+ al = this.ml0 + p.y/this.a;
+ iflg = 0;
+
+ if (Math.abs(al) <= .0000001) {
+ lon = p.x/this.a + this.long0;
+ lat = 0.0;
+ } else {
+ b = al * al + (p.x/this.a) * (p.x/this.a);
+ iflg = phi4z(this.es,this.e0,this.e1,this.e2,this.e3,this.al,b,c,lat);
+ if (iflg != 1) return(iflg);
+ lon = Proj4js.common.adjust_lon((asinz(p.x * c / this.a) / Math.sin(lat)) + this.long0);
+ }
+
+ p.x=lon;
+ p.y=lat;
+ return p;
+ }
+};
+
+
+
Added: trunk/mapbender/http/extensions/proj4js/lib/projCode/sinu.js
===================================================================
--- trunk/mapbender/http/extensions/proj4js/lib/projCode/sinu.js (rev 0)
+++ trunk/mapbender/http/extensions/proj4js/lib/projCode/sinu.js 2009-08-31 13:30:38 UTC (rev 4581)
@@ -0,0 +1,79 @@
+/*******************************************************************************
+NAME SINUSOIDAL
+
+PURPOSE: Transforms input longitude and latitude to Easting and
+ Northing for the Sinusoidal projection. The
+ longitude and latitude must be in radians. The Easting
+ and Northing values will be returned in meters.
+
+PROGRAMMER DATE
+---------- ----
+D. Steinwand, EROS May, 1991
+
+This function was adapted from the Sinusoidal projection code (FORTRAN) in the
+General Cartographic Transformation Package software which is available from
+the U.S. Geological Survey National Mapping Division.
+
+ALGORITHM REFERENCES
+
+1. Snyder, John P., "Map Projections--A Working Manual", U.S. Geological
+ Survey Professional Paper 1395 (Supersedes USGS Bulletin 1532), United
+ State Government Printing Office, Washington D.C., 1987.
+
+2. "Software Documentation for GCTP General Cartographic Transformation
+ Package", U.S. Geological Survey National Mapping Division, May 1982.
+*******************************************************************************/
+
+Proj4js.Proj.sinu = {
+
+ /* Initialize the Sinusoidal projection
+ ------------------------------------*/
+ init: function() {
+ /* Place parameters in static storage for common use
+ -------------------------------------------------*/
+ this.R = 6370997.0; //Radius of earth
+ },
+
+ /* Sinusoidal forward equations--mapping lat,long to x,y
+ -----------------------------------------------------*/
+ forward: function(p) {
+ var x,y,delta_lon;
+ var lon=p.x;
+ var lat=p.y;
+ /* Forward equations
+ -----------------*/
+ delta_lon = Proj4js.common.adjust_lon(lon - this.long0);
+ x = this.R * delta_lon * Math.cos(lat) + this.x0;
+ y = this.R * lat + this.y0;
+
+ p.x=x;
+ p.y=y;
+ return p;
+ },
+
+ inverse: function(p) {
+ var lat,temp,lon;
+
+ /* Inverse equations
+ -----------------*/
+ p.x -= this.x0;
+ p.y -= this.y0;
+ lat = p.y / this.R;
+ if (Math.abs(lat) > Proj4js.common.HALF_PI) {
+ Proj4js.reportError("sinu:Inv:DataError");
+ }
+ temp = Math.abs(lat) - Proj4js.common.HALF_PI;
+ if (Math.abs(temp) > Proj4js.common.EPSLN) {
+ temp = this.long0+ p.x / (this.R *Math.cos(lat));
+ lon = Proj4js.common.adjust_lon(temp);
+ } else {
+ lon = this.long0;
+ }
+
+ p.x=lon;
+ p.y=lat;
+ return p;
+ }
+};
+
+
Added: trunk/mapbender/http/extensions/proj4js/lib/projCode/somerc.js
===================================================================
--- trunk/mapbender/http/extensions/proj4js/lib/projCode/somerc.js (rev 0)
+++ trunk/mapbender/http/extensions/proj4js/lib/projCode/somerc.js 2009-08-31 13:30:38 UTC (rev 4581)
@@ -0,0 +1,110 @@
+/*******************************************************************************
+NAME SWISS OBLIQUE MERCATOR
+
+PURPOSE: Swiss projection.
+WARNING: X and Y are inverted (weird) in the swiss coordinate system. Not
+ here, since we want X to be horizontal and Y vertical.
+
+ALGORITHM REFERENCES
+1. "Formules et constantes pour le Calcul pour la
+ projection cylindrique conforme à axe oblique et pour la transformation entre
+ des systèmes de référence".
+ http://www.swisstopo.admin.ch/internet/swisstopo/fr/home/topics/survey/sys/refsys/switzerland.parsysrelated1.31216.downloadList.77004.DownloadFile.tmp/swissprojectionfr.pdf
+
+*******************************************************************************/
+
+Proj4js.Proj.somerc = {
+
+ init: function() {
+ var phy0 = this.lat0;
+ this.lambda0 = this.long0;
+ var sinPhy0 = Math.sin(phy0);
+ var semiMajorAxis = this.a;
+ var invF = this.rf;
+ var flattening = 1 / invF;
+ var e2 = 2 * flattening - Math.pow(flattening, 2);
+ var e = this.e = Math.sqrt(e2);
+ this.R = semiMajorAxis * Math.sqrt(1 - e2) / (1 - e2 * Math.pow(sinPhy0, 2.0));
+ this.alpha = Math.sqrt(1 + e2 / (1 - e2) * Math.pow(Math.cos(phy0), 4.0));
+ this.b0 = Math.asin(sinPhy0 / this.alpha);
+ this.K = Math.log(Math.tan(Math.PI / 4.0 + this.b0 / 2.0))
+ - this.alpha
+ * Math.log(Math.tan(Math.PI / 4.0 + phy0 / 2.0))
+ + this.alpha
+ * e / 2
+ * Math.log((1 + e * sinPhy0)
+ / (1 - e * sinPhy0));
+ },
+
+
+ forward: function(p) {
+ var Sa1 = Math.log(Math.tan(Math.PI / 4.0 - p.y / 2.0));
+ var Sa2 = this.e / 2.0
+ * Math.log((1 + this.e * Math.sin(p.y))
+ / (1 - this.e * Math.sin(p.y)));
+ var S = -this.alpha * (Sa1 + Sa2) + this.K;
+
+ // spheric latitude
+ var b = 2.0 * (Math.atan(Math.exp(S)) - Math.PI / 4.0);
+
+ // spheric longitude
+ var I = this.alpha * (p.x - this.lambda0);
+
+ // psoeudo equatorial rotation
+ var rotI = Math.atan(Math.sin(I)
+ / (Math.sin(this.b0) * Math.tan(b) +
+ Math.cos(this.b0) * Math.cos(I)));
+
+ var rotB = Math.asin(Math.cos(this.b0) * Math.sin(b) -
+ Math.sin(this.b0) * Math.cos(b) * Math.cos(I));
+
+ p.y = this.R / 2.0
+ * Math.log((1 + Math.sin(rotB)) / (1 - Math.sin(rotB)))
+ + this.y0;
+ p.x = this.R * rotI + this.x0;
+ return p;
+ },
+
+ inverse: function(p) {
+ var Y = p.x - this.x0;
+ var X = p.y - this.y0;
+
+ var rotI = Y / this.R;
+ var rotB = 2 * (Math.atan(Math.exp(X / this.R)) - Math.PI / 4.0);
+
+ var b = Math.asin(Math.cos(this.b0) * Math.sin(rotB)
+ + Math.sin(this.b0) * Math.cos(rotB) * Math.cos(rotI));
+ var I = Math.atan(Math.sin(rotI)
+ / (Math.cos(this.b0) * Math.cos(rotI) - Math.sin(this.b0)
+ * Math.tan(rotB)));
+
+ var lambda = this.lambda0 + I / this.alpha;
+
+ var S = 0.0;
+ var phy = b;
+ var prevPhy = -1000.0;
+ var iteration = 0;
+ while (Math.abs(phy - prevPhy) > 0.0000001)
+ {
+ if (++iteration > 20)
+ {
+ Proj4js.reportError("omercFwdInfinity");
+ return;
+ }
+ //S = Math.log(Math.tan(Math.PI / 4.0 + phy / 2.0));
+ S = 1.0
+ / this.alpha
+ * (Math.log(Math.tan(Math.PI / 4.0 + b / 2.0)) - this.K)
+ + this.e
+ * Math.log(Math.tan(Math.PI / 4.0
+ + Math.asin(this.e * Math.sin(phy))
+ / 2.0));
+ prevPhy = phy;
+ phy = 2.0 * Math.atan(Math.exp(S)) - Math.PI / 2.0;
+ }
+
+ p.x = lambda;
+ p.y = phy;
+ return p;
+ }
+};
Added: trunk/mapbender/http/extensions/proj4js/lib/projCode/stere.js
===================================================================
--- trunk/mapbender/http/extensions/proj4js/lib/projCode/stere.js (rev 0)
+++ trunk/mapbender/http/extensions/proj4js/lib/projCode/stere.js 2009-08-31 13:30:38 UTC (rev 4581)
@@ -0,0 +1,243 @@
+
+// Initialize the Stereographic projection
+
+Proj4js.Proj.stere = {
+ ssfn_: function(phit, sinphi, eccen) {
+ sinphi *= eccen;
+ return (Math.tan (.5 * (Proj4js.common.HALF_PI + phit)) * Math.pow((1. - sinphi) / (1. + sinphi), .5 * eccen));
+ },
+ TOL: 1.e-8,
+ NITER: 8,
+ CONV: 1.e-10,
+ S_POLE: 0,
+ N_POLE: 1,
+ OBLIQ: 2,
+ EQUIT: 3,
+
+ init : function() {
+ this.phits = this.lat_ts ? this.lat_ts : Proj4js.common.HALF_PI;
+ var t = Math.abs(this.lat0);
+ if ((Math.abs(t) - Proj4js.common.HALF_PI) < Proj4js.common.EPSLN) {
+ this.mode = this.lat0 < 0. ? this.S_POLE : this.N_POLE;
+ } else {
+ this.mode = t > Proj4js.common.EPSLN ? this.OBLIQ : this.EQUIT;
+ }
+ this.phits = Math.abs(this.phits);
+ if (this.es) {
+ var X;
+
+ switch (this.mode) {
+ case this.N_POLE:
+ case this.S_POLE:
+ if (Math.abs(this.phits - Proj4js.common.HALF_PI) < Proj4js.common.EPSLN) {
+ this.akm1 = 2. * this.k0 / Math.sqrt(Math.pow(1+this.e,1+this.e)*Math.pow(1-this.e,1-this.e));
+ } else {
+ t = Math.sin(this.phits);
+ this.akm1 = Math.cos(this.phits) / Proj4js.common.tsfnz(this.e, this.phits, t);
+ t *= this.e;
+ this.akm1 /= Math.sqrt(1. - t * t);
+ }
+ break;
+ case this.EQUIT:
+ this.akm1 = 2. * this.k0;
+ break;
+ case this.OBLIQ:
+ t = Math.sin(this.lat0);
+ X = 2. * Math.atan(this.ssfn_(this.lat0, t, this.e)) - Proj4js.common.HALF_PI;
+ t *= this.e;
+ this.akm1 = 2. * this.k0 * Math.cos(this.lat0) / Math.sqrt(1. - t * t);
+ this.sinX1 = Math.sin(X);
+ this.cosX1 = Math.cos(X);
+ break;
+ }
+ } else {
+ switch (this.mode) {
+ case this.OBLIQ:
+ this.sinph0 = Math.sin(this.lat0);
+ this.cosph0 = Math.cos(this.lat0);
+ case this.EQUIT:
+ this.akm1 = 2. * this.k0;
+ break;
+ case this.S_POLE:
+ case this.N_POLE:
+ this.akm1 = Math.abs(this.phits - Proj4js.common.HALF_PI) >= Proj4js.common.EPSLN ?
+ Math.cos(this.phits) / Math.tan(Proj4js.common.FORTPI - .5 * this.phits) :
+ 2. * this.k0 ;
+ break;
+ }
+ }
+ },
+
+// Stereographic forward equations--mapping lat,long to x,y
+ forward: function(p) {
+ var lon = p.x;
+ var lat = p.y;
+ var x, y
+
+ if (this.sphere) {
+ var sinphi, cosphi, coslam, sinlam;
+
+ sinphi = Math.sin(lat);
+ cosphi = Math.cos(lat);
+ coslam = Math.cos(lon);
+ sinlam = Math.sin(lon);
+ switch (this.mode) {
+ case this.EQUIT:
+ y = 1. + cosphi * coslam;
+ if (y <= Proj4js.common.EPSLN) {
+ F_ERROR;
+ }
+ y = this.akm1 / y;
+ x = y * cosphi * sinlam;
+ y *= sinphi;
+ break;
+ case this.OBLIQ:
+ y = 1. + this.sinph0 * sinphi + this.cosph0 * cosphi * coslam;
+ if (y <= Proj4js.common.EPSLN) {
+ F_ERROR;
+ }
+ y = this.akm1 / y;
+ x = y * cosphi * sinlam;
+ y *= this.cosph0 * sinphi - this.sinph0 * cosphi * coslam;
+ break;
+ case this.N_POLE:
+ coslam = -coslam;
+ lat = -lat;
+ //Note no break here so it conitnues through S_POLE
+ case this.S_POLE:
+ if (Math.abs(lat - Proj4js.common.HALF_PI) < this.TOL) {
+ F_ERROR;
+ }
+ y = this.akm1 * Math.tan(Proj4js.common.FORTPI + .5 * lat)
+ x = sinlam * y;
+ y *= coslam;
+ break;
+ }
+ } else {
+ coslam = Math.cos(lon);
+ sinlam = Math.sin(lon);
+ sinphi = Math.sin(lat);
+ if (this.mode == this.OBLIQ || this.mode == this.EQUIT) {
+ X = 2. * Math.atan(this.ssfn_(lat, sinphi, this.e));
+ sinX = Math.sin(X - Proj4js.common.HALF_PI);
+ cosX = Math.cos(X);
+ }
+ switch (this.mode) {
+ case this.OBLIQ:
+ A = this.akm1 / (this.cosX1 * (1. + this.sinX1 * sinX + this.cosX1 * cosX * coslam));
+ y = A * (this.cosX1 * sinX - this.sinX1 * cosX * coslam);
+ x = A * cosX;
+ break;
+ case this.EQUIT:
+ A = 2. * this.akm1 / (1. + cosX * coslam);
+ y = A * sinX;
+ x = A * cosX;
+ break;
+ case this.S_POLE:
+ lat = -lat;
+ coslam = - coslam;
+ sinphi = -sinphi;
+ case this.N_POLE:
+ x = this.akm1 * Proj4js.common.tsfnz(this.e, lat, sinphi);
+ y = - x * coslam;
+ break;
+ }
+ x = x * sinlam;
+ }
+ p.x = x*this.a + this.x0;
+ p.y = y*this.a + this.y0;
+ return p;
+ },
+
+
+//* Stereographic inverse equations--mapping x,y to lat/long
+ inverse: function(p) {
+ var x = (p.x - this.x0)/this.a; /* descale and de-offset */
+ var y = (p.y - this.y0)/this.a;
+ var lon, lat
+
+ var cosphi, sinphi, tp=0.0, phi_l=0.0, rho, halfe=0.0, pi2=0.0;
+ var i;
+
+ if (this.sphere) {
+ var c, rh, sinc, cosc;
+
+ rh = Math.sqrt(x*x + y*y);
+ c = 2. * Math.atan(rh / this.akm1);
+ sinc = Math.sin(c);
+ cosc = Math.cos(c);
+ lon = 0.;
+ switch (this.mode) {
+ case this.EQUIT:
+ if (Math.abs(rh) <= Proj4js.common.EPSLN) {
+ lat = 0.;
+ } else {
+ lat = Math.asin(y * sinc / rh);
+ }
+ if (cosc != 0. || x != 0.) lon = Math.atan2(x * sinc, cosc * rh);
+ break;
+ case this.OBLIQ:
+ if (Math.abs(rh) <= Proj4js.common.EPSLN) {
+ lat = this.phi0;
+ } else {
+ lat = Math.asin(cosc * sinph0 + y * sinc * cosph0 / rh);
+ }
+ c = cosc - sinph0 * Math.sin(lat);
+ if (c != 0. || x != 0.) {
+ lon = Math.atan2(x * sinc * cosph0, c * rh);
+ }
+ break;
+ case this.N_POLE:
+ y = -y;
+ case this.S_POLE:
+ if (Math.abs(rh) <= Proj4js.common.EPSLN) {
+ lat = this.phi0;
+ } else {
+ lat = Math.asin(this.mode == this.S_POLE ? -cosc : cosc);
+ }
+ lon = (x == 0. && y == 0.) ? 0. : Math.atan2(x, y);
+ break;
+ }
+ } else {
+ rho = Math.sqrt(x*x + y*y);
+ switch (this.mode) {
+ case this.OBLIQ:
+ case this.EQUIT:
+ tp = 2. * Math.atan2(rho * this.cosX1 , this.akm1);
+ cosphi = Math.cos(tp);
+ sinphi = Math.sin(tp);
+ if( rho == 0.0 ) {
+ phi_l = Math.asin(cosphi * this.sinX1);
+ } else {
+ phi_l = Math.asin(cosphi * this.sinX1 + (y * sinphi * this.cosX1 / rho));
+ }
+
+ tp = Math.tan(.5 * (Proj4js.common.HALF_PI + phi_l));
+ x *= sinphi;
+ y = rho * this.cosX1 * cosphi - y * this.sinX1* sinphi;
+ pi2 = Proj4js.common.HALF_PI;
+ halfe = .5 * this.e;
+ break;
+ case this.N_POLE:
+ y = -y;
+ case this.S_POLE:
+ tp = - rho / this.akm1
+ phi_l = Proj4js.common.HALF_PI - 2. * Math.atan(tp);
+ pi2 = -Proj4js.common.HALF_PI;
+ halfe = -.5 * this.e;
+ break;
+ }
+ for (i = this.NITER; i--; phi_l = lat) { //check this
+ sinphi = this.e * Math.sin(phi_l);
+ lat = 2. * Math.atan(tp * Math.pow((1.+sinphi)/(1.-sinphi), halfe)) - pi2;
+ if (Math.abs(phi_l - lat) < this.CONV) {
+ if (this.mode == this.S_POLE) lat = -lat;
+ lon = (x == 0. && y == 0.) ? 0. : Math.atan2(x, y);
+ p.x = lon;
+ p.y = lat
+ return p;
+ }
+ }
+ }
+ }
+};
Added: trunk/mapbender/http/extensions/proj4js/lib/projCode/sterea.js
===================================================================
--- trunk/mapbender/http/extensions/proj4js/lib/projCode/sterea.js (rev 0)
+++ trunk/mapbender/http/extensions/proj4js/lib/projCode/sterea.js 2009-08-31 13:30:38 UTC (rev 4581)
@@ -0,0 +1,56 @@
+
+Proj4js.Proj.sterea = {
+ dependsOn : 'gauss',
+
+ init : function() {
+ Proj4js.Proj['gauss'].init.apply(this);
+ if (!this.rc) {
+ Proj4js.reportError("sterea:init:E_ERROR_0");
+ return;
+ }
+ this.sinc0 = Math.sin(this.phic0);
+ this.cosc0 = Math.cos(this.phic0);
+ this.R2 = 2.0 * this.rc;
+ if (!this.title) this.title = "Oblique Stereographic Alternative";
+ },
+
+ forward : function(p) {
+ p.x = Proj4js.common.adjust_lon(p.x-this.long0); /* adjust del longitude */
+ Proj4js.Proj['gauss'].forward.apply(this, [p]);
+ sinc = Math.sin(p.y);
+ cosc = Math.cos(p.y);
+ cosl = Math.cos(p.x);
+ k = this.k0 * this.R2 / (1.0 + this.sinc0 * sinc + this.cosc0 * cosc * cosl);
+ p.x = k * cosc * Math.sin(p.x);
+ p.y = k * (this.cosc0 * sinc - this.sinc0 * cosc * cosl);
+ p.x = this.a * p.x + this.x0;
+ p.y = this.a * p.y + this.y0;
+ return p;
+ },
+
+ inverse : function(p) {
+ var lon,lat;
+ p.x = (p.x - this.x0) / this.a; /* descale and de-offset */
+ p.y = (p.y - this.y0) / this.a;
+
+ p.x /= this.k0;
+ p.y /= this.k0;
+ if ( (rho = Math.sqrt(p.x*p.x + p.y*p.y)) ) {
+ c = 2.0 * Math.atan2(rho, this.R2);
+ sinc = Math.sin(c);
+ cosc = Math.cos(c);
+ lat = Math.asin(cosc * this.sinc0 + p.y * sinc * this.cosc0 / rho);
+ lon = Math.atan2(p.x * sinc, rho * this.cosc0 * cosc - p.y * this.sinc0 * sinc);
+ } else {
+ lat = this.phic0;
+ lon = 0.;
+ }
+
+ p.x = lon;
+ p.y = lat;
+ Proj4js.Proj['gauss'].inverse.apply(this,[p]);
+ p.x = Proj4js.common.adjust_lon(p.x + this.long0); /* adjust longitude to CM */
+ return p;
+ }
+};
+
Added: trunk/mapbender/http/extensions/proj4js/lib/projCode/tmerc.js
===================================================================
--- trunk/mapbender/http/extensions/proj4js/lib/projCode/tmerc.js (rev 0)
+++ trunk/mapbender/http/extensions/proj4js/lib/projCode/tmerc.js 2009-08-31 13:30:38 UTC (rev 4581)
@@ -0,0 +1,141 @@
+/*******************************************************************************
+NAME TRANSVERSE MERCATOR
+
+PURPOSE: Transforms input longitude and latitude to Easting and
+ Northing for the Transverse Mercator projection. The
+ longitude and latitude must be in radians. The Easting
+ and Northing values will be returned in meters.
+
+ALGORITHM REFERENCES
+
+1. Snyder, John P., "Map Projections--A Working Manual", U.S. Geological
+ Survey Professional Paper 1395 (Supersedes USGS Bulletin 1532), United
+ State Government Printing Office, Washington D.C., 1987.
+
+2. Snyder, John P. and Voxland, Philip M., "An Album of Map Projections",
+ U.S. Geological Survey Professional Paper 1453 , United State Government
+ Printing Office, Washington D.C., 1989.
+*******************************************************************************/
+
+
+/**
+ Initialize Transverse Mercator projection
+*/
+
+Proj4js.Proj.tmerc = {
+ init : function() {
+ this.e0 = Proj4js.common.e0fn(this.es);
+ this.e1 = Proj4js.common.e1fn(this.es);
+ this.e2 = Proj4js.common.e2fn(this.es);
+ this.e3 = Proj4js.common.e3fn(this.es);
+ this.ml0 = this.a * Proj4js.common.mlfn(this.e0, this.e1, this.e2, this.e3, this.lat0);
+ },
+
+ /**
+ Transverse Mercator Forward - long/lat to x/y
+ long/lat in radians
+ */
+ forward : function(p) {
+ var lon = p.x;
+ var lat = p.y;
+
+ var delta_lon = Proj4js.common.adjust_lon(lon - this.long0); // Delta longitude
+ var con; // cone constant
+ var x, y;
+ var sin_phi=Math.sin(lat);
+ var cos_phi=Math.cos(lat);
+
+ if (this.sphere) { /* spherical form */
+ var b = cos_phi * Math.sin(delta_lon);
+ if ((Math.abs(Math.abs(b) - 1.0)) < .0000000001) {
+ Proj4js.reportError("tmerc:forward: Point projects into infinity");
+ return(93);
+ } else {
+ x = .5 * this.a * this.k0 * Math.log((1.0 + b)/(1.0 - b));
+ con = Math.acos(cos_phi * Math.cos(delta_lon)/Math.sqrt(1.0 - b*b));
+ if (lat < 0) con = - con;
+ y = this.a * this.k0 * (con - this.lat0);
+ }
+ } else {
+ var al = cos_phi * delta_lon;
+ var als = Math.pow(al,2);
+ var c = this.ep2 * Math.pow(cos_phi,2);
+ var tq = Math.tan(lat);
+ var t = Math.pow(tq,2);
+ con = 1.0 - this.es * Math.pow(sin_phi,2);
+ var n = this.a / Math.sqrt(con);
+ var ml = this.a * Proj4js.common.mlfn(this.e0, this.e1, this.e2, this.e3, lat);
+
+ x = this.k0 * n * al * (1.0 + als / 6.0 * (1.0 - t + c + als / 20.0 * (5.0 - 18.0 * t + Math.pow(t,2) + 72.0 * c - 58.0 * this.ep2))) + this.x0;
+ y = this.k0 * (ml - this.ml0 + n * tq * (als * (0.5 + als / 24.0 * (5.0 - t + 9.0 * c + 4.0 * Math.pow(c,2) + als / 30.0 * (61.0 - 58.0 * t + Math.pow(t,2) + 600.0 * c - 330.0 * this.ep2))))) + this.y0;
+
+ }
+ p.x = x; p.y = y;
+ return p;
+ }, // tmercFwd()
+
+ /**
+ Transverse Mercator Inverse - x/y to long/lat
+ */
+ inverse : function(p) {
+ var con, phi; /* temporary angles */
+ var delta_phi; /* difference between longitudes */
+ var i;
+ var max_iter = 6; /* maximun number of iterations */
+ var lat, lon;
+
+ if (this.sphere) { /* spherical form */
+ var f = Math.exp(p.x/(this.a * this.k0));
+ var g = .5 * (f - 1/f);
+ var temp = this.lat0 + p.y/(this.a * this.k0);
+ var h = Math.cos(temp);
+ con = Math.sqrt((1.0 - h * h)/(1.0 + g * g));
+ lat = Math.asinz(con);
+ if (temp < 0)
+ lat = -lat;
+ if ((g == 0) && (h == 0)) {
+ lon = this.long0;
+ } else {
+ lon = Proj4js.common.adjust_lon(Math.atan2(g,h) + this.long0);
+ }
+ } else { // ellipsoidal form
+ var x = p.x - this.x0;
+ var y = p.y - this.y0;
+
+ con = (this.ml0 + y / this.k0) / this.a;
+ phi = con;
+ for (i=0;;i++) {
+ delta_phi=((con + this.e1 * Math.sin(2.0*phi) - this.e2 * Math.sin(4.0*phi) + this.e3 * Math.sin(6.0*phi)) / this.e0) - phi;
+ phi += delta_phi;
+ if (Math.abs(delta_phi) <= Proj4js.common.EPSLN) break;
+ if (i >= max_iter) {
+ Proj4js.reportError("tmerc:inverse: Latitude failed to converge");
+ return(95);
+ }
+ } // for()
+ if (Math.abs(phi) < Proj4js.common.HALF_PI) {
+ // sincos(phi, &sin_phi, &cos_phi);
+ var sin_phi=Math.sin(phi);
+ var cos_phi=Math.cos(phi);
+ var tan_phi = Math.tan(phi);
+ var c = this.ep2 * Math.pow(cos_phi,2);
+ var cs = Math.pow(c,2);
+ var t = Math.pow(tan_phi,2);
+ var ts = Math.pow(t,2);
+ con = 1.0 - this.es * Math.pow(sin_phi,2);
+ var n = this.a / Math.sqrt(con);
+ var r = n * (1.0 - this.es) / con;
+ var d = x / (n * this.k0);
+ var ds = Math.pow(d,2);
+ lat = phi - (n * tan_phi * ds / r) * (0.5 - ds / 24.0 * (5.0 + 3.0 * t + 10.0 * c - 4.0 * cs - 9.0 * this.ep2 - ds / 30.0 * (61.0 + 90.0 * t + 298.0 * c + 45.0 * ts - 252.0 * this.ep2 - 3.0 * cs)));
+ lon = Proj4js.common.adjust_lon(this.long0 + (d * (1.0 - ds / 6.0 * (1.0 + 2.0 * t + c - ds / 20.0 * (5.0 - 2.0 * c + 28.0 * t - 3.0 * cs + 8.0 * this.ep2 + 24.0 * ts))) / cos_phi));
+ } else {
+ lat = Proj4js.common.HALF_PI * Proj4js.common.sign(y);
+ lon = this.long0;
+ }
+ }
+ p.x = lon;
+ p.y = lat;
+ return p;
+ } // tmercInv()
+};
\ No newline at end of file
Added: trunk/mapbender/http/extensions/proj4js/lib/projCode/utm.js
===================================================================
--- trunk/mapbender/http/extensions/proj4js/lib/projCode/utm.js (rev 0)
+++ trunk/mapbender/http/extensions/proj4js/lib/projCode/utm.js 2009-08-31 13:30:38 UTC (rev 4581)
@@ -0,0 +1,43 @@
+/*******************************************************************************
+NAME TRANSVERSE MERCATOR
+
+PURPOSE: Transforms input longitude and latitude to Easting and
+ Northing for the Transverse Mercator projection. The
+ longitude and latitude must be in radians. The Easting
+ and Northing values will be returned in meters.
+
+ALGORITHM REFERENCES
+
+1. Snyder, John P., "Map Projections--A Working Manual", U.S. Geological
+ Survey Professional Paper 1395 (Supersedes USGS Bulletin 1532), United
+ State Government Printing Office, Washington D.C., 1987.
+
+2. Snyder, John P. and Voxland, Philip M., "An Album of Map Projections",
+ U.S. Geological Survey Professional Paper 1453 , United State Government
+ Printing Office, Washington D.C., 1989.
+*******************************************************************************/
+
+
+/**
+ Initialize Transverse Mercator projection
+*/
+
+Proj4js.Proj.utm = {
+ dependsOn : 'tmerc',
+
+ init : function() {
+ if (!this.zone) {
+ Proj4js.reportError("utm:init: zone must be specified for UTM");
+ return;
+ }
+ this.lat0 = 0.0;
+ this.long0 = ((6 * Math.abs(this.zone)) - 183) * Proj4js.common.D2R;
+ this.x0 = 500000.0;
+ this.y0 = this.utmSouth ? 10000000.0 : 0.0;
+ this.k0 = 0.9996;
+
+ Proj4js.Proj['tmerc'].init.apply(this);
+ this.forward = Proj4js.Proj['tmerc'].forward;
+ this.inverse = Proj4js.Proj['tmerc'].inverse;
+ }
+};
\ No newline at end of file
Added: trunk/mapbender/http/extensions/proj4js/lib/projCode/vandg.js
===================================================================
--- trunk/mapbender/http/extensions/proj4js/lib/projCode/vandg.js (rev 0)
+++ trunk/mapbender/http/extensions/proj4js/lib/projCode/vandg.js 2009-08-31 13:30:38 UTC (rev 4581)
@@ -0,0 +1,137 @@
+/*******************************************************************************
+NAME VAN DER GRINTEN
+
+PURPOSE: Transforms input Easting and Northing to longitude and
+ latitude for the Van der Grinten projection. The
+ Easting and Northing must be in meters. The longitude
+ and latitude values will be returned in radians.
+
+PROGRAMMER DATE
+---------- ----
+T. Mittan March, 1993
+
+This function was adapted from the Van Der Grinten projection code
+(FORTRAN) in the General Cartographic Transformation Package software
+which is available from the U.S. Geological Survey National Mapping Division.
+
+ALGORITHM REFERENCES
+
+1. "New Equal-Area Map Projections for Noncircular Regions", John P. Snyder,
+ The American Cartographer, Vol 15, No. 4, October 1988, pp. 341-355.
+
+2. Snyder, John P., "Map Projections--A Working Manual", U.S. Geological
+ Survey Professional Paper 1395 (Supersedes USGS Bulletin 1532), United
+ State Government Printing Office, Washington D.C., 1987.
+
+3. "Software Documentation for GCTP General Cartographic Transformation
+ Package", U.S. Geological Survey National Mapping Division, May 1982.
+*******************************************************************************/
+
+Proj4js.Proj.vandg = {
+
+/* Initialize the Van Der Grinten projection
+ ----------------------------------------*/
+ init: function() {
+ this.R = 6370997.0; //Radius of earth
+ },
+
+ forward: function(p) {
+
+ var lon=p.x;
+ var lat=p.y;
+
+ /* Forward equations
+ -----------------*/
+ var dlon = Proj4js.common.adjust_lon(lon - this.long0);
+ var x,y;
+
+ if (Math.abs(lat) <= Proj4js.common.EPSLN) {
+ x = this.x0 + this.R * dlon;
+ y = this.y0;
+ }
+ var theta = Proj4js.common.asinz(2.0 * Math.abs(lat / Proj4js.common.PI));
+ if ((Math.abs(dlon) <= Proj4js.common.EPSLN) || (Math.abs(Math.abs(lat) - Proj4js.common.HALF_PI) <= Proj4js.common.EPSLN)) {
+ x = this.x0;
+ if (lat >= 0) {
+ y = this.y0 + Proj4js.common.PI * this.R * Math.tan(.5 * theta);
+ } else {
+ y = this.y0 + Proj4js.common.PI * this.R * - Math.tan(.5 * theta);
+ }
+ // return(OK);
+ }
+ var al = .5 * Math.abs((Proj4js.common.PI / dlon) - (dlon / Proj4js.common.PI));
+ var asq = al * al;
+ var sinth = Math.sin(theta);
+ var costh = Math.cos(theta);
+
+ var g = costh / (sinth + costh - 1.0);
+ var gsq = g * g;
+ var m = g * (2.0 / sinth - 1.0);
+ var msq = m * m;
+ var con = Proj4js.common.PI * this.R * (al * (g - msq) + Math.sqrt(asq * (g - msq) * (g - msq) - (msq + asq) * (gsq - msq))) / (msq + asq);
+ if (dlon < 0) {
+ con = -con;
+ }
+ x = this.x0 + con;
+ con = Math.abs(con / (Proj4js.common.PI * this.R));
+ if (lat >= 0) {
+ y = this.y0 + Proj4js.common.PI * this.R * Math.sqrt(1.0 - con * con - 2.0 * al * con);
+ } else {
+ y = this.y0 - Proj4js.common.PI * this.R * Math.sqrt(1.0 - con * con - 2.0 * al * con);
+ }
+ p.x = x;
+ p.y = y;
+ return p;
+ },
+
+/* Van Der Grinten inverse equations--mapping x,y to lat/long
+ ---------------------------------------------------------*/
+ inverse: function(p) {
+ var dlon;
+ var xx,yy,xys,c1,c2,c3;
+ var al,asq;
+ var a1;
+ var m1;
+ var con;
+ var th1;
+ var d;
+
+ /* inverse equations
+ -----------------*/
+ p.x -= this.x0;
+ p.y -= this.y0;
+ con = Proj4js.common.PI * this.R;
+ xx = p.x / con;
+ yy =p.y / con;
+ xys = xx * xx + yy * yy;
+ c1 = -Math.abs(yy) * (1.0 + xys);
+ c2 = c1 - 2.0 * yy * yy + xx * xx;
+ c3 = -2.0 * c1 + 1.0 + 2.0 * yy * yy + xys * xys;
+ d = yy * yy / c3 + (2.0 * c2 * c2 * c2 / c3 / c3 / c3 - 9.0 * c1 * c2 / c3 /c3) / 27.0;
+ a1 = (c1 - c2 * c2 / 3.0 / c3) / c3;
+ m1 = 2.0 * Math.sqrt( -a1 / 3.0);
+ con = ((3.0 * d) / a1) / m1;
+ if (Math.abs(con) > 1.0) {
+ if (con >= 0.0) {
+ con = 1.0;
+ } else {
+ con = -1.0;
+ }
+ }
+ th1 = Math.acos(con) / 3.0;
+ if (p.y >= 0) {
+ lat = (-m1 *Math.cos(th1 + Proj4js.common.PI / 3.0) - c2 / 3.0 / c3) * Proj4js.common.PI;
+ } else {
+ lat = -(-m1 * Math.cos(th1 + PI / 3.0) - c2 / 3.0 / c3) * Proj4js.common.PI;
+ }
+
+ if (Math.abs(xx) < Proj4js.common.EPSLN) {
+ lon = this.long0;
+ }
+ lon = Proj4js.common.adjust_lon(this.long0 + Proj4js.common.PI * (xys - 1.0 + Math.sqrt(1.0 + 2.0 * (xx * xx - yy * yy) + xys * xys)) / 2.0 / xx);
+
+ p.x=lon;
+ p.y=lat;
+ return p;
+ }
+};
Added: trunk/mapbender/http/extensions/proj4js/test/base.css
===================================================================
--- trunk/mapbender/http/extensions/proj4js/test/base.css (rev 0)
+++ trunk/mapbender/http/extensions/proj4js/test/base.css 2009-08-31 13:30:38 UTC (rev 4581)
@@ -0,0 +1,29 @@
+#footer {
+ margin-top: 20px;
+ border-top: 1px solid #eee;
+ padding: 10px;
+}
+body {
+ font-family:Verdana;
+}
+#header {
+ background: #9D9FA1;
+ color: #FFFFFF;
+ font-family: "Trebuchet MS", Helvetica, Arial, sans-serif;
+ font-size: 18px;
+ text-shadow: 2px 2px 3px gray;
+ height: 3em;
+ padding: 4px 16px 0px 16px;
+ vertical-align: top;
+ margin: -10px -5px 0px -5px;
+ border-bottom: 10px solid #e9eef9;
+}
+#header h1{margin-top: 0px;font-weight:normal;}
+#navbar { background-color: #eee; margin: 0px -5px 10px -5px; padding: 10px; }
+
+td {
+ font-size: 75%;
+}
+td.error {
+ background-color: red;
+}
Added: trunk/mapbender/http/extensions/proj4js/test/index.html
===================================================================
--- trunk/mapbender/http/extensions/proj4js/test/index.html (rev 0)
+++ trunk/mapbender/http/extensions/proj4js/test/index.html 2009-08-31 13:30:38 UTC (rev 4581)
@@ -0,0 +1,34 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
+<head>
+ <link href="base.css" type="text/css" rel="stylesheet"/>
+ <title>Proj4js Test Page</title>
+ <script src="../lib/proj4js.js"></script>
+ <script src="../lib/defs/EPSG42304.js"></script>
+ <script src="../lib/defs/EPSG25833.js"></script>
+ <script src="../lib/defs/EPSG27563.js"></script>
+ <script src="testdata.js"></script>
+ <script src="runtests.js"></script>
+</head>
+
+<body onload="runTests()">
+ <div id="header">
+ <h1>Proj4js test page</h1>
+ </div>
+ <div id="navbar">
+ <a href="http://trac.osgeo.org/proj4js">Proj4js Wiki/Trac</a> |
+ <a href="http://wiki.osgeo.org/wiki/MetaCRS">OSGeo MetaCRS</a> |
+ <a href="http://spatialreference.org/">spatialreference.org</a> |
+ <a href="http://communitymapbuilder.org/">MapBuilder</a> |
+ <a href="http://openlayers.org/">OpenLayers</a> |
+ </div>
+ <table id="testResult" border="1">
+ <tr>
+ <th>projection</th>
+ <th>class</th>
+ <th colspan="3">forward (m)</th>
+ <th colspan="3">inverse (dd)</th>
+ </tr>
+ </table>
+</body>
+</html>
\ No newline at end of file
Added: trunk/mapbender/http/extensions/proj4js/test/runtests.js
===================================================================
--- trunk/mapbender/http/extensions/proj4js/test/runtests.js (rev 0)
+++ trunk/mapbender/http/extensions/proj4js/test/runtests.js 2009-08-31 13:30:38 UTC (rev 4581)
@@ -0,0 +1,83 @@
+/* Loop through the test points and create a Proj object for each
+ */
+function runTests() {
+ for (var i=0; i < Proj4js.testPoints.length; ++i) {
+ var test = Proj4js.testPoints[i];
+ var proj = new Proj4js.Proj(test.code);
+ checkProjLoaded.call(proj, test);
+ }
+}
+
+/* a timer that waits for the readyToUse flag to be set. This gets called in
+ * the context of the Proj4js.Proj object
+ */
+function checkProjLoaded(test) {
+ if (!this.readyToUse) {
+ window.setTimeout(Proj4js.bind(checkProjLoaded, this, test), 500);
+ } else {
+ showResults(this, test);
+ }
+
+}
+
+/* a callback function to run the test for this test point since we are using
+ the dynamic load capabilities in the test page
+ */
+function showResults(proj, test) {
+ //var test = proj.testPoint;
+ var xyEPSLN = 1.0e-2;
+ var llEPSLN = 1.0e-6;
+ var row = document.createElement('tr');
+ var td = document.createElement('td');
+ td.innerHTML = test.code;
+ row.appendChild(td);
+ var td = document.createElement('td');
+ td.innerHTML = proj.projName;
+ row.appendChild(td);
+
+ //transform from lon/lat to projected x/y and cmopare
+ var xyResult = Proj4js.transform(Proj4js.WGS84, proj, new Proj4js.Point(test.ll));
+ if (xyResult) {
+ var deltaX = Math.abs(xyResult.x - test.xy[0]);
+ var deltaY = Math.abs(xyResult.y - test.xy[1]);
+ td = document.createElement('td');
+ td.innerHTML = "in:"+test.ll[0]+","+test.ll[1];
+ row.appendChild(td);
+ td = document.createElement('td');
+ td.innerHTML = "out:"+xyResult.x+","+xyResult.y;
+ row.appendChild(td);
+ td = document.createElement('td');
+ td.innerHTML = "dx:"+deltaX+ " dy:"+deltaY;
+ if ( deltaX>xyEPSLN || deltaY>xyEPSLN ) td.style.backgroundColor='red';
+ row.appendChild(td);
+ } else {
+ td = document.createElement('td');
+ td.innerHTML = "proj undefined";
+ row.appendChild(td);
+ }
+
+ //transform from map x/y to lon/lat and compare
+ var llResult = Proj4js.transform(proj, Proj4js.WGS84, new Proj4js.Point(test.xy));
+ if (llResult) {
+ var deltaX = Math.abs(llResult.x - test.ll[0]);
+ var deltaY = Math.abs(llResult.y - test.ll[1]);
+ td = document.createElement('td');
+ td.innerHTML = "in:"+test.xy[0]+","+test.xy[1];
+ row.appendChild(td);
+ td = document.createElement('td');
+ td.innerHTML = "out:"+llResult.x+","+llResult.y;
+ row.appendChild(td);
+ td = document.createElement('td');
+ td.innerHTML = "dx:"+deltaX+ " dy:"+deltaY;
+ if ( deltaX>llEPSLN || deltaY>llEPSLN ) td.style.backgroundColor='red';
+ row.appendChild(td);
+ } else {
+ td = document.createElement('td');
+ td.innerHTML = "proj undefined";
+ row.appendChild(td);
+ }
+
+ var testTable = document.getElementById('testResult');
+ testTable.tBodies[0].appendChild(row);
+};
+
Added: trunk/mapbender/http/extensions/proj4js/test/testdata.js
===================================================================
--- trunk/mapbender/http/extensions/proj4js/test/testdata.js (rev 0)
+++ trunk/mapbender/http/extensions/proj4js/test/testdata.js 2009-08-31 13:30:38 UTC (rev 4581)
@@ -0,0 +1,110 @@
+// a set of points in map XY and Lon/Lat that are supposed to correspond between
+// forward and invers transforms
+
+Proj4js.testPoints = [
+ {code: 'EPSG:3573',
+ xy: [2923052.02009, 1054885.46559],
+ ll: [9.84375, 61.875]
+ },
+ {code: 'EPSG:54009',
+ xy: [-10617602.79013849,4108337.84708608,0.00000000 ],
+ ll: [-119,34,0]
+ },
+
+ {code: 'EPSG:31466',
+ xy: [2547685.01212,5699155.7345],
+ ll: [6.685,51.425]
+ },
+ {code: 'EPSG:54029',
+ xy: [1094702.50,6496789.74,-6468.21],
+ ll: [11.0, 53.0,0.0]
+ },
+ {code: 'EPSG:54008',
+ xy: [738509.49,5874620.38],
+ ll: [11.0, 53.0]
+ },
+ {code: 'EPSG:29100',
+ xy: [5110899.06,10552971.81,-22.99],
+ ll: [-53.0, 5.0,0.0] /**
+ },
+ {code: 'EPSG:2057',
+ xy: [-11608322.26,18282612.23,-281.67],
+ ll: [-53.0, 5.0,0.0]
+ },
+ {code: 'EPSG:54009',
+ xy: [804759.21,6164983.82,-13598.03],
+ ll: [11.0, 53.0, 0.0]
+ },
+ {code: 'EPSG:54003',
+ xy: [1223145.57,6491218.13,-6468.21],
+ ll: [11.0, 53.0]
+ },
+ {code: 'EPSG:3035',
+ xy: [4388138.60, 3321736.46],
+ ll: [11.0, 53.0]
+ },
+ {code: 'EPSG:102026',
+ xy: [3000242.40, 5092492.64],
+ ll: [40.0, 40.0]
+ },
+ {code: 'EPSG:54032',
+ xy: [-4024426.19, 6432026.98],
+ ll: [-127.0, 52.11]
+ },
+ {code: 'EPSG:3153',
+ xy: [931625.91, 789252.65],
+ ll: [-127.0, 52.11]
+ },
+ {code: 'EPSG:27492',
+ xy: [25260.493584, -9579.245052],
+ ll: [-7.84, 39.58]
+ },
+ {code: 'EPSG:27700',
+ xy: [343733.14, 612144.53, -51.89],
+ ll: [-2.89, 55.4, 0]
+ },
+ {code: 'EPSG:32615',
+ xy: [500000, 4649776.22482],
+ ll: [-93, 42]
+ },
+ {code: 'EPSG:32612',
+ xy: [383357.429537, 6684599.06392],
+ ll: [-113.109375, 60.28125]
+ },
+ {code: 'EPSG:3031',
+ xy: [-992481.633786, 628482.06328],
+ ll: [-57.65625, -79.21875]
+ },
+ {code: 'EPSG:31285',
+ xy: [450055.70, 5262356.33],
+ ll: [13.33333333333, 47.5]
+ },
+ {code: 'EPSG:27563',
+ xy: [653704.865208, 176887.660037],
+ ll: [3.005, 43.89]
+ },
+ {code: 'EPSG:2736',
+ xy: [603933.40, 7677505.64],
+ ll: [34.0, -21.0]
+ },
+ {code: 'EPSG:42304',
+ xy: [-358185.267976, -40271.099023],
+ ll: [-99.84375, 48.515625]
+ },
+ {code: 'google',
+ xy: [-8531595.34908, 6432756.94421],
+ ll: [-76.640625, 49.921875]
+ },
+ {code: 'EPSG:42304',
+ xy: [-358185.267976, -40271.099023],
+ ll: [-99.84375, 48.515625]
+ },
+ {code: 'EPSG:28992',
+ xy: [148312.15, 457804.79, 698.48],
+ ll: [5.29, 52.11]
+ },
+ {code: 'EPSG:2403',
+ xy: [27500000.00, 4198690.08, -109.02],
+ ll: [81, 37.92, 0] ****/
+ }
+];
\ No newline at end of file
Added: trunk/mapbender/http/extensions/proj4js/tools/README.txt
===================================================================
--- trunk/mapbender/http/extensions/proj4js/tools/README.txt (rev 0)
+++ trunk/mapbender/http/extensions/proj4js/tools/README.txt 2009-08-31 13:30:38 UTC (rev 4581)
@@ -0,0 +1,7 @@
+This directory contains tools used in the packaging or deployment of proj4js.
+
+Javascript minimizing tools:
+
+ * jsmin.c, jsmin.py:
+ jsmin.py is a direct translation of the jsmin.c code into Python. jsmin.py
+ will therefore run anyplace Python runs... but at significantly slower speed.
Added: trunk/mapbender/http/extensions/proj4js/tools/catalogues/CRS
===================================================================
--- trunk/mapbender/http/extensions/proj4js/tools/catalogues/CRS (rev 0)
+++ trunk/mapbender/http/extensions/proj4js/tools/catalogues/CRS 2009-08-31 13:30:38 UTC (rev 4581)
@@ -0,0 +1,2 @@
+# WGS 84 longitude - latitude
+<84> +title=WGS 84 longitude-latitude +proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs <>
Added: trunk/mapbender/http/extensions/proj4js/tools/catalogues/EPSG
===================================================================
--- trunk/mapbender/http/extensions/proj4js/tools/catalogues/EPSG (rev 0)
+++ trunk/mapbender/http/extensions/proj4js/tools/catalogues/EPSG 2009-08-31 13:30:38 UTC (rev 4581)
@@ -0,0 +1,220 @@
+# CH1903
+<4149> +title=CH1903 +proj=longlat +ellps=bessel +towgs84=674.374,15.056,405.346,0,0,0,0 +no_defs <>
+# CH1903+
+<4150> +title=CH1903plus +proj=longlat +ellps=bessel +towgs84=674.374,15.056,405.346,0,0,0,0 +no_defs <>
+# CHTRF95
+<4151> +title=CHTRF95 +proj=longlat +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +no_defs <>
+# RGF93
+<4171> +title=RGF93 +proj=longlat +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +no_defs <>
+# ED50
+<4230> +title=ED50 +proj=longlat +ellps=intl +no_defs <>
+# Guyane Francaise
+<4235> +title=Guyane Francaise +proj=longlat +ellps=intl +no_defs <>
+# ETRS89
+<4258> +title=ETRS89 +proj=longlat +ellps=GRS80 +no_defs <>
+# NTF
+<4275> +title=NTF +proj=longlat +a=6378249.2 +b=6356515 +towgs84=-168,-60,320,0,0,0,0 +no_defs <>
+# WGS 72
+<4322> +title=WGS 72 +proj=longlat +ellps=WGS72 +no_defs <>
+# WGS 84
+<4326> +title=WGS 84 +proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs <>
+# Fort Marigot
+<4621> +title=Fort Marigot +proj=longlat +ellps=intl +towgs84=137,248,-430,0,0,0,0 +no_defs <>
+# Guadeloupe 1948
+<4622> +title=Guadeloupe 1948 +proj=longlat +ellps=intl +no_defs <>
+# CSG67
+<4623> +title=CSG67 +proj=longlat +ellps=intl +towgs84=-186,230,110,0,0,0,0 +no_defs <>
+# RGFG95
+<4624> +title=RGFG95 +proj=longlat +ellps=GRS80 +towgs84=2,2,-2,0,0,0,0 +no_defs <>
+# Martinique 1938
+<4625> +title=Martinique 1938 +proj=longlat +ellps=intl +no_defs <>
+# Reunion 1947
+<4626> +title=Reunion 1947 +proj=longlat +ellps=intl +no_defs <>
+# RGR92
+<4627> +title=RGR92 +proj=longlat +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +no_defs <>
+# Tahiti 52
+<4628> +title=Tahiti 52 +proj=longlat +ellps=intl +towgs84=162,117,154,0,0,0,0 +no_defs <>
+# Tahaa 54
+<4629> +title=Tahaa 54 +proj=longlat +ellps=intl +no_defs <>
+# IGN72 Nuku Hiva
+<4630> +title=IGN72 Nuku Hiva +proj=longlat +ellps=intl +no_defs <>
+# Combani 1950
+<4632> +title=Combani 1950 +proj=longlat +ellps=intl +towgs84=-382,-59,-262,0,0,0,0 +no_defs <>
+# IGN56 Lifou
+<4633> +title=IGN56 Lifou +proj=longlat +ellps=intl +no_defs <>
+# IGN72 Grand Terre
+<4634> +title=IGN72 Grand Terre +proj=longlat +ellps=intl +no_defs <>
+# Perroud 1950
+<4637> +title=Perroud 1950 +proj=longlat +ellps=intl +towgs84=325,154,172,0,0,0,0 +no_defs <>
+# Saint Pierre et Miquelon 1950
+<4638> +title=Saint Pierre et Miquelon 1950 +proj=longlat +ellps=clrk66 +towgs84=30,430,368,0,0,0,0 +no_defs <>
+# RRAF 1991
+<4640> +title=RRAF 1991 +proj=longlat +ellps=WGS84 +towgs84=0,0,0,0,0,0,0 +no_defs <>
+# IGN53 Mare
+<4641> +title=IGN53 Mare +proj=longlat +ellps=intl +no_defs <>
+# RGNC 1991
+<4645> +title=RGNC 1991 +proj=longlat +ellps=intl +towgs84=0,0,0,0,0,0,0 +no_defs <>
+# IGN72 Grande Terre
+<4662> +title=IGN72 Grande Terre +proj=longlat +ellps=intl +no_defs <>
+# IGN63 Hiva Oa
+<4689> +title=IGN63 Hiva Oa +proj=longlat +ellps=intl +no_defs <>
+# Tahiti 79
+<4690> +title=Tahiti 79 +proj=longlat +ellps=intl +no_defs <>
+# Moorea 87
+<4691> +title=Moorea 87 +proj=longlat +ellps=intl +towgs84=215.525,149.593,176.229,-3.2624,-1.692,-1.1571,10.4773 +no_defs <>
+# Maupiti 83
+<4692> +title=Maupiti 83 +proj=longlat +ellps=intl +towgs84=217.037,86.959,23.956,0,0,0,0 +no_defs <>
+# IGN 1962 Kerguelen
+<4698> +title=IGN 1962 Kerguelen +proj=longlat +ellps=intl +towgs84=145,-187,103,0,0,0,0 +no_defs <>
+# RGNC91-93
+<4749> +title=RGNC91-93 +proj=longlat +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +no_defs <>
+# ST87 Ouvea
+<4750> +title=ST87 Ouvea +proj=longlat +ellps=WGS84 +towgs84=-56.263,16.136,-22.856,0,0,0,0 +no_defs <>
+# NTF (Paris)
+<4807> +title=NTF (Paris) +proj=longlat +a=6378249.2 +b=6356515 +towgs84=-168,-60,320,0,0,0,0 +pm=paris +no_defs <>
+# CH1903+ / LV95
+<2056> +title=CH1903+ / LV95 +proj=somerc +lat_0=46.95240555555556 +lon_0=7.439583333333333 +x_0=2600000 +y_0=1200000 +ellps=bessel +towgs84=674.374,15.056,405.346,0,0,0,0 +units=m +no_defs <>
+# RGF93 / Lambert-93
+<2154> +title=RGF93 / Lambert-93 +proj=lcc +lat_1=49 +lat_2=44 +lat_0=46.5 +lon_0=3 +x_0=700000 +y_0=6600000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <>
+# ETRS89 / TM 30 NE
+<2213> +title=ETRS89 / TM 30 NE +proj=tmerc +lat_0=0 +lon_0=30 +k=0.9996 +x_0=500000 +y_0=0 +ellps=GRS80 +units=m +no_defs <>
+# Fort Marigot / UTM zone 20N
+<2969> +title=Fort Marigot / UTM zone 20N +proj=utm +zone=20 +ellps=intl +towgs84=137,248,-430,0,0,0,0 +units=m +no_defs <>
+# Guadeloupe 1948 / UTM zone 20N
+<2970> +title=Guadeloupe 1948 / UTM zone 20N +proj=utm +zone=20 +ellps=intl +units=m +no_defs <>
+# CSG67 / UTM zone 22N
+<2971> +title=CSG67 / UTM zone 22N +proj=utm +zone=22 +ellps=intl +towgs84=-186,230,110,0,0,0,0 +units=m +no_defs <>
+# RGFG95 / UTM zone 22N
+<2972> +title=RGFG95 / UTM zone 22N +proj=utm +zone=22 +ellps=GRS80 +towgs84=2,2,-2,0,0,0,0 +units=m +no_defs <>
+# Martinique 1938 / UTM zone 20N
+<2973> +title=Martinique 1938 / UTM zone 20N +proj=utm +zone=20 +ellps=intl +units=m +no_defs <>
+# RGR92 / UTM zone 40S
+<2975> +title=RGR92 / UTM zone 40S +proj=utm +zone=40 +south +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <>
+# Tahiti 52 / UTM zone 6S
+<2976> +title=Tahiti 52 / UTM zone 6S +proj=utm +zone=6 +south +ellps=intl +towgs84=162,117,154,0,0,0,0 +units=m +no_defs <>
+# Tahaa 54 / UTM zone 5S
+<2977> +title=Tahaa 54 / UTM zone 5S +proj=utm +zone=5 +south +ellps=intl +units=m +no_defs <>
+# IGN72 Nuku Hiva / UTM zone 7S
+<2978> +title=IGN72 Nuku Hiva / UTM zone 7S +proj=utm +zone=7 +south +ellps=intl +units=m +no_defs <>
+# Combani 1950 / UTM zone 38S
+<2980> +title=Combani 1950 / UTM zone 38S +proj=utm +zone=38 +south +ellps=intl +towgs84=-382,-59,-262,0,0,0,0 +units=m +no_defs <>
+# IGN56 Lifou / UTM zone 58S
+<2981> +title=IGN56 Lifou / UTM zone 58S +proj=utm +zone=58 +south +ellps=intl +units=m +no_defs <>
+# IGN72 Grand Terre / UTM zone 58S (deprecated)
+<2982> +title=IGN72 Grand Terre / UTM zone 58S (deprecated) +proj=utm +zone=58 +south +ellps=intl +units=m +no_defs <>
+# RGNC 1991 / Lambert New Caledonia (deprecated)
+<2984> +title=RGNC 1991 / Lambert New Caledonia (deprecated) +proj=lcc +lat_1=-20.66666666666667 +lat_2=-22.33333333333333 +lat_0=-21.5 +lon_0=166 +x_0=400000 +y_0=300000 +ellps=intl +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <>
+# Saint Pierre et Miquelon 1950 / UTM zone 21N
+<2987> +title=Saint Pierre et Miquelon 1950 / UTM zone 21N +proj=utm +zone=21 +ellps=clrk66 +towgs84=30,430,368,0,0,0,0 +units=m +no_defs <>
+# RRAF 1991 / UTM zone 20N
+<2989> +title=RRAF 1991 / UTM zone 20N +proj=utm +zone=20 +ellps=WGS84 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <>
+# Reunion 1947 / TM Reunion (deprecated)
+<2990> +title=Reunion 1947 / TM Reunion (deprecated) +proj=tmerc +lat_0=-21.11666666666667 +lon_0=55.53333333333333 +k=1 +x_0=50000 +y_0=160000 +ellps=intl +units=m +no_defs <>
+# IGN53 Mare / UTM zone 58S
+<2995> +title=IGN53 Mare / UTM zone 58S +proj=utm +zone=58 +south +ellps=intl +units=m +no_defs <>
+# ETRS89 / ETRS-LCC
+<3034> +title=ETRS89 / ETRS-LCC +proj=lcc +lat_1=35 +lat_2=65 +lat_0=52 +lon_0=10 +x_0=4000000 +y_0=2800000 +ellps=GRS80 +units=m +no_defs <>
+# ETRS89 / ETRS-LAEA
+<3035> +title=ETRS89 / ETRS-LAEA +proj=laea +lat_0=52 +lon_0=10 +x_0=4321000 +y_0=3210000 +ellps=GRS80 +units=m +no_defs <>
+# ETRS89 / ETRS-TM30
+<3042> +title=ETRS89 / ETRS-TM30 +proj=utm +zone=30 +ellps=GRS80 +units=m +no_defs <>
+# ETRS89 / ETRS-TM31
+<3043> +title=ETRS89 / ETRS-TM31 +proj=utm +zone=31 +ellps=GRS80 +units=m +no_defs <>
+# ETRS89 / ETRS-TM32
+<3044> +title=ETRS89 / ETRS-TM32 +proj=utm +zone=32 +ellps=GRS80 +units=m +no_defs <>
+# IGN72 Grande Terre / UTM zone 58S
+<3060> +title=IGN72 Grande Terre / UTM zone 58S +proj=utm +zone=58 +south +ellps=intl +units=m +no_defs <>
+# RGNC91-93 / Lambert New Caledonia
+<3163> +title=RGNC91-93 / Lambert New Caledonia +proj=lcc +lat_1=-20.66666666666667 +lat_2=-22.33333333333333 +lat_0=-21.5 +lon_0=166 +x_0=400000 +y_0=300000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <>
+# ST87 Ouvea / UTM zone 58S
+<3164> +title=ST87 Ouvea / UTM zone 58S +proj=utm +zone=58 +south +ellps=WGS84 +towgs84=-56.263,16.136,-22.856,0,0,0,0 +units=m +no_defs <>
+# NEA74 Noumea / Noumea Lambert
+<3165> +title=NEA74 Noumea / Noumea Lambert +proj=lcc +lat_1=-22.24469175 +lat_2=-22.29469175 +lat_0=-22.26969175 +lon_0=166.44242575 +x_0=0.66 +y_0=1.02 +ellps=intl +units=m +no_defs <>
+# NEA74 Noumea / Noumea Lambert 2
+<3166> +title=NEA74 Noumea / Noumea Lambert 2 +proj=lcc +lat_1=-22.24472222222222 +lat_2=-22.29472222222222 +lat_0=-22.26972222222222 +lon_0=166.4425 +x_0=8.313000000000001 +y_0=-2.354 +ellps=intl +units=m +no_defs <>
+# RGNC91-93 / UTM zone 57S
+<3169> +title=RGNC91-93 / UTM zone 57S +proj=utm +zone=57 +south +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <>
+# RGNC91-93 / UTM zone 58S
+<3170> +title=RGNC91-93 / UTM zone 58S +proj=utm +zone=58 +south +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <>
+# RGNC91-93 / UTM zone 59S
+<3171> +title=RGNC91-93 / UTM zone 59S +proj=utm +zone=59 +south +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <>
+# IGN53 Mare / UTM zone 59S
+<3172> +title=IGN53 Mare / UTM zone 59S +proj=utm +zone=59 +south +ellps=intl +units=m +no_defs <>
+# RGPF / UTM zone 5S
+<3296> +title=RGPF / UTM zone 5S +proj=utm +zone=5 +south +ellps=GRS80 +units=m +no_defs <>
+# RGPF / UTM zone 6S
+<3297> +title=RGPF / UTM zone 6S +proj=utm +zone=6 +south +ellps=GRS80 +units=m +no_defs <>
+# RGPF / UTM zone 7S
+<3298> +title=RGPF / UTM zone 7S +proj=utm +zone=7 +south +ellps=GRS80 +units=m +no_defs <>
+# RGPF / UTM zone 8S
+<3299> +title=RGPF / UTM zone 8S +proj=utm +zone=8 +south +ellps=GRS80 +units=m +no_defs <>
+# IGN63 Hiva Oa / UTM zone 7S
+<3302> +title=IGN63 Hiva Oa / UTM zone 7S +proj=utm +zone=7 +south +ellps=intl +units=m +no_defs <>
+# Fatu Iva 72 / UTM zone 7S
+<3303> +title=Fatu Iva 72 / UTM zone 7S +proj=utm +zone=7 +south +ellps=intl +towgs84=347.103,1078.12,2623.92,-33.8875,70.6773,-9.3943,186.074 +units=m +no_defs <>
+# Tahiti 79 / UTM zone 6S
+<3304> +title=Tahiti 79 / UTM zone 6S +proj=utm +zone=6 +south +ellps=intl +units=m +no_defs <>
+# Moorea 87 / UTM zone 6S
+<3305> +title=Moorea 87 / UTM zone 6S +proj=utm +zone=6 +south +ellps=intl +towgs84=215.525,149.593,176.229,-3.2624,-1.692,-1.1571,10.4773 +units=m +no_defs <>
+# Maupiti 83 / UTM zone 5S
+<3306> +title=Maupiti 83 / UTM zone 5S +proj=utm +zone=5 +south +ellps=intl +towgs84=217.037,86.959,23.956,0,0,0,0 +units=m +no_defs <>
+# CSG67 / UTM zone 21N
+<3312> +title=CSG67 / UTM zone 21N +proj=utm +zone=21 +ellps=intl +towgs84=-186,230,110,0,0,0,0 +units=m +no_defs <>
+# RGFG95 / UTM zone 21N
+<3313> +title=RGFG95 / UTM zone 21N +proj=utm +zone=21 +ellps=GRS80 +towgs84=2,2,-2,0,0,0,0 +units=m +no_defs <>
+# IGN 1962 Kerguelen / UTM zone 42S
+<3336> +title=IGN 1962 Kerguelen / UTM zone 42S +proj=utm +zone=42 +south +ellps=intl +towgs84=145,-187,103,0,0,0,0 +units=m +no_defs <>
+# WGS 84 / World Mercator
+<3395> +title=WGS 84 / World Mercator +proj=merc +lon_0=0 +k=1 +x_0=0 +y_0=0 +ellps=WGS84 +datum=WGS84 +units=m +no_defs <>
+# Reunion 1947 / TM Reunion
+<3727> +title=Reunion 1947 / TM Reunion +proj=tmerc +lat_0=-21.11666666666667 +lon_0=55.53333333333333 +k=1 +x_0=160000 +y_0=50000 +ellps=intl +units=m +no_defs <>
+# CH1903 / LV03
+<21781> +title=CH1903 / LV03 +proj=somerc +lat_0=46.95240555555556 +lon_0=7.439583333333333 +x_0=600000 +y_0=200000 +ellps=bessel +towgs84=674.374,15.056,405.346,0,0,0,0 +units=m +no_defs <>
+# ETRS89 / UTM zone 30N
+<25830> +title=ETRS89 / UTM zone 30N +proj=utm +zone=30 +ellps=GRS80 +units=m +no_defs <>
+# ETRS89 / UTM zone 31N
+<25831> +title=ETRS89 / UTM zone 31N +proj=utm +zone=31 +ellps=GRS80 +units=m +no_defs <>
+# ETRS89 / UTM zone 32N
+<25832> +title=ETRS89 / UTM zone 32N +proj=utm +zone=32 +ellps=GRS80 +units=m +no_defs <>
+# NTF (Paris) / Lambert Nord France
+<27561> +title=NTF (Paris) / Lambert Nord France +proj=lcc +lat_1=49.50000000000001 +lat_0=49.50000000000001 +lon_0=0 +k_0=0.999877341 +x_0=600000 +y_0=200000 +a=6378249.2 +b=6356515 +towgs84=-168,-60,320,0,0,0,0 +pm=paris +units=m +no_defs <>
+# NTF (Paris) / Lambert Centre France
+<27562> +title=NTF (Paris) / Lambert Centre France +proj=lcc +lat_1=46.8 +lat_0=46.8 +lon_0=0 +k_0=0.99987742 +x_0=600000 +y_0=200000 +a=6378249.2 +b=6356515 +towgs84=-168,-60,320,0,0,0,0 +pm=paris +units=m +no_defs <>
+# NTF (Paris) / Lambert Sud France
+<27563> +title=NTF (Paris) / Lambert Sud France +proj=lcc +lat_1=44.10000000000001 +lat_0=44.10000000000001 +lon_0=0 +k_0=0.9998774990000001 +x_0=600000 +y_0=200000 +a=6378249.2 +b=6356515 +towgs84=-168,-60,320,0,0,0,0 +pm=paris +units=m +no_defs <>
+# NTF (Paris) / Lambert Corse
+<27564> +title=NTF (Paris) / Lambert Corse +proj=lcc +lat_1=42.16500000000001 +lat_0=42.16500000000001 +lon_0=0 +k_0=0.9999447100000001 +x_0=234.358 +y_0=185861.369 +a=6378249.2 +b=6356515 +towgs84=-168,-60,320,0,0,0,0 +pm=paris +units=m +no_defs <>
+# NTF (Paris) / Lambert zone I
+<27571> +title=NTF (Paris) / Lambert zone I +proj=lcc +lat_1=49.50000000000001 +lat_0=49.50000000000001 +lon_0=0 +k_0=0.999877341 +x_0=600000 +y_0=1200000 +a=6378249.2 +b=6356515 +towgs84=-168,-60,320,0,0,0,0 +pm=paris +units=m +no_defs <>
+# NTF (Paris) / Lambert zone II
+<27572> +title=NTF (Paris) / Lambert zone II +proj=lcc +lat_1=46.8 +lat_0=46.8 +lon_0=0 +k_0=0.99987742 +x_0=600000 +y_0=2200000 +a=6378249.2 +b=6356515 +towgs84=-168,-60,320,0,0,0,0 +pm=paris +units=m +no_defs <>
+# NTF (Paris) / Lambert zone III
+<27573> +title=NTF (Paris) / Lambert zone III +proj=lcc +lat_1=44.10000000000001 +lat_0=44.10000000000001 +lon_0=0 +k_0=0.9998774990000001 +x_0=600000 +y_0=3200000 +a=6378249.2 +b=6356515 +towgs84=-168,-60,320,0,0,0,0 +pm=paris +units=m +no_defs <>
+# NTF (Paris) / Lambert zone IV
+<27574> +title=NTF (Paris) / Lambert zone IV +proj=lcc +lat_1=42.16500000000001 +lat_0=42.16500000000001 +lon_0=0 +k_0=0.9999447100000001 +x_0=234.358 +y_0=4185861.369 +a=6378249.2 +b=6356515 +towgs84=-168,-60,320,0,0,0,0 +pm=paris +units=m +no_defs <>
+# NTF (Paris) / France I (deprecated)
+<27581> +title=NTF (Paris) / France I (deprecated) +proj=lcc +lat_1=49.50000000000001 +lat_0=49.50000000000001 +lon_0=0 +k_0=0.999877341 +x_0=600000 +y_0=1200000 +a=6378249.2 +b=6356515 +towgs84=-168,-60,320,0,0,0,0 +pm=paris +units=m +no_defs <>
+# NTF (Paris) / France II (deprecated)
+<27582> +title=NTF (Paris) / France II (deprecated) +proj=lcc +lat_1=46.8 +lat_0=46.8 +lon_0=0 +k_0=0.99987742 +x_0=600000 +y_0=2200000 +a=6378249.2 +b=6356515 +towgs84=-168,-60,320,0,0,0,0 +pm=paris +units=m +no_defs <>
+# NTF (Paris) / France III (deprecated)
+<27583> +title=NTF (Paris) / France III (deprecated) +proj=lcc +lat_1=44.10000000000001 +lat_0=44.10000000000001 +lon_0=0 +k_0=0.9998774990000001 +x_0=600000 +y_0=3200000 +a=6378249.2 +b=6356515 +towgs84=-168,-60,320,0,0,0,0 +pm=paris +units=m +no_defs <>
+# NTF (Paris) / France IV (deprecated)
+<27584> +title=NTF (Paris) / France IV (deprecated) +proj=lcc +lat_1=42.16500000000001 +lat_0=42.16500000000001 +lon_0=0 +k_0=0.9999447100000001 +x_0=234.358 +y_0=4185861.369 +a=6378249.2 +b=6356515 +towgs84=-168,-60,320,0,0,0,0 +pm=paris +units=m +no_defs <>
+# NTF (Paris) / Nord France (deprecated)
+<27591> +title=NTF (Paris) / Nord France (deprecated) +proj=lcc +lat_1=49.50000000000001 +lat_0=49.50000000000001 +lon_0=0 +k_0=0.999877341 +x_0=600000 +y_0=200000 +a=6378249.2 +b=6356515 +towgs84=-168,-60,320,0,0,0,0 +pm=paris +units=m +no_defs <>
+# NTF (Paris) / Centre France (deprecated)
+<27592> +title=NTF (Paris) / Centre France (deprecated) +proj=lcc +lat_1=46.8 +lat_0=46.8 +lon_0=0 +k_0=0.99987742 +x_0=600000 +y_0=200000 +a=6378249.2 +b=6356515 +towgs84=-168,-60,320,0,0,0,0 +pm=paris +units=m +no_defs <>
+# NTF (Paris) / Sud France (deprecated)
+<27593> +title=NTF (Paris) / Sud France (deprecated) +proj=lcc +lat_1=44.10000000000001 +lat_0=44.10000000000001 +lon_0=0 +k_0=0.9998774990000001 +x_0=600000 +y_0=200000 +a=6378249.2 +b=6356515 +towgs84=-168,-60,320,0,0,0,0 +pm=paris +units=m +no_defs <>
+# NTF (Paris) / Corse (deprecated)
+<27594> +title=NTF (Paris) / Corse (deprecated) +proj=lcc +lat_1=42.16500000000001 +lat_0=42.16500000000001 +lon_0=0 +k_0=0.9999447100000001 +x_0=234.358 +y_0=185861.369 +a=6378249.2 +b=6356515 +towgs84=-168,-60,320,0,0,0,0 +pm=paris +units=m +no_defs <>
+# WGS 84 / Plate Carree
+<32662> +title=WGS 84 / Plate Carree +proj=eqc +lat_ts=0 +lon_0=0 +x_0=0 +y_0=0 +ellps=WGS84 +datum=WGS84 +units=m +no_defs <>
+# WGS 84 / UTM zone 1S
+<32701> +title=WGS 84 / UTM zone 1S +proj=utm +zone=1 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs <>
+# WGS 84 / UTM zone 39S
+<32739> +title=WGS 84 / UTM zone 39S +proj=utm +zone=39 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs <>
+# WGS 84 / UTM zone 42S
+<32742> +title=WGS 84 / UTM zone 42S +proj=utm +zone=42 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs <>
+# WGS 84 / UTM zone 43S
+<32743> +title=WGS 84 / UTM zone 43S +proj=utm +zone=43 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs <>
Added: trunk/mapbender/http/extensions/proj4js/tools/catalogues/IGNF
===================================================================
--- trunk/mapbender/http/extensions/proj4js/tools/catalogues/IGNF (rev 0)
+++ trunk/mapbender/http/extensions/proj4js/tools/catalogues/IGNF 2009-08-31 13:30:38 UTC (rev 4581)
@@ -0,0 +1,128 @@
+<CROZ63> +title=Crozet 1963 +proj=geocent +towgs84=0.0000,0.0000,0.0000 +a=6378388.0000 +rf=297.0000000000000 +units=m +no_defs <>
+<CSG67> +title=Guyane CSG67 +proj=geocent +towgs84=-193.0660,236.9930,105.4470,0.4814,-0.8074,0.1276,1.564900 +a=6378388.0000 +rf=297.0000000000000 +units=m +no_defs <>
+<ED50> +title=ED50 +proj=geocent +towgs84=-84.0000,-97.0000,-117.0000 +a=6378388.0000 +rf=297.0000000000000 +units=m +no_defs <>
+<GUAD48> +title=Guadeloupe Ste Anne +proj=geocent +towgs84=-472.2900,-5.6300,-304.1200,0.4362,-0.8374,0.2563,1.898400 +a=6378388.0000 +rf=297.0000000000000 +units=m +no_defs <>
+<GUADFM49> +title=Guadeloupe Fort Marigot +proj=geocent +towgs84=136.5960,248.1480,-429.7890 +a=6378388.0000 +rf=297.0000000000000 +units=m +no_defs <>
+<IGN63> +title=IGN 1963 (Hiva Oa, Tahuata, Mohotani) +proj=geocent +towgs84=410.7210,55.0490,80.7460,-2.5779,-2.3514,-0.6664,17.331100 +a=6378388.0000 +rf=297.0000000000000 +units=m +no_defs <>
+<IGN72> +title=IGN 1972 Grande-Terre / Ile des Pins +proj=geocent +towgs84=-11.6400,-348.6000,291.6800 +a=6378388.0000 +rf=297.0000000000000 +units=m +no_defs <>
+# W [JULES55]
+<KERG62CAR> +title=Kerguelen - K0 +proj=geocent +towgs84=145.0000,-187.0000,103.0000 +a=6378388.0000 +rf=297.0000000000000 +units=m +no_defs <>
+<MART38> +title=Martinique Fort-Desaix +proj=geocent +towgs84=126.9260,547.9390,130.4090,-2.7867,5.1612,-0.8584,13.822650 +a=6378388.0000 +rf=297.0000000000000 +units=m +no_defs <>
+# W [MAUPITI]
+<MAYO50> +title=Mayotte Combani +proj=geocent +towgs84=-599.9280,-275.5520,-195.6650,-0.0835,-0.4715,0.0602,49.281400 +a=6378388.0000 +rf=297.0000000000000 +units=m +no_defs <>
+<MOOREA87> +title=Moorea 1987 +proj=geocent +towgs84=215.9820,149.5930,176.2290,3.2624,1.6920,1.1571,10.477300 +a=6378388.0000 +rf=297.0000000000000 +units=m +no_defs <>
+<NTF> +title=Nouvelle Triangulation Francaise +proj=geocent +nadgrids=ntf_r93.gsb,null +towgs84=-168.0000,-60.0000,320.0000 +a=6378249.2000 +rf=293.4660210000000 +units=m +no_defs <>
+<NUKU72> +title=IGN 1972 Nuku Hiva +proj=geocent +towgs84=165.7320,216.7200,180.5050,-0.6434,-0.4512,-0.0791,7.420400 +a=6378388.0000 +rf=297.0000000000000 +units=m +no_defs <>
+<REUN47> +title=Reunion 1947 +proj=geocent +towgs84=789.5240,-626.4860,-89.9040,0.6006,76.7946,-10.5788,-32.324100 +a=6378388.0000 +rf=297.0000000000000 +units=m +no_defs <>
+<RGF93> +title=Reseau geodesique francais 1993 +proj=geocent +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +units=m +no_defs <>
+<RGFG95> +title=Reseau geodesique francais de Guyane 1995 +proj=geocent +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +units=m +no_defs <>
+<RGM04> +title=RGM04 (Reseau Geodesique de Mayotte 2004) +proj=geocent +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +units=m +no_defs <>
+<RGNC> +title=Reseau Geodesique de Nouvelle-Caledonie +proj=geocent +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +units=m +no_defs <>
+<RGPF> +title=RGPF (Reseau Geodesique de Polynesie Francaise) +proj=geocent +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +units=m +no_defs <>
+<RGR92> +title=Reseau geodesique Reunion 1992 +proj=geocent +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +units=m +no_defs <>
+<RGSPM06> +title=Reseau Geodesique Saint-Pierre-et-Miquelon (2006) +proj=geocent +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +units=m +no_defs <>
+<RRAF91> +title=RRAF 1991 (Reseau de Reference des Antilles Francaises) +proj=geocent +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +units=m +no_defs <>
+<STPM50> +title=St Pierre et Miquelon 1950 +proj=geocent +towgs84=-95.5930,573.7630,173.4420,-0.9602,1.2510,-1.3918,42.626500 +a=6378206.4000 +rf=294.9786982000000 +units=m +no_defs <>
+<TAHAA> +title=Raiatea - Tahaa 51-54 (Tahaa, Base Terme Est) +proj=geocent +towgs84=72.4380,345.9180,79.4860,-1.6045,-0.8823,-0.5565,1.374600 +a=6378388.0000 +rf=297.0000000000000 +units=m +no_defs <>
+<TAHI79> +title=IGN79 (Tahiti) Iles de la Societe +proj=geocent +towgs84=221.5250,152.9480,176.7680,2.3847,1.3896,0.8770,11.474100 +a=6378388.0000 +rf=297.0000000000000 +units=m +no_defs <>
+<TERA50> +title=Pointe Geologie - Perroud 1950 +proj=geocent +towgs84=324.8000,153.6000,172.1000 +a=6378388.0000 +rf=297.0000000000000 +units=m +no_defs <>
+<WALL78> +title=Wallis-Uvea 1978 (MOP78) +proj=geocent +towgs84=253.0000,-133.0000,-127.0000 +a=6378388.0000 +rf=297.0000000000000 +units=m +no_defs <>
+<WGS72> +title=World Geodetic System 1972 +proj=geocent +towgs84=0.0000,12.0000,6.0000 +a=6378135.0000 +rf=298.2600000000000 +units=m +no_defs <>
+<WGS84> +title=World Geodetic System 1984 +proj=geocent +towgs84=0.0000,0.0000,0.0000,0.0000,0.0000,0.0000,0.000000 +a=6378137.0000 +rf=298.2572221010000 +units=m +no_defs <>
+<CROZ63GEO> +title=Crozet 1963 +proj=longlat +towgs84=0.0000,0.0000,0.0000 +a=6378388.0000 +rf=297.0000000000000 +units=m +no_defs <>
+<CSG67GEO> +title=Guyane CSG67 UTM fuseau 21 +proj=longlat +towgs84=-193.0660,236.9930,105.4470,0.4814,-0.8074,0.1276,1.564900 +a=6378388.0000 +rf=297.0000000000000 +units=m +no_defs <>
+<ED50G> +title=ED50 +proj=longlat +towgs84=-84.0000,-97.0000,-117.0000 +a=6378388.0000 +rf=297.0000000000000 +units=m +no_defs <>
+<GUAD48GEO> +title=Guadeloupe Ste Anne +proj=longlat +towgs84=-472.2900,-5.6300,-304.1200,0.4362,-0.8374,0.2563,1.898400 +a=6378388.0000 +rf=297.0000000000000 +units=m +no_defs <>
+<GUADFM49GEO> +title=Guadeloupe Fort Marigot +proj=longlat +towgs84=136.5960,248.1480,-429.7890 +a=6378388.0000 +rf=297.0000000000000 +units=m +no_defs <>
+<IGN63GEO> +title=IGN 1963 (Hiva Oa, Tahuata, Mohotani) +proj=longlat +towgs84=410.7210,55.0490,80.7460,-2.5779,-2.3514,-0.6664,17.331100 +a=6378388.0000 +rf=297.0000000000000 +units=m +no_defs <>
+<IGN72GEO> +title=IGN 1972 Grande-Terre / Ile des Pins +proj=longlat +towgs84=-11.6400,-348.6000,291.6800 +a=6378388.0000 +rf=297.0000000000000 +units=m +no_defs <>
+<KERG62GEO> +title=Kerguelen - K0 +proj=longlat +towgs84=145.0000,-187.0000,103.0000 +a=6378388.0000 +rf=297.0000000000000 +units=m +no_defs <>
+<MART38GEO> +title=Martinique Fort-Desaix +proj=longlat +towgs84=126.9260,547.9390,130.4090,-2.7867,5.1612,-0.8584,13.822650 +a=6378388.0000 +rf=297.0000000000000 +units=m +no_defs <>
+<MAYO50GEO> +title=Mayotte Combani +proj=longlat +towgs84=-599.9280,-275.5520,-195.6650,-0.0835,-0.4715,0.0602,49.281400 +a=6378388.0000 +rf=297.0000000000000 +units=m +no_defs <>
+<MOOREA87GEO> +title=Moorea 1987 +proj=longlat +towgs84=215.9820,149.5930,176.2290,3.2624,1.6920,1.1571,10.477300 +a=6378388.0000 +rf=297.0000000000000 +units=m +no_defs <>
+<NTFG> +title=Nouvelle Triangulation Francaise Greenwich degres sexagesimaux +proj=longlat +nadgrids=ntf_r93.gsb,null +towgs84=-168.0000,-60.0000,320.0000 +a=6378249.2000 +rf=293.4660210000000 +units=m +no_defs <>
+<NTFP> +title=Nouvelle Triangulation Francaise Paris grades +proj=longlat +nadgrids=ntf_r93.gsb,null +towgs84=-168.0000,-60.0000,320.0000 +a=6378249.2000 +rf=293.4660210000000 +pm=2.337229167 +units=m +no_defs <>
+<NUKU72GEO> +title=IGN 1972 Nuku Hiva +proj=longlat +towgs84=165.7320,216.7200,180.5050,-0.6434,-0.4512,-0.0791,7.420400 +a=6378388.0000 +rf=297.0000000000000 +units=m +no_defs <>
+<REUN47GEO> +title=Reunion 1947 +proj=longlat +towgs84=789.5240,-626.4860,-89.9040,0.6006,76.7946,-10.5788,-32.324100 +a=6378388.0000 +rf=297.0000000000000 +units=m +no_defs <>
+<RGF93G> +title=Reseau geodesique francais 1993 +proj=longlat +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +units=m +no_defs <>
+<RGFG95GEO> +title=Reseau geodesique francais de Guyane 1995 +proj=longlat +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +units=m +no_defs <>
+<RGM04GEO> +title=RGM04 (Reseau Geodesique de Mayotte 2004) +proj=longlat +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +units=m +no_defs <>
+<RGNCGEO> +title=Reseau Geodesique de Nouvelle-Caledonie +proj=longlat +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +units=m +no_defs <>
+<RGPFGEO> +title=RGPF (Reseau Geodesique de Polynesie Francaise) +proj=longlat +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +units=m +no_defs <>
+<RGR92GEO> +title=Reseau geodesique de la Reunion 1992 +proj=longlat +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +units=m +no_defs <>
+<RGSPM06GEO> +title=Saint-Pierre-et-Miquelon (2006) +proj=longlat +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +units=m +no_defs <>
+<STPM50GEO> +title=St Pierre et Miquelon 1950 +proj=longlat +towgs84=-95.5930,573.7630,173.4420,-0.9602,1.2510,-1.3918,42.626500 +a=6378206.4000 +rf=294.9786982000000 +units=m +no_defs <>
+<TAHAAGEO> +title=Raiatea - Tahaa 51-54 (Tahaa, Base Terme Est) +proj=longlat +towgs84=72.4380,345.9180,79.4860,-1.6045,-0.8823,-0.5565,1.374600 +a=6378388.0000 +rf=297.0000000000000 +units=m +no_defs <>
+<TAHI79GEO> +title=IGN79 (Tahiti) Iles de la Societe +proj=longlat +towgs84=221.5250,152.9480,176.7680,2.3847,1.3896,0.8770,11.474100 +a=6378388.0000 +rf=297.0000000000000 +units=m +no_defs <>
+<TERA50GEO> +title=Pointe Geologie - Perroud 1950 +proj=longlat +towgs84=324.8000,153.6000,172.1000 +a=6378388.0000 +rf=297.0000000000000 +units=m +no_defs <>
+<WALL78GEO> +title=Wallis - Uvea 1978 (MOP78) +proj=longlat +towgs84=253.0000,-133.0000,-127.0000 +a=6378388.0000 +rf=297.0000000000000 +units=m +no_defs <>
+<WGS72G> +title=WGS72 +proj=longlat +towgs84=0.0000,12.0000,6.0000 +a=6378135.0000 +rf=298.2600000000000 +units=m +no_defs <>
+<WGS84G> +title=World Geodetic System 1984 +proj=longlat +towgs84=0.0000,0.0000,0.0000,0.0000,0.0000,0.0000,0.000000 +a=6378137.0000 +rf=298.2572221010000 +units=m +no_defs <>
+<WGS84RRAFGEO> +title=Reseau de reference des Antilles francaises (1988-1991) +proj=longlat +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +units=m +no_defs <>
+<XGEO> +title=Systeme CIO-BIH +proj=longlat +towgs84=0.0000,0.0000,0.5000,0.0000,0.0000,0.0140,-0.100000 +a=6378137.0000 +rf=298.2572221010000 +units=m +no_defs <>
+<CROZ63UTM39S> +title=Crozet 1963 +proj=tmerc +towgs84=0.0000,0.0000,0.0000 +a=6378388.0000 +rf=297.0000000000000 +lat_0=0.000000000 +lon_0=51.000000000 +k_0=0.99960000 +x_0=500000.000 +y_0=10000000.000 +units=m +no_defs <>
+<CSG67UTM21> +title=Guyane CSG67 UTM fuseau 21 +proj=tmerc +towgs84=-193.0660,236.9930,105.4470,0.4814,-0.8074,0.1276,1.564900 +a=6378388.0000 +rf=297.0000000000000 +lat_0=0.000000000 +lon_0=-57.000000000 +k_0=0.99960000 +x_0=500000.000 +y_0=0.000 +units=m +no_defs <>
+<CSG67UTM22> +title=Guyane CSG67 UTM fuseau 22 +proj=tmerc +towgs84=-193.0660,236.9930,105.4470,0.4814,-0.8074,0.1276,1.564900 +a=6378388.0000 +rf=297.0000000000000 +lat_0=0.000000000 +lon_0=-51.000000000 +k_0=0.99960000 +x_0=500000.000 +y_0=0.000 +units=m +no_defs <>
+<GEOPORTALANF> +title=Geoportail - Antilles francaises +proj=eqc +nadgrids=null +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +lat_0=0.000000000 +lon_0=0.000000000 +lat_ts=15.000000000 +x_0=0.000 +y_0=0.000 +units=m +no_defs <>
+<GEOPORTALCRZ> +title=Geoportail - Crozet +proj=eqc +nadgrids=null +towgs84=0.0000,0.0000,0.0000,0.0000,0.0000,0.0000,0.000000 +a=6378137.0000 +rf=298.2572221010000 +lat_0=0.000000000 +lon_0=0.000000000 +lat_ts=-46.000000000 +x_0=0.000 +y_0=0.000 +units=m +no_defs <>
+<GEOPORTALFXX> +title=Geoportail - France metropolitaine +proj=eqc +nadgrids=null +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +lat_0=0.000000000 +lon_0=0.000000000 +lat_ts=46.500000000 +x_0=0.000 +y_0=0.000 +units=m +no_defs <>
+<GEOPORTALGUF> +title=Geoportail - Guyane +proj=eqc +nadgrids=null +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +lat_0=0.000000000 +lon_0=0.000000000 +lat_ts=4.000000000 +x_0=0.000 +y_0=0.000 +units=m +no_defs <>
+# FIXME : Bug Geoconcept : +lat_ts=-49.500000000 a été remplacé par +lat_ts=-47.300000000 (soluce temporaire)
+<GEOPORTALKER> +title=Geoportail - Kerguelen +proj=eqc +nadgrids=null +towgs84=0.0000,0.0000,0.0000,0.0000,0.0000,0.0000,0.000000 +a=6378137.0000 +rf=298.2572221010000 +lat_0=0.000000000 +lon_0=0.000000000 +lat_ts=-47.300000000 +x_0=0.000 +y_0=0.000 +units=m +no_defs <>
+<GEOPORTALMYT> +title=Geoportail - Mayotte +proj=eqc +nadgrids=null +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +lat_0=0.000000000 +lon_0=0.000000000 +lat_ts=-12.000000000 +x_0=0.000 +y_0=0.000 +units=m +no_defs <>
+<GEOPORTALNCL> +title=Geoportail - Nouvelle-Caledonie +proj=eqc +nadgrids=null +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +lat_0=0.000000000 +lon_0=0.000000000 +lat_ts=-22.000000000 +x_0=0.000 +y_0=0.000 +units=m +no_defs <>
+<GEOPORTALPYF> +title=Geoportail - Polynesie francaise +proj=eqc +nadgrids=null +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +lat_0=0.000000000 +lon_0=0.000000000 +lat_ts=-15.000000000 +x_0=0.000 +y_0=0.000 +units=m +no_defs <>
+<GEOPORTALREU> +title=Geoportail - Reunion et dependances +proj=eqc +nadgrids=null +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +lat_0=0.000000000 +lon_0=0.000000000 +lat_ts=-21.000000000 +x_0=0.000 +y_0=0.000 +units=m +no_defs <>
+<GEOPORTALSPM> +title=Geoportail - Saint-Pierre et Miquelon +proj=eqc +nadgrids=null +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +lat_0=0.000000000 +lon_0=0.000000000 +lat_ts=47.000000000 +x_0=0.000 +y_0=0.000 +units=m +no_defs <>
+<GEOPORTALWLF> +title=Geoportail - Wallis et Futuna +proj=eqc +nadgrids=null +towgs84=0.0000,0.0000,0.0000,0.0000,0.0000,0.0000,0.000000 +a=6378137.0000 +rf=298.2572221010000 +lat_0=0.000000000 +lon_0=0.000000000 +lat_ts=-14.000000000 +x_0=0.000 +y_0=0.000 +units=m +no_defs <>
+<GUAD48UTM20> +title=Guadeloupe Ste Anne +proj=tmerc +towgs84=-472.2900,-5.6300,-304.1200,0.4362,-0.8374,0.2563,1.898400 +a=6378388.0000 +rf=297.0000000000000 +lat_0=0.000000000 +lon_0=-63.000000000 +k_0=0.99960000 +x_0=500000.000 +y_0=0.000 +units=m +no_defs <>
+<GUADFM49U20> +title=Guadeloupe Fort Marigot +proj=tmerc +towgs84=136.5960,248.1480,-429.7890 +a=6378388.0000 +rf=297.0000000000000 +lat_0=0.000000000 +lon_0=-63.000000000 +k_0=0.99960000 +x_0=500000.000 +y_0=0.000 +units=m +no_defs <>
+<IGN63UTM7S> +title=IGN 1963 - Hiva Oa, Tahuata, Mohotani - UTM fuseau 7 Sud +proj=tmerc +towgs84=410.7210,55.0490,80.7460,-2.5779,-2.3514,-0.6664,17.331100 +a=6378388.0000 +rf=297.0000000000000 +lat_0=0.000000000 +lon_0=-141.000000000 +k_0=0.99960000 +x_0=500000.000 +y_0=10000000.000 +units=m +no_defs <>
+<IGN72UTM58S> +title=IGN 1972 - UTM fuseau 58 Sud +proj=tmerc +towgs84=-11.6400,-348.6000,291.6800 +a=6378388.0000 +rf=297.0000000000000 +lat_0=0.000000000 +lon_0=165.000000000 +k_0=0.99960000 +x_0=500000.000 +y_0=10000000.000 +units=m +no_defs <>
+<KERG62UTM42S> +title=Kerguelen 1962 +proj=tmerc +towgs84=145.0000,-187.0000,103.0000 +a=6378388.0000 +rf=297.0000000000000 +lat_0=0.000000000 +lon_0=69.000000000 +k_0=0.99960000 +x_0=500000.000 +y_0=10000000.000 +units=m +no_defs <>
+<LAMB1> +title=Lambert I +proj=lcc +nadgrids=ntf_r93.gsb,null +towgs84=-168.0000,-60.0000,320.0000 +a=6378249.2000 +rf=293.4660210000000 +pm=2.337229167 +lat_0=49.500000000 +lon_0=0.000000000 +k_0=0.99987734 +lat_1=49.500000000 +x_0=600000.000 +y_0=200000.000 +units=m +no_defs <>
+<LAMB1C> +title=Lambert I Carto +proj=lcc +nadgrids=ntf_r93.gsb,null +towgs84=-168.0000,-60.0000,320.0000 +a=6378249.2000 +rf=293.4660210000000 +pm=2.337229167 +lat_0=49.500000000 +lon_0=0.000000000 +k_0=0.99987734 +lat_1=49.500000000 +x_0=600000.000 +y_0=1200000.000 +units=m +no_defs <>
+<LAMB2> +title=Lambert II +proj=lcc +nadgrids=ntf_r93.gsb,null +towgs84=-168.0000,-60.0000,320.0000 +a=6378249.2000 +rf=293.4660210000000 +pm=2.337229167 +lat_0=46.800000000 +lon_0=0.000000000 +k_0=0.99987742 +lat_1=46.800000000 +x_0=600000.000 +y_0=200000.000 +units=m +no_defs <>
+<LAMB2C> +title=Lambert II Carto +proj=lcc +nadgrids=ntf_r93.gsb,null +towgs84=-168.0000,-60.0000,320.0000 +a=6378249.2000 +rf=293.4660210000000 +pm=2.337229167 +lat_0=46.800000000 +lon_0=0.000000000 +k_0=0.99987742 +lat_1=46.800000000 +x_0=600000.000 +y_0=2200000.000 +units=m +no_defs <>
+<LAMB3> +title=Lambert III +proj=lcc +nadgrids=ntf_r93.gsb,null +towgs84=-168.0000,-60.0000,320.0000 +a=6378249.2000 +rf=293.4660210000000 +pm=2.337229167 +lat_0=44.100000000 +lon_0=0.000000000 +k_0=0.99987750 +lat_1=44.100000000 +x_0=600000.000 +y_0=200000.000 +units=m +no_defs <>
+<LAMB3C> +title=Lambert III Carto +proj=lcc +nadgrids=ntf_r93.gsb,null +towgs84=-168.0000,-60.0000,320.0000 +a=6378249.2000 +rf=293.4660210000000 +pm=2.337229167 +lat_0=44.100000000 +lon_0=0.000000000 +k_0=0.99987750 +lat_1=44.100000000 +x_0=600000.000 +y_0=3200000.000 +units=m +no_defs <>
+<LAMB4> +title=Lambert IV +proj=lcc +nadgrids=ntf_r93.gsb,null +towgs84=-168.0000,-60.0000,320.0000 +a=6378249.2000 +rf=293.4660210000000 +pm=2.337229167 +lat_0=42.165000000 +lon_0=0.000000000 +k_0=0.99994471 +lat_1=42.165000000 +x_0=234.358 +y_0=185861.369 +units=m +no_defs <>
+<LAMB4C> +title=Lambert IV Carto +proj=lcc +nadgrids=ntf_r93.gsb,null +towgs84=-168.0000,-60.0000,320.0000 +a=6378249.2000 +rf=293.4660210000000 +pm=2.337229167 +lat_0=42.165000000 +lon_0=0.000000000 +k_0=0.99994471 +lat_1=42.165000000 +x_0=234.358 +y_0=4185861.369 +units=m +no_defs <>
+<LAMB93> +title=Lambert 93 +proj=lcc +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +lat_0=46.500000000 +lon_0=3.000000000 +lat_1=44.000000000 +lat_2=49.000000000 +x_0=700000.000 +y_0=6600000.000 +units=m +no_defs <>
+<RGF93CC42> +title=Lambert conique conforme Zone 1 +proj=lcc +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +lat_0=42.000000000 +lon_0=3.000000000 +lat_1=41.200000000 +lat_2=42.800000000 +x_0=1700000.000 +y_0=1200000.000 +units=m +no_defs <>
+<RGF93CC43> +title=Lambert conique conforme Zone 2 +proj=lcc +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +lat_0=43.000000000 +lon_0=3.000000000 +lat_1=42.200000000 +lat_2=43.800000000 +x_0=1700000.000 +y_0=2200000.000 +units=m +no_defs <>
+<RGF93CC44> +title=Lambert conique conforme Zone 3 +proj=lcc +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +lat_0=44.000000000 +lon_0=3.000000000 +lat_1=43.200000000 +lat_2=44.800000000 +x_0=1700000.000 +y_0=3200000.000 +units=m +no_defs <>
+<RGF93CC45> +title=Lambert conique conforme Zone 4 +proj=lcc +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +lat_0=45.000000000 +lon_0=3.000000000 +lat_1=44.200000000 +lat_2=45.800000000 +x_0=1700000.000 +y_0=4200000.000 +units=m +no_defs <>
+<RGF93CC46> +title=Lambert conique conforme Zone 5 +proj=lcc +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +lat_0=46.000000000 +lon_0=3.000000000 +lat_1=45.200000000 +lat_2=46.800000000 +x_0=1700000.000 +y_0=5200000.000 +units=m +no_defs <>
+<RGF93CC47> +title=Lambert conique conforme Zone 6 +proj=lcc +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +lat_0=47.000000000 +lon_0=3.000000000 +lat_1=46.200000000 +lat_2=47.800000000 +x_0=1700000.000 +y_0=6200000.000 +units=m +no_defs <>
+<RGF93CC48> +title=Lambert conique conforme Zone 7 +proj=lcc +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +lat_0=48.000000000 +lon_0=3.000000000 +lat_1=47.200000000 +lat_2=48.800000000 +x_0=1700000.000 +y_0=7200000.000 +units=m +no_defs <>
+<RGF93CC49> +title=Lambert conique conforme Zone 8 +proj=lcc +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +lat_0=49.000000000 +lon_0=3.000000000 +lat_1=48.200000000 +lat_2=49.800000000 +x_0=1700000.000 +y_0=8200000.000 +units=m +no_defs <>
+<RGF93CC50> +title=Lambert conique conforme Zone 9 +proj=lcc +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +lat_0=50.000000000 +lon_0=3.000000000 +lat_1=49.200000000 +lat_2=50.800000000 +x_0=1700000.000 +y_0=9200000.000 +units=m +no_defs <>
+<LAMBE> +title=Lambert II etendu +proj=lcc +nadgrids=ntf_r93.gsb,null +towgs84=-168.0000,-60.0000,320.0000 +a=6378249.2000 +rf=293.4660210000000 +pm=2.337229167 +lat_0=46.800000000 +lon_0=0.000000000 +k_0=0.99987742 +lat_1=46.800000000 +x_0=600000.000 +y_0=2200000.000 +units=m +no_defs <>
+<MART38UTM20> +title=Martinique Fort-Desaix +proj=tmerc +towgs84=126.9260,547.9390,130.4090,-2.7867,5.1612,-0.8584,13.822650 +a=6378388.0000 +rf=297.0000000000000 +lat_0=0.000000000 +lon_0=-63.000000000 +k_0=0.99960000 +x_0=500000.000 +y_0=0.000 +units=m +no_defs <>
+<MAYO50UTM38S> +title=Mayotte Combani +proj=tmerc +towgs84=-599.9280,-275.5520,-195.6650,-0.0835,-0.4715,0.0602,49.281400 +a=6378388.0000 +rf=297.0000000000000 +lat_0=0.000000000 +lon_0=45.000000000 +k_0=0.99960000 +x_0=500000.000 +y_0=10000000.000 +units=m +no_defs <>
+<MILLER> +title=Geoportail - Monde +proj=mill +towgs84=0.0000,0.0000,0.0000,0.0000,0.0000,0.0000,0.000000 +a=6378137.0000 +rf=298.2572221010000 +lon_0=0.000000000 +x_0=0.000 +y_0=0.000 +units=m +no_defs <>
+<MOOREA87U6S> +title=Moorea 1987 - UTM fuseau 6 Sud +proj=tmerc +towgs84=215.9820,149.5930,176.2290,3.2624,1.6920,1.1571,10.477300 +a=6378388.0000 +rf=297.0000000000000 +lat_0=0.000000000 +lon_0=-147.000000000 +k_0=0.99960000 +x_0=500000.000 +y_0=10000000.000 +units=m +no_defs <>
+<NUKU72U7S> +title=IGN 1972 Nuku Hiva - UTM fuseau 7 Sud +proj=tmerc +towgs84=165.7320,216.7200,180.5050,-0.6434,-0.4512,-0.0791,7.420400 +a=6378388.0000 +rf=297.0000000000000 +lat_0=0.000000000 +lon_0=-141.000000000 +k_0=0.99960000 +x_0=500000.000 +y_0=10000000.000 +units=m +no_defs <>
+<REUN47GAUSSL> +title=Reunion Gauss Laborde +proj=gstmerc +towgs84=789.5240,-626.4860,-89.9040,0.6006,76.7946,-10.5788,-32.324100 +a=6378388.0000 +rf=297.0000000000000 +lat_0=-21.116666667 +lon_0=55.533333333 +k_0=1.00000000 +x_0=160000.000 +y_0=50000.000 +units=m +no_defs <>
+<RGM04UTM38S> +title=UTM fuseau 38 Sud (Reseau Geodesique de Mayotte 2004) +proj=tmerc +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +lat_0=0.000000000 +lon_0=45.000000000 +k_0=0.99960000 +x_0=500000.000 +y_0=10000000.000 +units=m +no_defs <>
+<RGNCUTM57S> +title=Reseau Geodesique de Nouvelle-Caledonie - UTM fuseau 57 Sud +proj=tmerc +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +lat_0=0.000000000 +lon_0=159.000000000 +k_0=0.99960000 +x_0=500000.000 +y_0=10000000.000 +units=m +no_defs <>
+<RGNCUTM58S> +title=Reseau Geodesique de Nouvelle-Caledonie - UTM fuseau 58 Sud +proj=tmerc +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +lat_0=0.000000000 +lon_0=165.000000000 +k_0=0.99960000 +x_0=500000.000 +y_0=10000000.000 +units=m +no_defs <>
+<RGNCUTM59S> +title=Reseau Geodesique de Nouvelle-Caledonie - UTM fuseau 59 Sud +proj=tmerc +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +lat_0=0.000000000 +lon_0=171.000000000 +k_0=0.99960000 +x_0=500000.000 +y_0=10000000.000 +units=m +no_defs <>
+<RGPFUTM5S> +title=RGPF - UTM fuseau 5 Sud +proj=tmerc +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +lat_0=0.000000000 +lon_0=-153.000000000 +k_0=0.99960000 +x_0=500000.000 +y_0=10000000.000 +units=m +no_defs <>
+<RGPFUTM6S> +title=RGPF - UTM fuseau 6 Sud +proj=tmerc +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +lat_0=0.000000000 +lon_0=-147.000000000 +k_0=0.99960000 +x_0=500000.000 +y_0=10000000.000 +units=m +no_defs <>
+<RGPFUTM7S> +title=RGPF - UTM fuseau 7 Sud +proj=tmerc +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +lat_0=0.000000000 +lon_0=-141.000000000 +k_0=0.99960000 +x_0=500000.000 +y_0=10000000.000 +units=m +no_defs <>
+<RGR92UTM40S> +title=RGR92 UTM fuseau 40 Sud +proj=tmerc +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +lat_0=0.000000000 +lon_0=57.000000000 +k_0=0.99960000 +x_0=500000.000 +y_0=10000000.000 +units=m +no_defs <>
+<RGSPM06U21> +title=Saint-Pierre-et-Miquelon (2006) UTM Fuseau 21 Nord +proj=tmerc +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +lat_0=0.000000000 +lon_0=-57.000000000 +k_0=0.99960000 +x_0=500000.000 +y_0=0.000 +units=m +no_defs <>
+<STEREOSX> +title=Stereographique polaire Sud +proj=sterea +towgs84=0.0000,0.0000,0.5000,0.0000,0.0000,0.0140,-0.100000 +a=6378137.0000 +rf=298.2572221010000 +lat_0=-90.000000000 +lon_0=140.000000000 +k=0.96027295 +x_0=300000.000 +y_0=-2299363.482 +units=m +no_defs <>
+<STPM50UTM21> +title=St Pierre et Miquelon 1950 +proj=tmerc +towgs84=-95.5930,573.7630,173.4420,-0.9602,1.2510,-1.3918,42.626500 +a=6378206.4000 +rf=294.9786982000000 +lat_0=0.000000000 +lon_0=-57.000000000 +k_0=0.99960000 +x_0=500000.000 +y_0=0.000 +units=m +no_defs <>
+<TAHAAUTM05S> +title=Tahaa 1951 +proj=tmerc +towgs84=72.4380,345.9180,79.4860,-1.6045,-0.8823,-0.5565,1.374600 +a=6378388.0000 +rf=297.0000000000000 +lat_0=0.000000000 +lon_0=-153.000000000 +k_0=0.99960000 +x_0=500000.000 +y_0=10000000.000 +units=m +no_defs <>
+<TAHI51UTM06S> +title=Tahiti-Terme Nord UTM fuseau 6 Sud +proj=tmerc +towgs84=162.0000,117.0000,154.0000 +a=6378388.0000 +rf=297.0000000000000 +lat_0=0.000000000 +lon_0=-147.000000000 +k_0=0.99960000 +x_0=500000.000 +y_0=10000000.000 +units=m +no_defs <>
+<TAHI79UTM6S> +title=Tahiti 1979 +proj=tmerc +towgs84=221.5250,152.9480,176.7680,2.3847,1.3896,0.8770,11.474100 +a=6378388.0000 +rf=297.0000000000000 +lat_0=0.000000000 +lon_0=-147.000000000 +k_0=0.99960000 +x_0=500000.000 +y_0=10000000.000 +units=m +no_defs <>
+<TERA50SPTA> +title=Terre Adelie Stereo polaire Terre Adelie +proj=sterea +towgs84=324.8000,153.6000,172.1000 +a=6378388.0000 +rf=297.0000000000000 +lat_0=-67.000000000 +lon_0=140.000000000 +k=1.00000000 +x_0=300000.000 +y_0=200000.000 +units=m +no_defs <>
+<TERA50STEREO> +title=Terre Adelie 1950 +proj=sterea +towgs84=324.8000,153.6000,172.1000 +a=6378388.0000 +rf=297.0000000000000 +lat_0=-90.000000000 +lon_0=140.000000000 +k=0.96027295 +x_0=300000.000 +y_0=-2299363.482 +units=m +no_defs <>
+<UTM01SW84> +title=World Geodetic System 1984 UTM fuseau 01 Sud +proj=tmerc +towgs84=0.0000,0.0000,0.0000,0.0000,0.0000,0.0000,0.000000 +a=6378137.0000 +rf=298.2572221010000 +lat_0=0.000000000 +lon_0=-177.000000000 +k_0=0.99960000 +x_0=500000.000 +y_0=10000000.000 +units=m +no_defs <>
+<UTM39SW84> +title=World Geodetic System 1984 UTM fuseau 39 Sud +proj=tmerc +towgs84=0.0000,0.0000,0.0000,0.0000,0.0000,0.0000,0.000000 +a=6378137.0000 +rf=298.2572221010000 +lat_0=0.000000000 +lon_0=51.000000000 +k_0=0.99960000 +x_0=500000.000 +y_0=10000000.000 +units=m +no_defs <>
+<UTM42SW84> +title=World Geodetic System 1984 UTM fuseau 42 Sud +proj=tmerc +towgs84=0.0000,0.0000,0.0000,0.0000,0.0000,0.0000,0.000000 +a=6378137.0000 +rf=298.2572221010000 +lat_0=0.000000000 +lon_0=69.000000000 +k_0=0.99960000 +x_0=500000.000 +y_0=10000000.000 +units=m +no_defs <>
+<UTM43SW84> +title=World Geodetic System 1984 UTM fuseau 43 Sud +proj=tmerc +towgs84=0.0000,0.0000,0.0000,0.0000,0.0000,0.0000,0.000000 +a=6378137.0000 +rf=298.2572221010000 +lat_0=0.000000000 +lon_0=75.000000000 +k_0=0.99960000 +x_0=500000.000 +y_0=10000000.000 +units=m +no_defs <>
+<WALL78UTM1S> +title=Wallis-Uvea 1978 (MOP78) UTM 1 SUD +proj=tmerc +towgs84=253.0000,-133.0000,-127.0000 +a=6378388.0000 +rf=297.0000000000000 +lat_0=0.000000000 +lon_0=-177.000000000 +k_0=0.99960000 +x_0=500000.000 +y_0=10000000.000 +units=m +no_defs <>
Added: trunk/mapbender/http/extensions/proj4js/tools/jsmin.c
===================================================================
--- trunk/mapbender/http/extensions/proj4js/tools/jsmin.c (rev 0)
+++ trunk/mapbender/http/extensions/proj4js/tools/jsmin.c 2009-08-31 13:30:38 UTC (rev 4581)
@@ -0,0 +1,272 @@
+/* jsmin.c
+ 2006-05-04
+
+Copyright (c) 2002 Douglas Crockford (www.crockford.com)
+
+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 conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+The Software shall be used for Good, not Evil.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+*/
+
+#include <stdlib.h>
+#include <stdio.h>
+
+static int theA;
+static int theB;
+static int theLookahead = EOF;
+
+
+/* isAlphanum -- return true if the character is a letter, digit, underscore,
+ dollar sign, or non-ASCII character.
+*/
+
+static int
+isAlphanum(int c)
+{
+ return ((c >= 'a' && c <= 'z') || (c >= '0' && c <= '9') ||
+ (c >= 'A' && c <= 'Z') || c == '_' || c == '$' || c == '\\' ||
+ c > 126);
+}
+
+
+/* get -- return the next character from stdin. Watch out for lookahead. If
+ the character is a control character, translate it to a space or
+ linefeed.
+*/
+
+static int
+get()
+{
+ int c = theLookahead;
+ theLookahead = EOF;
+ if (c == EOF) {
+ c = getc(stdin);
+ }
+ if (c >= ' ' || c == '\n' || c == EOF) {
+ return c;
+ }
+ if (c == '\r') {
+ return '\n';
+ }
+ return ' ';
+}
+
+
+/* peek -- get the next character without getting it.
+*/
+
+static int
+peek()
+{
+ theLookahead = get();
+ return theLookahead;
+}
+
+
+/* next -- get the next character, excluding comments. peek() is used to see
+ if a '/' is followed by a '/' or '*'.
+*/
+
+static int
+next()
+{
+ int c = get();
+ if (c == '/') {
+ switch (peek()) {
+ case '/':
+ for (;;) {
+ c = get();
+ if (c <= '\n') {
+ return c;
+ }
+ }
+ case '*':
+ get();
+ for (;;) {
+ switch (get()) {
+ case '*':
+ if (peek() == '/') {
+ get();
+ return ' ';
+ }
+ break;
+ case EOF:
+ fprintf(stderr, "Error: JSMIN Unterminated comment.\n");
+ exit(1);
+ }
+ }
+ default:
+ return c;
+ }
+ }
+ return c;
+}
+
+
+/* action -- do something! What you do is determined by the argument:
+ 1 Output A. Copy B to A. Get the next B.
+ 2 Copy B to A. Get the next B. (Delete A).
+ 3 Get the next B. (Delete B).
+ action treats a string as a single character. Wow!
+ action recognizes a regular expression if it is preceded by ( or , or =.
+*/
+
+static void
+action(int d)
+{
+ switch (d) {
+ case 1:
+ putc(theA, stdout);
+ case 2:
+ theA = theB;
+ if (theA == '\'' || theA == '"') {
+ for (;;) {
+ putc(theA, stdout);
+ theA = get();
+ if (theA == theB) {
+ break;
+ }
+ if (theA <= '\n') {
+ fprintf(stderr,
+"Error: JSMIN unterminated string literal: %c\n", theA);
+ exit(1);
+ }
+ if (theA == '\\') {
+ putc(theA, stdout);
+ theA = get();
+ }
+ }
+ }
+ case 3:
+ theB = next();
+ if (theB == '/' && (theA == '(' || theA == ',' || theA == '=' ||
+ theA == ':' || theA == '[' || theA == '!' || theA == '&' ||
+ theA == '|')) {
+ putc(theA, stdout);
+ putc(theB, stdout);
+ for (;;) {
+ theA = get();
+ if (theA == '/') {
+ break;
+ } else if (theA =='\\') {
+ putc(theA, stdout);
+ theA = get();
+ } else if (theA <= '\n') {
+ fprintf(stderr,
+"Error: JSMIN unterminated Regular Expression literal.\n", theA);
+ exit(1);
+ }
+ putc(theA, stdout);
+ }
+ theB = next();
+ }
+ }
+}
+
+
+/* jsmin -- Copy the input to the output, deleting the characters which are
+ insignificant to JavaScript. Comments will be removed. Tabs will be
+ replaced with spaces. Carriage returns will be replaced with linefeeds.
+ Most spaces and linefeeds will be removed.
+*/
+
+static void
+jsmin()
+{
+ theA = '\n';
+ action(3);
+ while (theA != EOF) {
+ switch (theA) {
+ case ' ':
+ if (isAlphanum(theB)) {
+ action(1);
+ } else {
+ action(2);
+ }
+ break;
+ case '\n':
+ switch (theB) {
+ case '{':
+ case '[':
+ case '(':
+ case '+':
+ case '-':
+ action(1);
+ break;
+ case ' ':
+ action(3);
+ break;
+ default:
+ if (isAlphanum(theB)) {
+ action(1);
+ } else {
+ action(2);
+ }
+ }
+ break;
+ default:
+ switch (theB) {
+ case ' ':
+ if (isAlphanum(theA)) {
+ action(1);
+ break;
+ }
+ action(3);
+ break;
+ case '\n':
+ switch (theA) {
+ case '}':
+ case ']':
+ case ')':
+ case '+':
+ case '-':
+ case '"':
+ case '\'':
+ action(1);
+ break;
+ default:
+ if (isAlphanum(theA)) {
+ action(1);
+ } else {
+ action(3);
+ }
+ }
+ break;
+ default:
+ action(1);
+ break;
+ }
+ }
+ }
+}
+
+
+/* main -- Output any command line arguments as comments
+ and then minify the input.
+*/
+extern int
+main(int argc, char* argv[])
+{
+ int i;
+ for (i = 1; i < argc; i += 1) {
+ fprintf(stdout, "// %s\n", argv[i]);
+ }
+ jsmin();
+ return 0;
+}
Added: trunk/mapbender/http/extensions/proj4js/tools/jsmin.py
===================================================================
--- trunk/mapbender/http/extensions/proj4js/tools/jsmin.py (rev 0)
+++ trunk/mapbender/http/extensions/proj4js/tools/jsmin.py 2009-08-31 13:30:38 UTC (rev 4581)
@@ -0,0 +1,216 @@
+#!/usr/bin/python
+
+# This code is original from jsmin by Douglas Crockford, it was translated to
+# Python by Baruch Even. The original code had the following copyright and
+# license.
+#
+# /* jsmin.c
+# 2007-01-08
+#
+# Copyright (c) 2002 Douglas Crockford (www.crockford.com)
+#
+# 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 conditions:
+#
+# The above copyright notice and this permission notice shall be included in all
+# copies or substantial portions of the Software.
+#
+# The Software shall be used for Good, not Evil.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+# SOFTWARE.
+# */
+
+from StringIO import StringIO
+
+def jsmin(js):
+ ins = StringIO(js)
+ outs = StringIO()
+ JavascriptMinify().minify(ins, outs)
+ str = outs.getvalue()
+ if len(str) > 0 and str[0] == '\n':
+ str = str[1:]
+ return str
+
+def isAlphanum(c):
+ """return true if the character is a letter, digit, underscore,
+ dollar sign, or non-ASCII character.
+ """
+ return ((c >= 'a' and c <= 'z') or (c >= '0' and c <= '9') or
+ (c >= 'A' and c <= 'Z') or c == '_' or c == '$' or c == '\\' or (c is not None and ord(c) > 126));
+
+class UnterminatedComment(Exception):
+ pass
+
+class UnterminatedStringLiteral(Exception):
+ pass
+
+class UnterminatedRegularExpression(Exception):
+ pass
+
+class JavascriptMinify(object):
+
+ def _outA(self):
+ self.outstream.write(self.theA)
+ def _outB(self):
+ self.outstream.write(self.theB)
+
+ def _get(self):
+ """return the next character from stdin. Watch out for lookahead. If
+ the character is a control character, translate it to a space or
+ linefeed.
+ """
+ c = self.theLookahead
+ self.theLookahead = None
+ if c == None:
+ c = self.instream.read(1)
+ if c >= ' ' or c == '\n':
+ return c
+ if c == '': # EOF
+ return '\000'
+ if c == '\r':
+ return '\n'
+ return ' '
+
+ def _peek(self):
+ self.theLookahead = self._get()
+ return self.theLookahead
+
+ def _next(self):
+ """get the next character, excluding comments. peek() is used to see
+ if a '/' is followed by a '/' or '*'.
+ """
+ c = self._get()
+ if c == '/':
+ p = self._peek()
+ if p == '/':
+ c = self._get()
+ while c > '\n':
+ c = self._get()
+ return c
+ if p == '*':
+ c = self._get()
+ while 1:
+ c = self._get()
+ if c == '*':
+ if self._peek() == '/':
+ self._get()
+ return ' '
+ if c == '\000':
+ raise UnterminatedComment()
+
+ return c
+
+ def _action(self, action):
+ """do something! What you do is determined by the argument:
+ 1 Output A. Copy B to A. Get the next B.
+ 2 Copy B to A. Get the next B. (Delete A).
+ 3 Get the next B. (Delete B).
+ action treats a string as a single character. Wow!
+ action recognizes a regular expression if it is preceded by ( or , or =.
+ """
+ if action <= 1:
+ self._outA()
+
+ if action <= 2:
+ self.theA = self.theB
+ if self.theA == "'" or self.theA == '"':
+ while 1:
+ self._outA()
+ self.theA = self._get()
+ if self.theA == self.theB:
+ break
+ if self.theA <= '\n':
+ raise UnterminatedStringLiteral()
+ if self.theA == '\\':
+ self._outA()
+ self.theA = self._get()
+
+
+ if action <= 3:
+ self.theB = self._next()
+ if self.theB == '/' and (self.theA == '(' or self.theA == ',' or
+ self.theA == '=' or self.theA == ':' or
+ self.theA == '[' or self.theA == '?' or
+ self.theA == '!' or self.theA == '&' or
+ self.theA == '|'):
+ self._outA()
+ self._outB()
+ while 1:
+ self.theA = self._get()
+ if self.theA == '/':
+ break
+ elif self.theA == '\\':
+ self._outA()
+ self.theA = self._get()
+ elif self.theA <= '\n':
+ raise UnterminatedRegularExpression()
+ self._outA()
+ self.theB = self._next()
+
+
+ def _jsmin(self):
+ """Copy the input to the output, deleting the characters which are
+ insignificant to JavaScript. Comments will be removed. Tabs will be
+ replaced with spaces. Carriage returns will be replaced with linefeeds.
+ Most spaces and linefeeds will be removed.
+ """
+ self.theA = '\n'
+ self._action(3)
+
+ while self.theA != '\000':
+ if self.theA == ' ':
+ if isAlphanum(self.theB):
+ self._action(1)
+ else:
+ self._action(2)
+ elif self.theA == '\n':
+ if self.theB in ['{', '[', '(', '+', '-']:
+ self._action(1)
+ elif self.theB == ' ':
+ self._action(3)
+ else:
+ if isAlphanum(self.theB):
+ self._action(1)
+ else:
+ self._action(2)
+ else:
+ if self.theB == ' ':
+ if isAlphanum(self.theA):
+ self._action(1)
+ else:
+ self._action(3)
+ elif self.theB == '\n':
+ if self.theA in ['}', ']', ')', '+', '-', '"', '\'']:
+ self._action(1)
+ else:
+ if isAlphanum(self.theA):
+ self._action(1)
+ else:
+ self._action(3)
+ else:
+ self._action(1)
+
+ def minify(self, instream, outstream):
+ self.instream = instream
+ self.outstream = outstream
+ self.theA = None
+ self.thaB = None
+ self.theLookahead = None
+
+ self._jsmin()
+ self.instream.close()
+
+if __name__ == '__main__':
+ import sys
+ jsm = JavascriptMinify()
+ jsm.minify(sys.stdin, sys.stdout)
Added: trunk/mapbender/http/extensions/proj4js/tools/mergejs.py
===================================================================
--- trunk/mapbender/http/extensions/proj4js/tools/mergejs.py (rev 0)
+++ trunk/mapbender/http/extensions/proj4js/tools/mergejs.py 2009-08-31 13:30:38 UTC (rev 4581)
@@ -0,0 +1,267 @@
+#!/usr/bin/env python
+#
+# Merge multiple JavaScript source code files into one.
+#
+# Usage:
+# This script requires source files to have dependencies specified in them.
+#
+# Dependencies are specified with a comment of the form:
+#
+# // @requires <file path>
+#
+# e.g.
+#
+# // @requires Geo/DataSource.js
+#
+# or (ideally) within a class comment definition
+#
+# /**
+# * @class
+# *
+# * @requires OpenLayers/Layer.js
+# */
+#
+# This script should be executed like so:
+#
+# mergejs.py <output.js> <directory> [...]
+#
+# e.g.
+#
+# mergejs.py openlayers.js Geo/ CrossBrowser/
+#
+# This example will cause the script to walk the `Geo` and
+# `CrossBrowser` directories--and subdirectories thereof--and import
+# all `*.js` files encountered. The dependency declarations will be extracted
+# and then the source code from imported files will be output to
+# a file named `openlayers.js` in an order which fulfils the dependencies
+# specified.
+#
+#
+# Note: This is a very rough initial version of this code.
+#
+# -- Copyright 2005-2007 MetaCarta, Inc. / OpenLayers project --
+#
+
+# TODO: Allow files to be excluded. e.g. `Crossbrowser/DebugMode.js`?
+# TODO: Report error when dependency can not be found rather than KeyError.
+
+import re
+import os
+import sys
+import glob
+
+SUFFIX_JAVASCRIPT = ".js"
+
+RE_REQUIRE = "@requires (.*)\n" # TODO: Ensure in comment?
+class SourceFile:
+ """
+ Represents a Javascript source code file.
+ """
+
+ def __init__(self, filepath, source):
+ """
+ """
+ self.filepath = filepath
+ self.source = source
+
+ self.requiredBy = []
+
+
+ def _getRequirements(self):
+ """
+ Extracts the dependencies specified in the source code and returns
+ a list of them.
+ """
+ # TODO: Cache?
+ return re.findall(RE_REQUIRE, self.source)
+
+ requires = property(fget=_getRequirements, doc="")
+
+
+
+def usage(filename):
+ """
+ Displays a usage message.
+ """
+ print "%s [-c <config file>] <output.js> <directory> [...]" % filename
+
+
+class Config:
+ """
+ Represents a parsed configuration file.
+
+ A configuration file should be of the following form:
+
+ [first]
+ 3rd/prototype.js
+ core/application.js
+ core/params.js
+
+ [last]
+ core/api.js
+
+ [exclude]
+ 3rd/logger.js
+
+ All headings are required.
+
+ The files listed in the `first` section will be forced to load
+ *before* all other files (in the order listed). The files in `last`
+ section will be forced to load *after* all the other files (in the
+ order listed).
+
+ The files list in the `exclude` section will not be imported.
+
+ """
+
+ def __init__(self, filename):
+ """
+ Parses the content of the named file and stores the values.
+ """
+ lines = [line.strip() # Assumes end-of-line character is present
+ for line in open(filename)
+ if line.strip()] # Skip blank lines
+
+ self.forceFirst = lines[lines.index("[first]") + 1:lines.index("[last]")]
+
+ self.forceLast = lines[lines.index("[last]") + 1:lines.index("[include]")]
+ self.include = lines[lines.index("[include]") + 1:lines.index("[exclude]")]
+ self.exclude = lines[lines.index("[exclude]") + 1:]
+
+def run (sourceDirectory, outputFilename = None, configFile = None):
+ cfg = None
+ if configFile:
+ cfg = Config(configFile)
+
+ allFiles = []
+
+ ## Find all the Javascript source files
+ for root, dirs, files in os.walk(sourceDirectory):
+ for filename in files:
+ if filename.endswith(SUFFIX_JAVASCRIPT) and not filename.startswith("."):
+ filepath = os.path.join(root, filename)[len(sourceDirectory)+1:]
+ filepath = filepath.replace("\\", "/")
+ if cfg and cfg.include:
+ include = False
+ for included in cfg.include:
+ if glob.fnmatch.fnmatch(filepath, included):
+ include = True
+ if include or filepath in cfg.forceFirst:
+ allFiles.append(filepath)
+ elif (not cfg) or (filepath not in cfg.exclude):
+ exclude = False
+ for excluded in cfg.exclude:
+ if glob.fnmatch.fnmatch(filepath, excluded):
+ exclude = True
+ if not exclude:
+ allFiles.append(filepath)
+
+ ## Header inserted at the start of each file in the output
+ HEADER = "/* " + "=" * 70 + "\n %s\n" + " " + "=" * 70 + " */\n\n"
+
+ files = {}
+
+ order = [] # List of filepaths to output, in a dependency satisfying order
+
+ ## Import file source code
+ ## TODO: Do import when we walk the directories above?
+ for filepath in allFiles:
+ print "Importing: %s" % filepath
+ fullpath = os.path.join(sourceDirectory, filepath)
+ content = open(fullpath, "U").read() # TODO: Ensure end of line @ EOF?
+ files[filepath] = SourceFile(filepath, content) # TODO: Chop path?
+
+ print
+
+ from toposort import toposort
+
+ complete = False
+ resolution_pass = 1
+
+ while not complete:
+ order = [] # List of filepaths to output, in a dependency satisfying order
+ nodes = []
+ routes = []
+ ## Resolve the dependencies
+ print "Resolution pass %s... " % resolution_pass
+ resolution_pass += 1
+
+ for filepath, info in files.items():
+ nodes.append(filepath)
+ for neededFilePath in info.requires:
+ routes.append((neededFilePath, filepath))
+
+ for dependencyLevel in toposort(nodes, routes):
+ for filepath in dependencyLevel:
+ order.append(filepath)
+ if not files.has_key(filepath):
+ print "Importing: %s" % filepath
+ fullpath = os.path.join(sourceDirectory, filepath)
+ content = open(fullpath, "U").read() # TODO: Ensure end of line @ EOF?
+ files[filepath] = SourceFile(filepath, content) # TODO: Chop path?
+
+
+
+ # Double check all dependencies have been met
+ complete = True
+ try:
+ for fp in order:
+ if max([order.index(rfp) for rfp in files[fp].requires] +
+ [order.index(fp)]) != order.index(fp):
+ complete = False
+ except:
+ complete = False
+
+ print
+
+
+ ## Move forced first and last files to the required position
+ if cfg:
+ print "Re-ordering files..."
+ order = cfg.forceFirst + [item
+ for item in order
+ if ((item not in cfg.forceFirst) and
+ (item not in cfg.forceLast))] + cfg.forceLast
+
+ print
+ ## Output the files in the determined order
+ result = []
+
+ for fp in order:
+ f = files[fp]
+ print "Exporting: ", f.filepath
+ result.append(HEADER % f.filepath)
+ source = f.source
+ result.append(source)
+ if not source.endswith("\n"):
+ result.append("\n")
+
+ print "\nTotal files merged: %d " % len(files)
+
+ if outputFilename:
+ print "\nGenerating: %s" % (outputFilename)
+ open(outputFilename, "w").write("".join(result))
+ return "".join(result)
+
+if __name__ == "__main__":
+ import getopt
+
+ options, args = getopt.getopt(sys.argv[1:], "-c:")
+
+ try:
+ outputFilename = args[0]
+ except IndexError:
+ usage(sys.argv[0])
+ raise SystemExit
+ else:
+ sourceDirectory = args[1]
+ if not sourceDirectory:
+ usage(sys.argv[0])
+ raise SystemExit
+
+ configFile = None
+ if options and options[0][0] == "-c":
+ configFile = options[0][1]
+ print "Parsing configuration file: %s" % filename
+
+ run( sourceDirectory, outputFilename, configFile )
Added: trunk/mapbender/http/extensions/proj4js/tools/mkpjcat.py
===================================================================
--- trunk/mapbender/http/extensions/proj4js/tools/mkpjcat.py (rev 0)
+++ trunk/mapbender/http/extensions/proj4js/tools/mkpjcat.py 2009-08-31 13:30:38 UTC (rev 4581)
@@ -0,0 +1,21 @@
+#!/usr/bin/env python
+
+import sys
+sys.path.append(".")
+
+import pjjs
+
+resourcesDirectory = "catalogues"
+targetDirectory = "../lib/defs"
+
+if len(sys.argv) > 1:
+ resourcesDirectory = sys.argv[1]
+
+if len(sys.argv) > 2:
+ targetDirectory = sys.argv[2]
+
+print "Generating Proj4js catalogues."
+pjjs.pjcat2js_clean(resourcesDirectory,targetDirectory)
+pjjs.pjcat2js_run(resourcesDirectory,targetDirectory)
+
+print "Done."
Added: trunk/mapbender/http/extensions/proj4js/tools/pjjs.py
===================================================================
--- trunk/mapbender/http/extensions/proj4js/tools/pjjs.py (rev 0)
+++ trunk/mapbender/http/extensions/proj4js/tools/pjjs.py 2009-08-31 13:30:38 UTC (rev 4581)
@@ -0,0 +1,85 @@
+#!/usr/bin/env python
+#
+# TODO explain
+#
+# -- Copyright 2007 IGN France / Geoportail project --
+#
+
+import sys
+import os
+import re
+
+SUFFIX_JAVASCRIPT = ".js"
+
+def _pjcat2js_remove(rezDirectory,catName,targetDirectory):
+ pjCatFilename = os.path.join(rezDirectory, catName)
+ pjCat = open(pjCatFilename,'r')
+ comment_re = re.compile("^#")
+ srsdef_re = re.compile("^<([^>]*)>.* <>$")
+ l = pjCat.readline()
+ while len(l) != 0:
+ if comment_re.search(l) is None:
+ srsdef_mo = srsdef_re.match(l)
+ srsdef_fn = os.path.join(targetDirectory, catName+srsdef_mo.group(1)+".js")
+ if os.path.exists(srsdef_fn):
+ os.remove(srsdef_fn)
+ l = pjCat.readline()
+ pjCat.close()
+
+def _pjcat2js_make(rezDirectory,catName,targetDirectory):
+ pjCatFilename = os.path.join(rezDirectory, catName)
+ pjCat = open(pjCatFilename,'r')
+ comment_re = re.compile("^#")
+ srsdef_re = re.compile("^<([^>]*)> *(.*) <>$")
+ l = pjCat.readline()
+ while len(l) != 0:
+ if comment_re.search(l) is None:
+ srsdef_mo = srsdef_re.match(l)
+ srsdef_fn = os.path.join(targetDirectory, catName+srsdef_mo.group(1)+".js")
+ srsdef = 'Proj4js.defs["'+catName+':'+srsdef_mo.group(1)+'"]="'+srsdef_mo.group(2)+'";'
+ file(srsdef_fn,'w').write(srsdef)
+ l = pjCat.readline()
+ pjCat.close()
+
+def pjcat2js_clean(rezDirectory,targetDirectory):
+ if not os.path.isdir(rezDirectory):
+ return
+ if not os.path.isdir(targetDirectory):
+ return
+ if os.path.abspath(rezDirectory) == '/':
+ return
+ if os.path.abspath(targetDirectory) == '/':
+ return
+ rezDirectory_name_len = len(rezDirectory)
+ for root, dirs, filenames in os.walk(rezDirectory):
+ if 'CVS' in dirs:
+ dirs.remove('CVS')
+ if '.svn' in dirs:
+ dirs.remove('.svn')
+ for filename in filenames:
+ if not filename.endswith(SUFFIX_JAVASCRIPT) and not filename.startswith("."):
+ filepath = os.path.join(root, filename)[rezDirectory_name_len+1:]
+ filepath = filepath.replace("\\", "/")
+ _pjcat2js_remove(rezDirectory,filepath,targetDirectory)
+
+def pjcat2js_run(rezDirectory,targetDirectory):
+ if not os.path.isdir(rezDirectory):
+ return
+ if not os.path.isdir(targetDirectory):
+ return
+ if os.path.abspath(rezDirectory) == '/':
+ return
+ if os.path.abspath(targetDirectory) == '/':
+ return
+ rezDirectory_name_len = len(rezDirectory)
+ for root, dirs, filenames in os.walk(rezDirectory):
+ if 'CVS' in dirs:
+ dirs.remove('CVS')
+ if '.svn' in dirs:
+ dirs.remove('.svn')
+ for filename in filenames:
+ if not filename.endswith(SUFFIX_JAVASCRIPT) and not filename.startswith("."):
+ filepath = os.path.join(root, filename)[rezDirectory_name_len+1:]
+ filepath = filepath.replace("\\", "/")
+ _pjcat2js_make(rezDirectory,filepath,targetDirectory)
+
Added: trunk/mapbender/http/extensions/proj4js/tools/toposort.py
===================================================================
--- trunk/mapbender/http/extensions/proj4js/tools/toposort.py (rev 0)
+++ trunk/mapbender/http/extensions/proj4js/tools/toposort.py 2009-08-31 13:30:38 UTC (rev 4581)
@@ -0,0 +1,260 @@
+#
+# According to <http://www.vrplumber.com/programming/> this file
+# is licensed under a BSD-style license. We only use the section
+# originally by Tim Peters.
+#
+# TODO: The use of this code needs to be okayed by someone.
+#
+
+class RecursionError( OverflowError, ValueError ):
+ '''Unable to calculate result because of recursive structure'''
+
+
+def sort(nodes, routes, noRecursion=1):
+ '''Passed a list of node IDs and a list of source,dest ID routes
+ attempt to create a list of stages where each sub list
+ is one stage in a process.
+ '''
+ children, parents = _buildChildrenLists(routes)
+ # first stage is those nodes
+ # having no incoming routes...
+ stage = []
+ stages = [stage]
+ taken = []
+ for node in nodes:
+ if (not parents.get(node)):
+ stage.append (node)
+ if nodes and not stage:
+ # there is no element which does not depend on
+ # some other element!!!
+ stage.append( nodes[0])
+ taken.extend( stage )
+ nodes = filter ( lambda x, l=stage: x not in l, nodes )
+ while nodes:
+ previousStageChildren = []
+ nodelen = len(nodes)
+ # second stage are those nodes
+ # which are direct children of the first stage
+ for node in stage:
+ for child in children.get (node, []):
+ if child not in previousStageChildren and child not in taken:
+ previousStageChildren.append(child)
+ elif child in taken and noRecursion:
+ raise RecursionError( (child, node) )
+ # unless they are children of other direct children...
+ # TODO, actually do that...
+ stage = previousStageChildren
+ removes = []
+ for current in stage:
+ currentParents = parents.get( current, [] )
+ for parent in currentParents:
+ if parent in stage and parent != current:
+ # might wind up removing current...
+ if not current in parents.get(parent, []):
+ # is not mutually dependent...
+ removes.append( current )
+ for remove in removes:
+ while remove in stage:
+ stage.remove( remove )
+ stages.append( stage)
+ taken.extend( stage )
+ nodes = filter ( lambda x, l=stage: x not in l, nodes )
+ if nodelen == len(nodes):
+ if noRecursion:
+ raise RecursionError( nodes )
+ else:
+ stages.append( nodes[:] )
+ nodes = []
+ return stages
+
+def _buildChildrenLists (routes):
+ childrenTable = {}
+ parentTable = {}
+ for sourceID,destinationID in routes:
+ currentChildren = childrenTable.get( sourceID, [])
+ currentParents = parentTable.get( destinationID, [])
+ if not destinationID in currentChildren:
+ currentChildren.append ( destinationID)
+ if not sourceID in currentParents:
+ currentParents.append ( sourceID)
+ childrenTable[sourceID] = currentChildren
+ parentTable[destinationID] = currentParents
+ return childrenTable, parentTable
+
+
+def toposort (nodes, routes, noRecursion=1):
+ '''Topological sort from Tim Peters, fairly efficient
+ in comparison (it seems).'''
+ #first calculate the recursion depth
+
+ dependencies = {}
+ inversedependencies = {}
+ if not nodes:
+ return []
+ if not routes:
+ return [nodes]
+ for node in nodes:
+ dependencies[ node ] = (0, node)
+ inversedependencies[ node ] = []
+
+
+ for depended, depends in routes:
+ # is it a null rule
+ try:
+ newdependencylevel, object = dependencies.get ( depends, (0, depends))
+ except TypeError:
+ print depends
+ raise
+ dependencies[ depends ] = (newdependencylevel + 1, depends)
+ # "dependency (existence) of depended-on"
+ newdependencylevel,object = dependencies.get ( depended, (0, depended) )
+ dependencies[ depended ] = (newdependencylevel, depended)
+ # Inverse dependency set up
+ dependencieslist = inversedependencies.get ( depended, [])
+ dependencieslist.append (depends)
+ inversedependencies[depended] = dependencieslist
+ ### Now we do the actual sorting
+ # The first task is to create the sortable
+ # list of dependency-levels
+ sortinglist = dependencies.values()
+ sortinglist.sort ()
+ output = []
+ while sortinglist:
+ deletelist = []
+ generation = []
+ output.append( generation)
+ while sortinglist and sortinglist[0][0] == 0:
+ number, object = sortinglist[0]
+ generation.append ( object )
+ deletelist.append( object )
+ for inverse in inversedependencies.get(object, () ):
+ try:
+ oldcount, inverse = dependencies [ inverse]
+ if oldcount > 0:
+ # will be dealt with on later pass
+ dependencies [ inverse] = (oldcount-1, inverse)
+ else:
+ # will be dealt with on this pass,
+ # so needs not to be in the sorting list next time
+ deletelist.append( inverse )
+ # just in case a loop comes through
+ inversedependencies[object] = []
+ except KeyError:
+ # dealing with a recursion-breaking run...
+ pass
+ del sortinglist [0]
+ # if no elements could be deleted, then
+ # there is something which depends upon itself
+ if not deletelist:
+ if noRecursion:
+ raise RecursionError( sortinglist )
+ else:
+ # hack so that something gets deleted...
+## import pdb
+## pdb.set_trace()
+ dependencies[sortinglist[0][1]] = (0,sortinglist[0][1])
+ # delete the items that were dealt with
+ for item in deletelist:
+ try:
+ del dependencies [ item ]
+ except KeyError:
+ pass
+ # need to recreate the sortinglist
+ sortinglist = dependencies.values()
+ if not generation:
+ output.remove( generation )
+ sortinglist.sort ()
+ return output
+
+
+
+
+
+if __name__ == "__main__":
+
+ nodes = ['a', 'b', 'c', 'd', 'e', 'f']
+ route = [('a', 'b'), ('b', 'c'), ('b', 'd'), ('e','f')]
+
+ for x in toposort( nodes, route):
+ for a in x:
+ print a
+
+ raise SystemExit
+
+
+
+ import pprint, traceback
+ nodes= [ 0,1,2,3,4,5 ]
+ testingValues = [
+ [ (0,1),(1,2),(2,3),(3,4),(4,5)],
+ [ (0,1),(0,2),(1,2),(3,4),(4,5)],
+ [
+ (0,1),
+ (0,2),
+ (0,2),
+ (2,4),
+ (2,5),
+ (3,2),
+ (0,3)],
+ [
+ (0,1), # 3-element cycle test, no orphan nodes
+ (1,2),
+ (2,0),
+ (2,4),
+ (2,5),
+ (3,2),
+ (0,3)],
+ [
+ (0,1),
+ (1,1),
+ (1,1),
+ (1,4),
+ (1,5),
+ (1,2),
+ (3,1),
+ (2,1),
+ (2,0)],
+ [
+ (0,1),
+ (1,0),
+ (0,2),
+ (0,3),
+ ],
+ [
+ (0,1),
+ (1,0),
+ (0,2),
+ (3,1),
+ ],
+ ]
+ print 'sort, no recursion allowed'
+ for index in range(len(testingValues)):
+## print ' %s -- %s'%( index, testingValues[index])
+ try:
+ print ' ', sort( nodes, testingValues[index] )
+ except:
+ print 'exception raised'
+ print 'toposort, no recursion allowed'
+ for index in range(len(testingValues)):
+## print ' %s -- %s'%( index, testingValues[index])
+ try:
+ print ' ', toposort( nodes, testingValues[index] )
+ except:
+ print 'exception raised'
+ print 'sort, recursion allowed'
+ for index in range(len(testingValues)):
+## print ' %s -- %s'%( index, testingValues[index])
+ try:
+ print ' ', sort( nodes, testingValues[index],0 )
+ except:
+ print 'exception raised'
+ print 'toposort, recursion allowed'
+ for index in range(len(testingValues)):
+## print ' %s -- %s'%( index, testingValues[index])
+ try:
+ print ' ', toposort( nodes, testingValues[index],0 )
+ except:
+ print 'exception raised'
+
+
+
Added: trunk/mapbender/http/javascripts/mod_coordsLookup.js
===================================================================
--- trunk/mapbender/http/javascripts/mod_coordsLookup.js (rev 0)
+++ trunk/mapbender/http/javascripts/mod_coordsLookup.js 2009-08-31 13:30:38 UTC (rev 4581)
@@ -0,0 +1,140 @@
+/**
+ * Package: <Application element name>
+ *
+ * Description:
+ * <A description>
+ *
+ * Files:
+ * - <path and filename, like http/javascripts/mod_zoomIn1.php>
+ *
+ * SQL:
+INSERT INTO gui_element(fkey_gui_id, e_id, e_pos, e_public, e_comment, e_title, e_element, e_src, e_attributes, e_left, e_top, e_width, e_height, e_z_index, e_more_styles, e_content, e_closetag, e_js_file, e_mb_mod, e_target, e_requires, e_url) VALUES('gui_toni','coordsLookup',10,1,'','','div','','',1000,0,NULL ,NULL ,NULL ,'border:1px solid red;z-index:9999;','','div','mod_coordsLookup.js','../extensions/proj4js/lib/proj4js-combined.js','mapframe1','','');
+INSERT INTO gui_element_vars(fkey_gui_id, fkey_e_id, var_name, var_value, context, var_type) VALUES('gui_toni', 'coordsLookup', 'perimeters', '[50,200,1000,10000]', '' ,'var');
+INSERT INTO gui_element_vars(fkey_gui_id, fkey_e_id, var_name, var_value, context, var_type) VALUES('gui_toni', 'coordsLookup', 'projections', '[''EPSG:31467'',''EPSG:31468'',''EPSG:31469'']', '' ,'var');
+
+ * Help:
+ * http://www.mapbender.org/<wiki site name>
+ *
+ * Maintainer:
+ * http://www.mapbender.org/User:<user>
+ *
+ * Parameters:
+ * <normal element var name> - <type and description>
+ * <optional element var name> - *[optional]* <type and description>
+ * <deprecated element var name> - *[deprecated]* <type and description>
+ *
+ * License:
+ * Copyright (c) 2009, Open Source Geospatial Foundation
+ * This program is dual licensed under the GNU General Public License
+ * and Simplified BSD license.
+ * http://svn.osgeo.org/mapbender/trunk/mapbender/license/license.txt
+ */
+
+//
+// http://trac.osgeo.org/proj4js/wiki/UserGuide
+//
+
+var CoordsLookup = function() {
+
+ if(
+ typeof options.target === 'undefined' || options.target.length === 0 ||
+ typeof options.projections === 'undefined' || options.projections.length === 0 ||
+ typeof options.perimeters === 'undefined' || options.perimeters.length === 0
+ ) {
+ return;
+ }
+
+ this.buildForm = function() {
+// Container elements
+ this.formContainer = $(document.createElement('form')).attr({'id':'coords-lookup-form'}).appendTo('#' + options.id);
+ this.coordsInputContainer = $(document.createElement('p')).appendTo(this.formContainer);
+ this.projectionSelectContainer = $(document.createElement('p')).appendTo(this.formContainer);
+ this.perimeterSelectContainer = $(document.createElement('p')).appendTo(this.formContainer);
+ this.triggerButtonContainer = $(document.createElement('p')).appendTo(this.formContainer);
+// Coordinates input with label
+ this.coordsInputLabel = $(document.createElement('label')).attr({'for':'coord-x'}).text('Koordinaten:').appendTo(this.coordsInputContainer);
+ this.coordXInput = $(document.createElement('input')).attr({'id':'coord-x','size':8}).appendTo(this.coordsInputContainer);
+ this.coordYInput = $(document.createElement('input')).attr({'id':'coord-y','size':8}).appendTo(this.coordsInputContainer);
+ $(this.coordsInputLabel).after($(document.createElement('br')));
+ $(this.coordXInput).after(' / ');
+// Projection select
+ this.projectionSelect = $(document.createElement('select')).attr({'id':'projection-select'}).appendTo(this.projectionSelectContainer);
+// Perimeter select
+ this.perimeterSelect = $(document.createElement('select')).attr({'id':'perimeter-select'}).appendTo(this.perimeterSelectContainer);
+// Trigger button
+ this.triggerButton = $(document.createElement('input')).attr({'id':'trigger-button','type':'button','value':'Auf Koordinaten zoomen'}).appendTo(this.triggerButtonContainer);
+ };
+
+ this.initForm = function() {
+// Fill projection select with options
+ for(var i = 0; i < options.projections.length; i++) {
+ $(new Option(options.projections[i],options.projections[i])).appendTo(this.projectionSelect);
+ }
+ $(new Option('Projektionssystem','',true,true)).prependTo(this.projectionSelect);
+
+// Fill perimeter select with options
+ for(var i = 0; i < options.perimeters.length; i++) {
+ var optionValue = options.perimeters[i] + '';
+
+ optionValue = (optionValue.length < 4) ? (optionValue + ' m') : optionValue.replace(/(\d+)(\d{3})/, '$1' + '.' + '$2' + ' m');
+
+ $(new Option(optionValue,options.perimeters[i])).appendTo(this.perimeterSelect);
+ }
+ $(new Option('Umkreis','',true,true)).prependTo(this.perimeterSelect);
+
+// Set action for trigger button
+ $(this.triggerButton).click(function() {
+ Mapbender.modules[options.id].zoomToCoordinates();
+ });
+ };
+
+ this.zoomToCoordinates = function() {
+ this.coords = {}
+
+ this.coords.x = this.coordXInput.val().replace(',','.');
+ this.coords.y = this.coordYInput.val().replace(',','.');
+ this.coords.sourceProjection = (this.projectionSelect.val().length) ? this.projectionSelect.val() : false;
+ this.coords.targetProjection = Mapbender.modules[options.target].getSRS();
+ this.coords.perimeter = (this.perimeterSelect.val().length) ? this.perimeterSelect.val() : false;
+
+ if(
+ this.coords.x.length === 0 || isNaN(this.coords.x) ||
+ this.coords.y.length === 0 || isNaN(this.coords.y)
+ ) {
+ alert('Bitte geben Sie ein Koordinatenpaar ein.');
+ return;
+ }
+
+ if(this.coords.sourceProjection && (this.coords.sourceProjection != this.coords.targetProjection)) {
+ this.transformProjection();
+ }
+
+ zoom(options.target,true,1.0,this.coords.x,this.coords.y);
+ };
+
+ this.transformProjection = function() {
+// proj4js debug
+ Proj4js.reportError = function(msg) {
+ console.log('proj4js debug message: %s',msg);
+ }
+
+ var sourceProjection = new Proj4js.Proj(this.coords.sourceProjection);
+ var targetProjection = new Proj4js.Proj(this.coords.targetProjection);
+ var coords = new Proj4js.Point(this.coords.x,this.coords.y);
+
+ Proj4js.transform(sourceProjection,targetProjection,coords);
+
+ console.log('coords before transformation: %s/%s',this.coords.x,this.coords.y);
+ this.coords.x = coords.x;
+ this.coords.y = coords.y;
+ console.log('coords after transformation: %s/%s',this.coords.x,this.coords.y);
+ }
+
+ this.buildForm();
+ this.initForm();
+
+};
+
+Mapbender.events.init.register(function() {
+ Mapbender.modules[options.id] = $.extend(new CoordsLookup(),Mapbender.modules[options.id]);
+});
\ No newline at end of file
More information about the Mapbender_commits
mailing list