/branches/v5.3-amandaie/services/modules/0.1/moissonnage/cartes/SourceDonnees.php |
---|
113,13 → 113,14 |
private function construireWhereTaxonMoissonnage($source) { |
$nomRang = $this->obtenirNomRang(); |
$criteres = array(); |
$nom = ($source == "baznat") ? implode('%',explode(' ',$this->taxon['nom_complet'] )) : $this->taxon['nom_sci'] ; |
$criteres[] = "nom_scientifique_complet LIKE ".$this->bdd->proteger($nom); |
$criteres[] = ($source == "baznat" || $source == "ifn") ? |
"num_nom = ".$this->taxon['num_nom'] : |
"nom_scientifique_complet LIKE ".$this->bdd->proteger($this->taxon['nom_sci']) ; |
if ($this->nomRang == 'espece' || $this->nomRang == 'sous_espece') { |
foreach ($this->taxons as $sousTaxon) { |
$nom = ($source == "baznat") ? implode('%',explode(' ',$sousTaxon['nom_complet'] )) : $sousTaxon['nom_sci']; |
$criteres[] = "nom_scientifique_complet LIKE ".$this->bdd->proteger($nom); |
$criteres[] = ($source == "baznat" || $source == "ifn") ? |
"num_nom = ".$sousTaxon['num_nom'] : |
"nom_scientifique_complet LIKE ".$this->bdd->proteger($sousTaxon['nom_sci']) ; |
} |
} elseif ($this->nomRang == 'famille') { |
foreach ($this->genres as $genre) { |
/branches/v5.3-amandaie/services/configurations/config_moissonnage.ini |
---|
23,7 → 23,7 |
; Config spécifique au projet |
; Noms des services disponibles pour ce projet |
servicesDispo = "meta-donnees,aide,ontologies,cartes" |
sourcesDonnees = "floradata,sophy,baznat" |
sourcesDonnees = "floradata,sophy,baznat,ifn" |
rangs = "180,220,290,320" |
; referentiels utilises pour les donnees de moissonnage |
/branches/v5.3-amandaie/scripts/modules/moissonnage/Moissonnage.php |
---|
New file |
0,0 → 1,120 |
<?php |
/** Exemple lancement: |
* /opt/lampp/bin/php -d memory_limit=3500M ~/web/eflore-projets/scripts/cli.php moissonnage -a chargerDonnees -n baznat |
* Options : |
* -n : nom du projet |
*/ |
class Moissonnage extends EfloreScript { |
private $projet = ""; |
protected $parametres_autorises = array( |
'-n' => array(true, true, 'Préciser le nom du dataset que vous souhaitez ajouter ex. baznat, naturedugard-flore')); |
public function executer() { |
// Lancement de l'action demandée |
try { |
$this->initialiserProjet('moissonnage'); |
$cmd = $this->getParametre('a'); |
$this->projet = $this->getParametre('n'); |
switch ($cmd) { |
case 'chargerTous' : |
$this->chargerDonnees(); |
$this->chargerMetaDonnees(); |
break; |
case 'chargerDonnees' : |
$this->chargerDonnees(); |
break; |
case 'chargerMetadonnees' : |
$this->chargerMetaDonnees(); |
break; |
case 'supprimerTous' : |
$this->supprimerTous(); |
break; |
default : |
throw new Exception("Erreur : la commande '$cmd' n'existe pas!"); |
} |
} catch (Exception $e) { |
$this->traiterErreur($e->getMessage()); |
} |
} |
private function chargerDonnees() { |
$requete = "CREATE TABLE tb_eflore.".$this->projet."_tapir2 ". |
"AS SELECT concat('urn:lsid:',institutionCode,':',collectionCode,':', catalogNumber) AS guid, ". |
"`catalogNumber` AS observation_id, `scientificName` AS nom_scientifique_complet, `referencess` AS num_nom, ". |
"`county` AS lieu_station_nom, `locality` AS lieu_commune_code_insee, ". |
"`decimalLatitude` AS lieu_station_latitude, `decimalLongitude` AS lieu_station_longitude, `geodeticDatum` , ". |
"`eventDate` AS observation_date, `identifiedBy` AS observateur_nom_complet ". |
"FROM tb_moissonnage.Occurrence ". |
"WHERE dataset_id = (SELECT dataset_id FROM tb_moissonnage.Dataset WHERE name = '$this->projet')"; |
$this->getBdd()->requeter($requete); |
} |
private function chercherInfosMetaDonnees() { |
$infos = array(); |
$requeteOccurrence = "SELECT institutionCode, collectionCode FROM tb_moissonnage.Occurrence WHERE dataset_id = |
(SELECT id FROM tb_moissonnage.Dataset WHERE name='$this->projet');"; |
$infos['occurrence'] = $this->getBdd()->recuperer($requeteOccurrence); |
$requeteDataset = "SELECT * FROM tb_moissonnage.DataPublisher WHERE id = |
(SELECT dataPublisher_id FROM tb_moissonnage.Dataset WHERE name='$this->projet')"; |
$infos['dataPublisher'] = $this->getBdd()->recuperer($requeteDataset); |
return $infos; |
} |
private function chargerMetaDonnees() { |
$this->chargerStructureSqlMetaDonnees(); |
$infos = $this->chercherInfosMetaDonnees(); |
$date = date('Y_m_d'); |
$requete = "INSERT INTO tb_eflore.".$this->projet."_tapir_meta (guid, citation, url_projet, createurs) ". |
"VALUES ('urn:lsid:{$infos['occurrence']['institutionCode']}:{$infos['occurrence']['collectionCode']}:{$date}', '". |
$this->projet." : {$infos['dataPublisher']['description']} du ". |
"<a href=\"{$infos['occurrence']['institutionCode']}\" title=\"{$infos['occurrence']['collectionCode']}\" ". |
"onclick=\"window.open(this.href); return false;\">{$this->projet}</a>', ". |
"'{$infos['occurrence']['institutionCode']}', ". |
"'p.courriel={$infos['dataPublisher']['administrativeContact']}, p.courriel={$infos['dataPublisher']['technicalContact']}')"; |
$this->getBdd()->requeter($requete); |
} |
private function chargerStructureSqlMetaDonnees() { |
$date = date('Y_m_d'); |
$requete = "CREATE TABLE IF NOT EXISTS tb_eflore.".$this->projet."_tapir_meta ". |
"(`guid` varchar(255) NOT NULL , |
`langue_meta` varchar(2) NOT NULL DEFAULT 'fr', |
`code` varchar(20) NOT NULL DEFAULT '{$this->projet}', |
`version` varchar(20) NOT NULL DEFAULT '{$date}', |
`titre` varchar(255) NOT NULL DEFAULT '{$this->projet}', |
`description` text, |
`mots_cles` varchar(510) NOT NULL DEFAULT 'flore, observation, {$this->projet}', |
`citation` varchar(255) NOT NULL, |
`url_tech` varchar(510) DEFAULT NULL, |
`url_projet` varchar(510) NOT NULL, |
`source` text, |
`createurs` text NOT NULL, |
`editeur` text, |
`contributeurs` text, |
`droits` text, |
`url_droits` varchar(510) DEFAULT 'http://creativecommons.org/licenses/by-sa/2.0/fr/', |
`langue` varchar(255) DEFAULT 'fr', |
`date_creation` varchar(30) DEFAULT NULL, |
`date_validite` varchar(255) DEFAULT NULL, |
`couverture_spatiale` varchar(510) DEFAULT NULL, |
`couverture_temporelle` varchar(510) DEFAULT NULL, |
`web_services` varchar(255) DEFAULT 'meta-donnees:0.1;ontologies:0.1;cartes:0.1', |
PRIMARY KEY (`guid`,`langue_meta`) |
) ENGINE=MyISAM DEFAULT CHARSET=utf8;"; |
$this->getBdd()->requeter($requete); |
} |
private function supprimerTous() { |
$requete = "DROP TABLE IF EXISTS `ifn_arbres_forets`, `ifn_arbres_peupleraie`, `ifn_couverts_foret`, |
`ifn_documentation`, `ifn_documentation_flore`, `ifn_ecologie`, `ifn_flore`, `ifn_placettes_foret`, |
`ifn_placettes_peupleraie`; |
"; |
$this->getBdd()->requeter($requete); |
} |
} |
?> |
/branches/v5.3-amandaie/scripts/modules/moissonnage/moissonnage.ini |
---|
New file |
0,0 → 1,35 |
code = "ifn" |
versions = "2005,2006,2007,2008,2009,2010,2011,2012" |
categories = "arbresForet,arbresPeupleraie,couvertsForet,documentation,ecologie,flore,placettesForet,placettesPeupleraie" |
dossierTsv = "{ref:dossierDonneesEflore}{ref:code}/" |
dossierSql = "{ref:dossierTsv}" |
[tables] |
ifnMeta = "if_meta" |
documentationFlore = "ifn_documentation_flore" |
arbresForet = "ifn_arbres_foret" |
arbresPeupleraie = "ifn_arbres_peupleraie" |
couvertsForet = "ifn_couverts_foret" |
documentation = "ifn_documentation" |
ecologie = "ifn_ecologie" |
flore = "ifn_flore" |
placettesForet = "ifn_placettes_foret" |
placettesPeupleraie = "ifn_placettes_peupleraie" |
ifnTest = "ifn" |
[fichiers] |
structureSql = "{ref:code}.sql" |
arbresForet = "arbres_foret.csv" |
arbresPeupleraie = "arbres_peupleraie.csv" |
couvertsForet = "couverts_foret.csv" |
documentation = "documentation.csv" |
ecologie = "ecologie.csv" |
flore = "flore.csv" |
placettesForet = "placettes_foret.csv" |
placettesPeupleraie = "placettes_peupleraie.csv" |
documentationFlore = "documentation_flore.csv" |
[chemins] |
structureSql = "{ref:dossierSql}{ref:fichiers.structureSql}" |
documentation_flore = "{ref:dossierTsv}{ref:documentation_flore}" |
/branches/v5.3-amandaie/scripts/modules/ifn/Ifn.php |
---|
New file |
0,0 → 1,239 |
<?php |
/** Exemple lancement: |
* /opt/lampp/bin/php -d memory_limit=3500M cli.php ifn -a chargerTous |
* Options : |
* -t : Permet de tester le script sur un jeux réduit de données (indiquer le nombre de lignes). |
*/ |
class Ifn extends EfloreScript { |
public function executer() { |
// Lancement de l'action demandée |
try { |
$this->initialiserProjet('ifn'); |
$cmd = $this->getParametre('a'); |
switch ($cmd) { |
case 'chargerTous' : |
$this->chargerStructureSql(); |
$this->chargerDonnees("documentationFlore"); |
$this->chargerDonneesAnnuelles(); |
include_once dirname(__FILE__)."/bibliotheque/proj4php/proj4php.php"; |
$this->genererCoordonneesWgs('placettesForet'); |
$this->genererCoordonneesWgs('placettesPeupleraie'); |
break; |
case 'chargerStructure' : |
$this->chargerStructureSql(); |
break; |
case 'chargerDonnees' : |
$this->chargerDonnees("documentationFlore"); |
$this->chargerDonneesAnnuelles(); |
break; |
case 'genererCoordWgs' : |
include_once dirname(__FILE__)."/bibliotheque/proj4php/proj4php.php"; |
$this->genererCoordonneesWgs('placettesForet'); |
$this->genererCoordonneesWgs('placettesPeupleraie'); |
break; |
case 'genererCodeInsee' : |
$this->genererCodeInsee('placettesForet'); |
//$this->genererCodeInsee('placettesPeupleraie'); |
break; |
case 'creerVueTapir' : |
$this->creerVueTapir(); |
$this->ajouterTupleEfloreOntologies(); |
break; |
case 'supprimerTous' : |
$this->supprimerTous(); |
break; |
default : |
throw new Exception("Erreur : la commande '$cmd' n'existe pas!"); |
} |
} catch (Exception $e) { |
$this->traiterErreur($e->getMessage()); |
} |
} |
private function chargerDonneesAnnuelles() { |
$categories = explode(",",Config::get('categories')); |
$annees = explode(",",Config::get('versions')); |
foreach ($categories as $categorie) { |
foreach ($annees as $annee) { |
$this->chargerDonnees($categorie, $annee."/"); |
Debug::printr($categorie." ".$annee."\n"); |
} |
} |
} |
private function chargerDonnees($categorie, $annee = '') { |
$chemin = Config::get('dossierTsv').$annee.Config::get('fichiers.'.$categorie); |
$table = Config::get('tables.'.$categorie); |
$requete = "LOAD DATA INFILE '$chemin' ". |
"REPLACE INTO TABLE $table ". |
'CHARACTER SET utf8 '. |
'FIELDS '. |
" TERMINATED BY ';' ". |
" ENCLOSED BY '' ". |
" ESCAPED BY '\\\' ". |
'IGNORE 1 LINES'; |
$this->getBdd()->requeter($requete); |
} |
private function genererNumNomBdtfx() { |
$table = Config::get('tables.flore'); |
$placettes = $this->recupererTuplesPrChpCoordonnees($table); |
$this->preparerTablePrCoordWgs($table); |
foreach ($placettes as $placette) { |
$placette = $this->transformerCoordL93enWgs84($placette); |
$this->remplirChpCoordonnees($table, $placette); |
} |
} |
private function creerVueTapir() { |
$requete = "DROP VIEW ifn_tapir; CREATE VIEW ifn_tapir AS ". |
"SELECT f.idp as observation_id, b.nom_sci as nom_scientifique_complet, b.num_nom, ". |
" fo.lieu_commune_code_insee, fo.lieu_station_latitude, fo.lieu_station_longitude,". |
" 'WGS84' AS geodeticDatum, e.dateeco as observation_date, '' AS observateur_nom_complet". |
" FROM `bdtfx_v2_02` b, ifn_flore f, ifn_ecologie e, ifn_placettes_foret fo". |
" WHERE f.idp = e.idp". |
" AND e.idp = fo.idp". |
" AND b.cd_ref = f.cd_ref"; |
$this->getBdd()->requeter($requete); |
} |
private function ajouterTupleEfloreOntologies(){ // pour la légende |
$requete = "INSERT INTO `eflore_ontologies`(id,`classe_id`, `nom`, `description`, `code`, `complements`) VALUES ". |
"(24,10,'IFN',". |
"'données issues des données brutes mises en ligne de l\'Inventaire Forestier National',". |
"'ifn','legende=#F2B148')"; |
$this->getBdd()->requeter($requete); |
} |
private function genererCoordonneesWgs($categorie) { |
$table = Config::get('tables.'.$categorie); |
$placettes = $this->recupererTuplesPrChpCoordonnees($table); |
$this->preparerTablePrCoordWgs($table); |
foreach ($placettes as $placette) { |
$placette = $this->transformerCoordL93enWgs84($placette); |
$this->remplirChpCoordonnees($table, $placette); |
} |
} |
private function transformerCoordL93enWgs84($coord) { |
$proj4 = new Proj4php(); |
$projL93 = new Proj4phpProj('EPSG:2154',$proj4); |
$projWGS84 = new Proj4phpProj('EPSG:4326',$proj4); |
$projLI = new Proj4phpProj('EPSG:27571',$proj4); |
$projLSud = new Proj4phpProj('EPSG:27563',$proj4); |
$projL72 = new Proj4phpProj('EPSG:31370',$proj4); |
$pointSrc = new proj4phpPoint($coord['xl93'],$coord['yl93']); |
$pointDest = $proj4->transform($projL93,$projWGS84,$pointSrc); |
$coord['longitude_wgs'] = '"'.number_format($pointDest->x, 6).'"'; |
$coord['latitude_wgs'] = '"'.number_format($pointDest->y, 6).'"'; |
return $coord; |
} |
private function recupererTuplesPrChpCoordonnees($table) { |
$requete = 'SELECT idp, xl93, yl93 '. |
"FROM {$table} "; |
$resultat = $this->getBdd()->recupererTous($requete); |
return $resultat; |
} |
private function remplirChpCoordonnees($table, $placette) { |
$requete = "UPDATE {$table} ". |
" SET lieu_station_longitude = {$placette['longitude_wgs']} , lieu_station_latitude = {$placette['latitude_wgs']} ". |
" WHERE idp = {$placette['idp']} "; |
$resultat = $this->getBdd()->requeter($requete); |
if ($resultat === false) { |
throw new Exception("Erreur d'insertion pour le tuple $idp"); |
} |
} |
private function preparerTablePrCoordWgs($table) { |
$requete = "SHOW COLUMNS FROM {$table} LIKE 'lieu_station_latitude' "; |
$resultat = $this->getBdd()->recuperer($requete); |
if ($resultat === false) { |
$requete = "ALTER TABLE {$table} ". |
' ADD `lieu_station_latitude` DECIMAL( 9, 6 ),'. |
' ADD `lieu_station_longitude` DECIMAL( 9, 6 )'; |
$this->getBdd()->requeter($requete); |
} |
} |
private function genererCodeInsee($categorie) { |
$table = Config::get('tables.'.$categorie); |
$this->preparerTablePrChpCodeInsee($table); |
$liste_coordonnees = $this->recupererTuplesPrChpCodeInsee($table); |
foreach ($liste_coordonnees as $coordonnees) { |
$code_insee = $this->chercherCodeCommune($coordonnees['latitude'], $coordonnees['longitude']); |
if ($code_insee != "") { |
$this->remplirChpCodeInsee($table, $coordonnees['latitude'], $coordonnees['longitude'], $code_insee); |
} |
} |
} |
private function preparerTablePrChpCodeInsee($table) { |
$requete = "SHOW COLUMNS FROM {$table} LIKE 'lieu_commune_code_insee' "; |
$resultat = $this->getBdd()->recuperer($requete); |
if ($resultat === false) { |
$requete = "ALTER TABLE {$table} ". |
' ADD `lieu_commune_code_insee` VARCHAR(5);'; |
$this->getBdd()->requeter($requete); |
} |
} |
private function recupererTuplesPrChpCodeInsee($table) { |
$requete = 'SELECT distinct lieu_station_latitude as latitude, lieu_station_longitude as longitude '. |
"FROM {$table} WHERE lieu_commune_code_insee IS NULL "; |
$resultat = $this->getBdd()->recupererTous($requete); |
return $resultat; |
} |
private function remplirChpCodeInsee($table, $latitude, $longitude, $code_insee) { |
$requete = "UPDATE {$table} ". |
" SET lieu_commune_code_insee = '{$code_insee}'". |
" WHERE lieu_station_longitude = {$longitude} AND lieu_station_latitude = {$latitude} "; |
$resultat = $this->getBdd()->requeter($requete); |
if ($resultat === false) { |
throw new Exception("Erreur d'insertion pour le tuple $idp"); |
} |
} |
private function chercherCodeCommune($latitude, $longitude) { |
$code_insee = ''; |
if ($this->testerCoordonneesWgsFrance($latitude, $longitude)) { |
$url_service = "api.tela-botanica.org/service:eflore:0.1/osm/nom-commune". |
"?lat={$latitude}&lon={$longitude}"; |
$url_service = str_replace(',', '.', $url_service); |
$ch = curl_init($url_service); |
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); |
$reponse = curl_exec($ch); |
$reponse = json_decode($reponse); |
if (isset($reponse->codeINSEE)) { |
$code_insee = $reponse->codeINSEE; |
} |
curl_close($ch); |
} |
return $code_insee; |
} |
private function testerCoordonneesWgsFrance($latitude, $longitude) { |
$coord_france = false; |
if ($latitude != '' && $longitude != '') { |
if ($latitude < 51.071667 && $latitude > 41.316667) { |
if ($longitude < 9.513333 && $longitude > -5.140278) { |
$coord_france = true; |
} |
} |
} |
return $coord_france; |
} |
private function supprimerTous() { |
$requete = "DROP TABLE IF EXISTS `ifn_arbres_forets`, `ifn_arbres_peupleraie`, `ifn_couverts_foret`, |
`ifn_documentation`, `ifn_documentation_flore`, `ifn_ecologie`, `ifn_flore`, `ifn_placettes_foret`, |
`ifn_placettes_peupleraie`; |
"; |
$this->getBdd()->requeter($requete); |
} |
} |
?> |
/branches/v5.3-amandaie/scripts/modules/ifn/ifn.ini |
---|
New file |
0,0 → 1,35 |
code = "ifn" |
versions = "2005,2006,2007,2008,2009,2010,2011,2012" |
categories = "arbresForet,arbresPeupleraie,couvertsForet,documentation,ecologie,flore,placettesForet,placettesPeupleraie" |
dossierTsv = "{ref:dossierDonneesEflore}{ref:code}/" |
dossierSql = "{ref:dossierTsv}" |
[tables] |
ifnMeta = "if_meta" |
documentationFlore = "ifn_documentation_flore" |
arbresForet = "ifn_arbres_foret" |
arbresPeupleraie = "ifn_arbres_peupleraie" |
couvertsForet = "ifn_couverts_foret" |
documentation = "ifn_documentation" |
ecologie = "ifn_ecologie" |
flore = "ifn_flore" |
placettesForet = "ifn_placettes_foret" |
placettesPeupleraie = "ifn_placettes_peupleraie" |
ifnTest = "ifn" |
[fichiers] |
structureSql = "{ref:code}.sql" |
arbresForet = "arbres_foret.csv" |
arbresPeupleraie = "arbres_peupleraie.csv" |
couvertsForet = "couverts_foret.csv" |
documentation = "documentation.csv" |
ecologie = "ecologie.csv" |
flore = "flore.csv" |
placettesForet = "placettes_foret.csv" |
placettesPeupleraie = "placettes_peupleraie.csv" |
documentationFlore = "documentation_flore.csv" |
[chemins] |
structureSql = "{ref:dossierSql}{ref:fichiers.structureSql}" |
documentation_flore = "{ref:dossierTsv}{ref:documentation_flore}" |
/branches/v5.3-amandaie/scripts/modules/ifn/bibliotheque/proj4php/proj4phpPoint.php |
---|
New file |
0,0 → 1,86 |
<?php |
/** |
* Author : Julien Moquet |
* |
* Inspired by Proj4js from Mike Adair madairATdmsolutions.ca |
* and Richard Greenwood rich@greenwoodmap.com |
* License: LGPL as per: http://www.gnu.org/copyleft/lesser.html |
*/ |
/** |
* 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. |
*/ |
class proj4phpPoint { |
public $x; |
public $y; |
public $z; |
/** |
* 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. |
*/ |
public function __construct( $x = null, $y = null, $z = null ) { |
if( is_array( $x ) ) { |
$this->x = $x[0]; |
$this->y = $x[1]; |
$this->z = isset($x[2]) ? $x[2] : 0.0;#(count( $x ) > 2) ? $x[2] : 0.0; |
} else if( is_string( $x ) && !is_numeric( $y ) ) { |
$coord = explode( ' ', $x ); |
$this->x = floatval( $coord[0] ); |
$this->y = floatval( $coord[1] ); |
$this->z = (count( $coord ) > 2) ? floatval( $coord[2] ) : 0.0; |
} else { |
$this->x = $x !== null ? $x : 0.0; |
$this->y = $y !== null ? $y : 0.0; |
$this->z = $z !== null ? $z : 0.0; |
} |
} |
/** |
* APIMethod: clone |
* Build a copy of a Proj4js.Point object. |
* |
* renamed because of PHP keyword. |
* |
* Return: |
* {Proj4js}.Point the cloned point. |
*/ |
public function _clone() { |
return new Proj4phpPoint( $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>) |
*/ |
public function toString() { |
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>) |
*/ |
public function toShortString() { |
return $this->x . " " . $this->y; |
} |
} |
/branches/v5.3-amandaie/scripts/modules/ifn/bibliotheque/proj4php/LGPL GNU lesser licence.txt |
---|
New file |
0,0 → 1,165 |
GNU LESSER GENERAL PUBLIC LICENSE |
Version 3, 29 June 2007 |
Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/> |
Everyone is permitted to copy and distribute verbatim copies |
of this license document, but changing it is not allowed. |
This version of the GNU Lesser General Public License incorporates |
the terms and conditions of version 3 of the GNU General Public |
License, supplemented by the additional permissions listed below. |
0. Additional Definitions. |
As used herein, "this License" refers to version 3 of the GNU Lesser |
General Public License, and the "GNU GPL" refers to version 3 of the GNU |
General Public License. |
"The Library" refers to a covered work governed by this License, |
other than an Application or a Combined Work as defined below. |
An "Application" is any work that makes use of an interface provided |
by the Library, but which is not otherwise based on the Library. |
Defining a subclass of a class defined by the Library is deemed a mode |
of using an interface provided by the Library. |
A "Combined Work" is a work produced by combining or linking an |
Application with the Library. The particular version of the Library |
with which the Combined Work was made is also called the "Linked |
Version". |
The "Minimal Corresponding Source" for a Combined Work means the |
Corresponding Source for the Combined Work, excluding any source code |
for portions of the Combined Work that, considered in isolation, are |
based on the Application, and not on the Linked Version. |
The "Corresponding Application Code" for a Combined Work means the |
object code and/or source code for the Application, including any data |
and utility programs needed for reproducing the Combined Work from the |
Application, but excluding the System Libraries of the Combined Work. |
1. Exception to Section 3 of the GNU GPL. |
You may convey a covered work under sections 3 and 4 of this License |
without being bound by section 3 of the GNU GPL. |
2. Conveying Modified Versions. |
If you modify a copy of the Library, and, in your modifications, a |
facility refers to a function or data to be supplied by an Application |
that uses the facility (other than as an argument passed when the |
facility is invoked), then you may convey a copy of the modified |
version: |
a) under this License, provided that you make a good faith effort to |
ensure that, in the event an Application does not supply the |
function or data, the facility still operates, and performs |
whatever part of its purpose remains meaningful, or |
b) under the GNU GPL, with none of the additional permissions of |
this License applicable to that copy. |
3. Object Code Incorporating Material from Library Header Files. |
The object code form of an Application may incorporate material from |
a header file that is part of the Library. You may convey such object |
code under terms of your choice, provided that, if the incorporated |
material is not limited to numerical parameters, data structure |
layouts and accessors, or small macros, inline functions and templates |
(ten or fewer lines in length), you do both of the following: |
a) Give prominent notice with each copy of the object code that the |
Library is used in it and that the Library and its use are |
covered by this License. |
b) Accompany the object code with a copy of the GNU GPL and this license |
document. |
4. Combined Works. |
You may convey a Combined Work under terms of your choice that, |
taken together, effectively do not restrict modification of the |
portions of the Library contained in the Combined Work and reverse |
engineering for debugging such modifications, if you also do each of |
the following: |
a) Give prominent notice with each copy of the Combined Work that |
the Library is used in it and that the Library and its use are |
covered by this License. |
b) Accompany the Combined Work with a copy of the GNU GPL and this license |
document. |
c) For a Combined Work that displays copyright notices during |
execution, include the copyright notice for the Library among |
these notices, as well as a reference directing the user to the |
copies of the GNU GPL and this license document. |
d) Do one of the following: |
0) Convey the Minimal Corresponding Source under the terms of this |
License, and the Corresponding Application Code in a form |
suitable for, and under terms that permit, the user to |
recombine or relink the Application with a modified version of |
the Linked Version to produce a modified Combined Work, in the |
manner specified by section 6 of the GNU GPL for conveying |
Corresponding Source. |
1) Use a suitable shared library mechanism for linking with the |
Library. A suitable mechanism is one that (a) uses at run time |
a copy of the Library already present on the user's computer |
system, and (b) will operate properly with a modified version |
of the Library that is interface-compatible with the Linked |
Version. |
e) Provide Installation Information, but only if you would otherwise |
be required to provide such information under section 6 of the |
GNU GPL, and only to the extent that such information is |
necessary to install and execute a modified version of the |
Combined Work produced by recombining or relinking the |
Application with a modified version of the Linked Version. (If |
you use option 4d0, the Installation Information must accompany |
the Minimal Corresponding Source and Corresponding Application |
Code. If you use option 4d1, you must provide the Installation |
Information in the manner specified by section 6 of the GNU GPL |
for conveying Corresponding Source.) |
5. Combined Libraries. |
You may place library facilities that are a work based on the |
Library side by side in a single library together with other library |
facilities that are not Applications and are not covered by this |
License, and convey such a combined library under terms of your |
choice, if you do both of the following: |
a) Accompany the combined library with a copy of the same work based |
on the Library, uncombined with any other library facilities, |
conveyed under the terms of this License. |
b) Give prominent notice with the combined library that part of it |
is a work based on the Library, and explaining where to find the |
accompanying uncombined form of the same work. |
6. Revised Versions of the GNU Lesser General Public License. |
The Free Software Foundation may publish revised and/or new versions |
of the GNU Lesser General Public License from time to time. Such new |
versions will be similar in spirit to the present version, but may |
differ in detail to address new problems or concerns. |
Each version is given a distinguishing version number. If the |
Library as you received it specifies that a certain numbered version |
of the GNU Lesser General Public License "or any later version" |
applies to it, you have the option of following the terms and |
conditions either of that published version or of any later version |
published by the Free Software Foundation. If the Library as you |
received it does not specify a version number of the GNU Lesser |
General Public License, you may choose any version of the GNU Lesser |
General Public License ever published by the Free Software Foundation. |
If the Library as you received it specifies that a proxy can decide |
whether future versions of the GNU Lesser General Public License shall |
apply, that proxy's public statement of acceptance of any version is |
permanent authorization for you to choose that version for the |
Library. |
Property changes: |
Added: svn:eol-style |
+native |
\ No newline at end of property |
/branches/v5.3-amandaie/scripts/modules/ifn/bibliotheque/proj4php/proj4phpDatum.php |
---|
New file |
0,0 → 1,401 |
<?php |
/** |
* Author : Julien Moquet |
* |
* Inspired by Proj4js from Mike Adair madairATdmsolutions.ca |
* and Richard Greenwood rich@greenwoodma$p->com |
* License: LGPL as per: http://www.gnu.org/copyleft/lesser.html |
*/ |
/** datum object |
*/ |
class proj4phpDatum { |
public $datum_type; |
public $datum_params; |
/** |
* |
* @param type $proj |
*/ |
public function __construct( $proj ) { |
$this->datum_type = Proj4php::$common->PJD_WGS84; //default setting |
if( isset($proj->datumCode) && $proj->datumCode == 'none' ) { |
$this->datum_type = Proj4php::$common->PJD_NODATUM; |
} |
if( isset( $proj->datum_params ) ) { |
for( $i = 0; $i < sizeof( $proj->datum_params ); $i++ ) { |
$proj->datum_params[$i] = floatval( $proj->datum_params[$i] ); |
} |
if( $proj->datum_params[0] != 0 || $proj->datum_params[1] != 0 || $proj->datum_params[2] != 0 ) { |
$this->datum_type = Proj4php::$common->PJD_3PARAM; |
} |
if( sizeof( $proj->datum_params ) > 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 = Proj4php::$common->PJD_7PARAM; |
$proj->datum_params[3] *= Proj4php::$common->SEC_TO_RAD; |
$proj->datum_params[4] *= Proj4php::$common->SEC_TO_RAD; |
$proj->datum_params[5] *= Proj4php::$common->SEC_TO_RAD; |
$proj->datum_params[6] = ($proj->datum_params[6] / 1000000.0) + 1.0; |
} |
} |
$this->datum_params = $proj->datum_params; |
} |
if( isset( $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; |
} |
} |
/** |
* |
* @param type $dest |
* @return boolean Returns TRUE if the two datums match, otherwise FALSE. |
* @throws type |
*/ |
public function compare_datums( $dest ) { |
if( $this->datum_type != $dest->datum_type ) { |
return false; // false, datums are not equal |
} else if( $this->a != $dest->a || 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 == Proj4php::$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 == Proj4php::$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 == Proj4php::$common->PJD_GRIDSHIFT || |
$dest->datum_type == Proj4php::$common->PJD_GRIDSHIFT ) { |
throw(new Exception( "ERROR: Grid shift transformations are not implemented." )); |
return false; |
} |
return true; // datums are equal |
} |
/* |
* 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) |
* |
*/ |
public function geodetic_to_geocentric( $p ) { |
$Longitude = $p->x; |
$Latitude = $p->y; |
$Height = isset( $p->z ) ? $p->z : 0; //Z value not always supplied |
$Error_Code = 0; // GEOCENT_NO_ERROR; |
/* |
* * 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 cos() and sin(). NFW for PROJ.4, Sep/2001. |
*/ |
if( $Latitude < -Proj4php::$common->HALF_PI && $Latitude > -1.001 * Proj4php::$common->HALF_PI ) { |
$Latitude = -Proj4php::$common->HALF_PI; |
} else if( $Latitude > Proj4php::$common->HALF_PI && $Latitude < 1.001 * Proj4php::$common->HALF_PI ) { |
$Latitude = Proj4php::$common->HALF_PI; |
} else if( ($Latitude < -Proj4php::$common->HALF_PI) || ($Latitude > Proj4php::$common->HALF_PI) ) { |
/* Latitude out of range */ |
Proj4php::reportError( 'geocent:lat out of range:' . $Latitude ); |
return null; |
} |
if( $Longitude > Proj4php::$common->PI ) |
$Longitude -= (2 * Proj4php::$common->PI); |
$Sin_Lat = sin( $Latitude ); /* sin(Latitude) */ |
$Cos_Lat = cos( $Latitude ); /* cos(Latitude) */ |
$Sin2_Lat = $Sin_Lat * $Sin_Lat; /* Square of sin(Latitude) */ |
$Rn = $this->a / (sqrt( 1.0e0 - $this->es * $Sin2_Lat )); /* Earth radius at location */ |
$p->x = ($Rn + $Height) * $Cos_Lat * cos( $Longitude ); |
$p->y = ($Rn + $Height) * $Cos_Lat * sin( $Longitude ); |
$p->z = (($Rn * (1 - $this->es)) + $Height) * $Sin_Lat; |
return $Error_Code; |
} |
/** |
* |
* @param object $p |
* @return type |
*/ |
public function geocentric_to_geodetic( $p ) { |
/* local defintions and variables */ |
/* end-criterium of loop, accuracy of sin(Latitude) */ |
$genau = 1.E-12; |
$genau2 = ($genau * $genau); |
$maxiter = 30; |
$X = $p->x; |
$Y = $p->y; |
$Z = $p->z ? $p->z : 0.0; //Z value not always supplied |
/* |
$P; // distance between semi-minor axis and location |
$RR; // distance between center and location |
$CT; // sin of geocentric latitude |
$ST; // cos of geocentric latitude |
$RX; |
$RK; |
$RN; // Earth radius at location |
$CPHI0; // cos of start or old geodetic latitude in iterations |
$SPHI0; // sin of start or old geodetic latitude in iterations |
$CPHI; // cos of searched geodetic latitude |
$SPHI; // sin of searched geodetic latitude |
$SDPHI; // end-criterium: addition-theorem of sin(Latitude(iter)-Latitude(iter-1)) |
$At_Pole; // indicates location is in polar region |
$iter; // of continous iteration, max. 30 is always enough (s.a.) |
$Longitude; |
$Latitude; |
$Height; |
*/ |
$At_Pole = false; |
$P = sqrt( $X * $X + $Y * $Y ); |
$RR = 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 = Proj4php::$common->HALF_PI; |
$Height = -$this->b; |
return; |
} |
} else { |
/* ellipsoidal (geodetic) longitude |
* interval: -PI < Longitude <= +PI */ |
$Longitude = 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 res$p-> |
* 2*10**-7 arcsec. |
* -------------------------------------------------------------- |
*/ |
$CT = $Z / $RR; |
$ST = $P / $RR; |
$RX = 1.0 / 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) res$p-> Latitude |
* until |sin(Latitude(iter)-Latitude(iter-1))| < genau */ |
do { |
++$iter; |
$RN = $this->a / 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 / 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 = atan( $SPHI / abs( $CPHI ) ); |
$p->x = $Longitude; |
$p->y = $Latitude; |
$p->z = $Height; |
return $p; |
} |
/** |
* 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 |
* |
* @param object Point $p |
* @return object Point $p |
*/ |
public function geocentric_to_geodetic_noniter( $p ) { |
/* |
$Longitude; |
$Latitude; |
$Height; |
$W; // distance from Z axis |
$W2; // square of distance from Z axis |
$T0; // initial estimate of vertical component |
$T1; // corrected estimate of vertical component |
$S0; // initial estimate of horizontal component |
$S1; // corrected estimate of horizontal component |
$Sin_B0; // sin(B0), B0 is estimate of Bowring aux variable |
$Sin3_B0; // cube of sin(B0) |
$Cos_B0; // cos(B0) |
$Sin_p1; // sin(phi1), phi1 is estimated latitude |
$Cos_p1; // cos(phi1) |
$Rn; // Earth radius at location |
$Sum; // numerator of cos(phi1) |
$At_Pole; // indicates location is in polar region |
*/ |
$X = floatval( $p->x ); // cast from string to float |
$Y = floatval( $p->y ); |
$Z = floatval( $p->z ? $p->z : 0 ); |
$At_Pole = false; |
if( $X <> 0.0 ) { |
$Longitude = atan2( $Y, $X ); |
} else { |
if( $Y > 0 ) { |
$Longitude = Proj4php::$common->HALF_PI; |
} else if( Y < 0 ) { |
$Longitude = -Proj4php::$common->HALF_PI; |
} else { |
$At_Pole = true; |
$Longitude = 0.0; |
if( $Z > 0.0 ) { /* north pole */ |
$Latitude = Proj4php::$common->HALF_PI; |
} else if( Z < 0.0 ) { /* south pole */ |
$Latitude = -Proj4php::$common->HALF_PI; |
} else { /* center of earth */ |
$Latitude = Proj4php::$common->HALF_PI; |
$Height = -$this->b; |
return; |
} |
} |
} |
$W2 = $X * $X + $Y * $Y; |
$W = sqrt( $W2 ); |
$T0 = $Z * Proj4php::$common->AD_C; |
$S0 = 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 = sqrt( $T1 * $T1 + $Sum * $Sum ); |
$Sin_p1 = $T1 / $S1; |
$Cos_p1 = $Sum / $S1; |
$Rn = $this->a / sqrt( 1.0 - $this->es * $Sin_p1 * $Sin_p1 ); |
if( $Cos_p1 >= Proj4php::$common->COS_67P5 ) { |
$Height = $W / $Cos_p1 - $Rn; |
} else if( $Cos_p1 <= -Proj4php::$common->COS_67P5 ) { |
$Height = $W / -$Cos_p1 - $Rn; |
} else { |
$Height = $Z / $Sin_p1 + $Rn * ($this->es - 1.0); |
} |
if( $At_Pole == false ) { |
$Latitude = atan( $Sin_p1 / $Cos_p1 ); |
} |
$p->x = $Longitude; |
$p->y = $Latitude; |
$p->z = $Height; |
return $p; |
} |
/************************************************************** */ |
// pj_geocentic_to_wgs84( p ) |
// p = point to transform in geocentric coordinates (x,y,z) |
public function geocentric_to_wgs84( $p ) { |
if( $this->datum_type == Proj4php::$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 == Proj4php::$common->PJD_7PARAM ) { |
$Dx_BF = $this->datum_params[0]; |
$Dy_BF = $this->datum_params[1]; |
$Dz_BF = $this->datum_params[2]; |
$Rx_BF = $this->datum_params[3]; |
$Ry_BF = $this->datum_params[4]; |
$Rz_BF = $this->datum_params[5]; |
$M_BF = $this->datum_params[6]; |
// if( x[io] == HUGE_VAL ) |
// continue; |
$p->x = $M_BF * ( $p->x - $Rz_BF * $p->y + $Ry_BF * $p->z) + $Dx_BF; |
$p->y = $M_BF * ( $Rz_BF * $p->x + $p->y - $Rx_BF * $p->z) + $Dy_BF; |
$p->z = $M_BF * (-$Ry_BF * $p->x + $Rx_BF * $p->y + $p->z) + $Dz_BF; |
} |
} |
/*************************************************************** */ |
// pj_geocentic_from_wgs84() |
// coordinate system definition, |
// point to transform in geocentric coordinates (x,y,z) |
public function geocentric_from_wgs84( $p ) { |
if( $this->datum_type == Proj4php::$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 == Proj4php::$common->PJD_7PARAM ) { |
$Dx_BF = $this->datum_params[0]; |
$Dy_BF = $this->datum_params[1]; |
$Dz_BF = $this->datum_params[2]; |
$Rx_BF = $this->datum_params[3]; |
$Ry_BF = $this->datum_params[4]; |
$Rz_BF = $this->datum_params[5]; |
$M_BF = $this->datum_params[6]; |
$x_tmp = ($p->x - $Dx_BF) / $M_BF; |
$y_tmp = ($p->y - $Dy_BF) / $M_BF; |
$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() |
} |
} |
/branches/v5.3-amandaie/scripts/modules/ifn/bibliotheque/proj4php/proj4phpProj.php |
---|
New file |
0,0 → 1,641 |
<?php |
/** |
* Author : Julien Moquet |
* |
* Inspired by Proj4js from Mike Adair madairATdmsolutions.ca |
* and Richard Greenwood rich@greenwoodmap.com |
* License: LGPL as per: http://www.gnu.org/copyleft/lesser.html |
*/ |
class Proj4phpProj { |
/** |
* Property: readyToUse |
* Flag to indicate if initialization is complete for $this Proj object |
*/ |
public $readyToUse = false; |
/** |
* Property: title |
* The title to describe the projection |
*/ |
public $title = null; |
/** |
* Property: projName |
* The projection class for $this projection, e.g. lcc (lambert conformal conic, |
* or merc for mercator). These are exactly equivalent to their Proj4 |
* counterparts. |
*/ |
public $projName = null; |
/** |
* Property: projection |
* The projection object for $this projection. */ |
public $projection = null; |
/** |
* Property: units |
* The units of the projection. Values include 'm' and 'degrees' |
*/ |
public $units = null; |
/** |
* Property: datum |
* The datum specified for the projection |
*/ |
public $datum = null; |
/** |
* Property: x0 |
* The x coordinate origin |
*/ |
public $x0 = 0; |
/** |
* Property: y0 |
* The y coordinate origin |
*/ |
public $y0 = 0; |
/** |
* Property: localCS |
* Flag to indicate if the projection is a local one in which no transforms |
* are required. |
*/ |
public $localCS = false; |
/** |
* |
* @var type |
*/ |
protected $wktRE = '/^(\w+)\[(.*)\]$/'; |
/** |
* Constructor: initialize |
* Constructor for Proj4php::Proj objects |
* |
* Parameters: |
* $srsCode - a code for map projection definition parameters. These are usually |
* (but not always) EPSG codes. |
*/ |
public function __construct( $srsCode ) { |
$this->srsCodeInput = $srsCode; |
//check to see if $this is a WKT string |
if( (strpos( $srsCode, 'GEOGCS' ) !== false) || |
(strpos( $srsCode, 'GEOCCS' ) !== false) || |
(strpos( $srsCode, 'PROJCS' ) !== false) || |
(strpos( $srsCode, 'LOCAL_CS' ) !== false) ) { |
$this->parseWKT( $srsCode ); |
$this->deriveConstants(); |
$this->loadProjCode( $this->projName ); |
return; |
} |
// DGR 2008-08-03 : support urn and url |
if( strpos( $srsCode, 'urn:' ) === 0 ) { |
//urn:ORIGINATOR:def:crs:CODESPACE:VERSION:ID |
$urn = explode( ':', $srsCode ); |
if( ($urn[1] == 'ogc' || $urn[1] == 'x-ogc') && |
($urn[2] == 'def') && |
($urn[3] == 'crs') ) { |
$srsCode = $urn[4] . ':' . $urn[strlen( $urn ) - 1]; |
} |
} else if( strpos( $srsCode, 'http://' ) === 0 ) { |
//url#ID |
$url = explode( '#', $srsCode ); |
if( preg_match( "/epsg.org/", $url[0] ) ) { |
// http://www.epsg.org/# |
$srsCode = 'EPSG:' . $url[1]; |
} else if( preg_match( "/RIG.xml/", $url[0] ) ) { |
//http://librairies.ign.fr/geoportail/resources/RIG.xml# |
//http://interop.ign.fr/registers/ign/RIG.xml# |
$srsCode = 'IGNF:' . $url[1]; |
} |
} |
$this->srsCode = strtoupper( $srsCode ); |
if( strpos( $this->srsCode, "EPSG" ) === 0 ) { |
$this->srsCode = $this->srsCode; |
$this->srsAuth = 'epsg'; |
$this->srsProjNumber = substr( $this->srsCode, 5 ); |
// DGR 2007-11-20 : authority IGNF |
} else if( strpos( $this->srsCode, "IGNF" ) === 0 ) { |
$this->srsCode = $this->srsCode; |
$this->srsAuth = 'IGNF'; |
$this->srsProjNumber = substr( $this->srsCode, 5 ); |
// DGR 2008-06-19 : pseudo-authority CRS for WMS |
} else if( strpos( $this->srsCode, "CRS" ) === 0 ) { |
$this->srsCode = $this->srsCode; |
$this->srsAuth = 'CRS'; |
$this->srsProjNumber = substr( $this->srsCode, 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. |
* |
*/ |
public function loadProjDefinition() { |
//check in memory |
if( array_key_exists( $this->srsCode, Proj4php::$defs ) ) { |
$this->defsLoaded(); |
return; |
} |
//else check for def on the server |
$filename = dirname( __FILE__ ) . '/defs/' . strtoupper( $this->srsAuth ) . $this->srsProjNumber . '.php'; |
try { |
Proj4php::loadScript( $filename ); |
$this->defsLoaded(); // succes |
} catch ( Exception $e ) { |
$this->loadFromService(); // fail |
} |
} |
/** |
* Function: loadFromService |
* Creates the REST URL for loading the definition from a web service and |
* loads it. |
* |
* |
* DO IT AGAIN. : SHOULD PHP CODE BE GET BY WEBSERVICES ? |
*/ |
public function loadFromService() { |
//else load from web service |
$url = Proj4php::$defsLookupService . '/' . $this->srsAuth . '/' . $this->srsProjNumber . '/proj4/'; |
try { |
Proj4php::$defs[strtoupper($this->srsAuth) . ":" . $this->srsProjNumber] = Proj4php::loadScript( $url ); |
} catch ( Exception $e ) { |
$this->defsFailed(); |
} |
} |
/** |
* Function: defsLoaded |
* Continues the Proj object initilization once the def file is loaded |
* |
*/ |
public function defsLoaded() { |
$this->parseDefs(); |
$this->loadProjCode( $this->projName ); |
} |
/** |
* Function: checkDefsLoaded |
* $this is the loadCheck method to see if the def object exists |
* |
*/ |
public function checkDefsLoaded() { |
return isset(Proj4php::$defs[$this->srsCode]) && !empty(Proj4php::$defs[$this->srsCode]); |
} |
/** |
* Function: defsFailed |
* Report an error in loading the defs file, but continue on using WGS84 |
* |
*/ |
public function defsFailed() { |
Proj4php::reportError( 'failed to load projection definition for: ' . $this->srsCode ); |
Proj4php::$defs[$this->srsCode] = Proj4php::$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 proj4php |
* |
* An exception occurs if the projection is not found. |
*/ |
public function loadProjCode( $projName ) { |
if( array_key_exists( $projName, Proj4php::$proj ) ) { |
$this->initTransforms(); |
return; |
} |
//the filename for the projection code |
$filename = dirname( __FILE__ ) . '/projCode/' . $projName . '.php'; |
try { |
Proj4php::loadScript( $filename ); |
$this->loadProjCodeSuccess( $projName ); |
} catch ( Exception $e ) { |
$this->loadProjCodeFailure( $projName ); |
} |
} |
/** |
* Function: loadProjCodeSuccess |
* Loads any proj dependencies or continue on to final initialization. |
* |
*/ |
public function loadProjCodeSuccess( $projName ) { |
if( isset(Proj4php::$proj[$projName]->dependsOn) && !empty(Proj4php::$proj[$projName]->dependsOn)) { |
$this->loadProjCode( Proj4php::$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. |
* |
*/ |
public function loadProjCodeFailure( $projName ) { |
Proj4php::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 |
* |
*/ |
public function checkCodeLoaded( $projName ) { |
return isset(Proj4php::$proj[$projName]) && !empty(Proj4php::$proj[$projName]); |
} |
/** |
* Function: initTransforms |
* Finalize the initialization of the Proj object |
* |
*/ |
public function initTransforms() { |
$this->projection = clone(Proj4php::$proj[$this->projName]); |
Proj4php::extend( $this->projection, $this ); |
$this->init(); |
// initiate depending class |
if( false !== ($dependsOn = isset($this->projection->dependsOn) && !empty($this->projection->dependsOn) ? $this->projection->dependsOn : false) ) { |
Proj4php::extend( Proj4php::$proj[$dependsOn], $this->projection) && |
Proj4php::$proj[$dependsOn]->init() && |
Proj4php::extend( $this->projection, Proj4php::$proj[$dependsOn] ); |
} |
$this->readyToUse = true; |
} |
/** |
* |
*/ |
public function init() { |
$this->projection->init(); |
} |
/** |
* |
* @param type $pt |
* @return type |
*/ |
public function forward( $pt ) { |
return $this->projection->forward( $pt ); |
} |
/** |
* |
* @param type $pt |
* @return type |
*/ |
public function inverse( $pt ) { |
return $this->projection->inverse( $pt ); |
} |
/** |
* Function: parseWKT |
* Parses a WKT string to get initialization parameters |
* |
*/ |
public function parseWKT( $wkt ) { |
if( false === ($match = preg_match( $this->wktRE, $wkt, $wktMatch )) ) |
return; |
$wktObject = $wktMatch[1]; |
$wktContent = $wktMatch[2]; |
$wktTemp = explode( ",", $wktContent ); |
$wktName = (strtoupper($wktObject) == "TOWGS84") ? "TOWGS84" : array_shift( $wktTemp ); |
$wktName = preg_replace( '/^\"/', "", $wktName ); |
$wktName = preg_replace( '/\"$/', "", $wktName ); |
/* |
$wktContent = implode(",",$wktTemp); |
$wktArray = explode("],",$wktContent); |
for ($i=0; i<sizeof($wktArray)-1; ++$i) { |
$wktArray[$i] .= "]"; |
} |
*/ |
$wktArray = array(); |
$bkCount = 0; |
$obj = ""; |
foreach( $wktTemp as $token ) { |
$bkCount = substr_count($token, "[") - substr_count($token, "]"); |
// ??? |
$obj .= $token; |
if( $bkCount === 0 ) { |
array_push( $wktArray, $obj ); |
$obj = ""; |
} else { |
$obj .= ","; |
} |
} |
//do something based on the type of the wktObject being parsed |
//add in variations in the spelling as required |
switch( $wktObject ) { |
case 'LOCAL_CS': |
$this->projName = 'identity'; |
$this->localCS = true; |
$this->srsCode = $wktName; |
break; |
case 'GEOGCS': |
$this->projName = 'longlat'; |
$this->geocsCode = $wktName; |
if( !$this->srsCode ) |
$this->srsCode = $wktName; |
break; |
case 'PROJCS': |
$$this->srsCode = $wktName; |
break; |
case 'GEOCCS': |
break; |
case 'PROJECTION': |
$this->projName = Proj4php::$wktProjections[$wktName]; |
break; |
case 'DATUM': |
$this->datumName = $wktName; |
break; |
case 'LOCAL_DATUM': |
$this->datumCode = 'none'; |
break; |
case 'SPHEROID': |
$this->ellps = $wktName; |
$this->a = floatval( array_shift( $wktArray ) ); |
$this->rf = floatval( array_shift( $wktArray ) ); |
break; |
case 'PRIMEM': |
$this->from_greenwich = floatval( array_shift( $wktArray ) ); //to radians? |
break; |
case 'UNIT': |
$this->units = $wktName; |
$this->unitsPerMeter = floatval( array_shift( $wktArray ) ); |
break; |
case 'PARAMETER': |
$name = strtolower( $wktName ); |
$value = floatval( array_shift( $wktArray ) ); |
//there may be many variations on the wktName values, add in case |
//statements as required |
switch( $name ) { |
case 'false_easting': |
$this->x0 = $value; |
break; |
case 'false_northing': |
$this->y0 = $value; |
break; |
case 'scale_factor': |
$this->k0 = $value; |
break; |
case 'central_meridian': |
$this->long0 = $value * Proj4php::$common->D2R; |
break; |
case 'latitude_of_origin': |
$this->lat0 = $value * Proj4php::$common->D2R; |
break; |
case 'more_here': |
break; |
default: |
break; |
} |
break; |
case 'TOWGS84': |
$this->datum_params = $wktArray; |
break; |
//DGR 2010-11-12: AXIS |
case 'AXIS': |
$name = strtolower( $wktName ); |
$value = array_shift( $wktArray ); |
switch( $value ) { |
case 'EAST' : $value = 'e'; |
break; |
case 'WEST' : $value = 'w'; |
break; |
case 'NORTH': $value = 'n'; |
break; |
case 'SOUTH': $value = 's'; |
break; |
case 'UP' : $value = 'u'; |
break; |
case 'DOWN' : $value = 'd'; |
break; |
case 'OTHER': |
default : $value = ' '; |
break; //FIXME |
} |
if( !$this->axis ) { |
$this->axis = "enu"; |
} |
switch( $name ) { |
case 'X': $this->axis = $value . substr( $this->axis, 1, 2 ); |
break; |
case 'Y': $this->axis = substr( $this->axis, 0, 1 ) . $value . substr( $this->axis, 2, 1 ); |
break; |
case 'Z': $this->axis = substr( $this->axis, 0, 2 ) . $value; |
break; |
default : break; |
} |
case 'MORE_HERE': |
break; |
default: |
break; |
} |
foreach( $wktArray as $wktArrayContent ) |
$this->parseWKT( $wktArrayContent ); |
} |
/** |
* Function: parseDefs |
* Parses the PROJ.4 initialization string and sets the associated properties. |
* |
*/ |
public function parseDefs() { |
$this->defData = Proj4php::$defs[$this->srsCode]; |
#$paramName; |
#$paramVal; |
if( !$this->defData ) { |
return; |
} |
$paramArray = explode( "+", $this->defData ); |
for( $prop = 0; $prop < sizeof( $paramArray ); $prop++ ) { |
if( strlen( $paramArray[$prop] ) == 0 ) |
continue; |
$property = explode( "=", $paramArray[$prop] ); |
$paramName = strtolower( $property[0] ); |
if( sizeof( $property ) >= 2 ) { |
$paramVal = $property[1]; |
} |
switch( trim( $paramName ) ) { // trim out spaces |
case "": break; // throw away nameless parameter |
case "title": $this->title = $paramVal; |
break; |
case "proj": $this->projName = trim( $paramVal ); |
break; |
case "units": $this->units = trim( $paramVal ); |
break; |
case "datum": $this->datumCode = trim( $paramVal ); |
break; |
case "nadgrids": $this->nagrids = trim( $paramVal ); |
break; |
case "ellps": $this->ellps = trim( $paramVal ); |
break; |
case "a": $this->a = floatval( $paramVal ); |
break; // semi-major radius |
case "b": $this->b = floatval( $paramVal ); |
break; // semi-minor radius |
// DGR 2007-11-20 |
case "rf": $this->rf = floatval( paramVal ); |
break; // inverse flattening rf= a/(a-b) |
case "lat_0": $this->lat0 = $paramVal * Proj4php::$common->D2R; |
break; // phi0, central latitude |
case "lat_1": $this->lat1 = $paramVal * Proj4php::$common->D2R; |
break; //standard parallel 1 |
case "lat_2": $this->lat2 = $paramVal * Proj4php::$common->D2R; |
break; //standard parallel 2 |
case "lat_ts": $this->lat_ts = $paramVal * Proj4php::$common->D2R; |
break; // used in merc and eqc |
case "lon_0": $this->long0 = $paramVal * Proj4php::$common->D2R; |
break; // lam0, central longitude |
case "alpha": $this->alpha = floatval( $paramVal ) * Proj4php::$common->D2R; |
break; //for somerc projection |
case "lonc": $this->longc = paramVal * Proj4php::$common->D2R; |
break; //for somerc projection |
case "x_0": $this->x0 = floatval( $paramVal ); |
break; // false easting |
case "y_0": $this->y0 = floatval( $paramVal ); |
break; // false northing |
case "k_0": $this->k0 = floatval( $paramVal ); |
break; // projection scale factor |
case "k": $this->k0 = floatval( $paramVal ); |
break; // both forms returned |
case "r_a": $this->R_A = true; |
break; // sphere--area of ellipsoid |
case "zone": $this->zone = intval( $paramVal, 10 ); |
break; // UTM Zone |
case "south": $this->utmSouth = true; |
break; // UTM north/south |
case "towgs84": $this->datum_params = explode( ",", $paramVal ); |
break; |
case "to_meter": $this->to_meter = floatval( $paramVal ); |
break; // cartesian scaling |
case "from_greenwich": $this->from_greenwich = $paramVal * Proj4php::$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 = trim( $paramVal ); |
$this->from_greenwich = Proj4php::$primeMeridian[$paramVal] ? Proj4php::$primeMeridian[$paramVal] : floatval( $paramVal ); |
$this->from_greenwich *= Proj4php::$common->D2R; |
break; |
// DGR 2010-11-12: axis |
case "axis": $paramVal = trim( $paramVal ); |
$legalAxis = "ewnsud"; |
if( strlen( paramVal ) == 3 && |
strpos( $legalAxis, substr( $paramVal, 0, 1 ) ) !== false && |
strpos( $legalAxis, substr( $paramVal, 1, 1 ) ) !== false && |
strpos( $legalAxis, substr( $paramVal, 2, 1 ) ) !== false ) { |
$this->axis = $paramVal; |
} //FIXME: be silent ? |
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. |
* |
*/ |
public function deriveConstants() { |
if( isset( $this->nagrids ) && $this->nagrids == '@null' ) |
$this->datumCode = 'none'; |
if( isset( $this->datumCode ) && $this->datumCode != 'none' ) { |
$datumDef = Proj4php::$datum[$this->datumCode]; |
if( is_array($datumDef ) ) { |
$this->datum_params = array_key_exists( 'towgs84', $datumDef ) ? explode( ',', $datumDef['towgs84'] ) : null; |
$this->ellps = $datumDef['ellipse']; |
$this->datumName = array_key_exists( 'datumName', $datumDef ) ? $datumDef['datumName'] : $this->datumCode; |
} |
} |
if( !isset( $this->a ) ) { // do we have an ellipsoid? |
if( !isset( $this->ellps ) || strlen( $this->ellps ) == 0 || !array_key_exists( $this->ellps, Proj4php::$ellipsoid ) ) |
$ellipse = Proj4php::$ellipsoid['WGS84']; |
else { |
$ellipse = Proj4php::$ellipsoid[$this->ellps]; |
} |
Proj4php::extend( $this, $ellipse ); |
} |
if( isset( $this->rf ) && !isset( $this->b ) ) |
$this->b = (1.0 - 1.0 / $this->rf) * $this->a; |
if ( (isset($this->rf) && $this->rf === 0) || abs($this->a - $this->b) < Proj4php::$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 = sqrt( $this->es ); // eccentricity |
if( isset( $this->R_A ) ) { |
$this->a *= 1. - $this->es * (Proj4php::$common->SIXTH + $this->es * (Proj4php::$common->RA4 + $this->es * Proj4php::$common->RA6)); |
$this->a2 = $this->a * $this->a; |
$this->b2 = $this->b * $this->b; |
$this->es = 0.0; |
} |
$this->ep2 = ($this->a2 - $this->b2) / $this->b2; // used in geocentric |
if( !isset( $this->k0 ) ) |
$this->k0 = 1.0; //default value |
//DGR 2010-11-12: axis |
if( !isset( $this->axis ) ) { |
$this->axis = "enu"; |
} |
$this->datum = new Proj4phpDatum( $this ); |
} |
} |
/branches/v5.3-amandaie/scripts/modules/ifn/bibliotheque/proj4php/proj4php.php |
---|
New file |
0,0 → 1,437 |
<?php |
/** |
* Author : Julien Moquet |
* |
* Simple conversion from javascript to PHP of Proj4php by Mike Adair madairATdmsolutions.ca and Richard Greenwood rich@greenwoodmap.com |
* |
* License: LGPL as per: http://www.gnu.org/copyleft/lesser.html |
*/ |
$dir = dirname( __FILE__ ); |
require_once($dir . "/proj4phpProj.php"); |
require_once($dir . "/proj4phpCommon.php"); |
require_once($dir . "/proj4phpDatum.php"); |
require_once($dir . "/proj4phpLongLat.php"); |
require_once($dir . "/proj4phpPoint.php"); |
class Proj4php { |
protected $defaultDatum = 'WGS84'; |
public static $ellipsoid = array( ); |
public static $common = null; |
public static $datum = array( ); |
public static $defs = array( ); |
public static $wktProjections = array( ); |
public static $WGS84 = null; |
public static $primeMeridian = array( ); |
public static $proj = array( ); |
/** |
* Property: defsLookupService |
* service to retreive projection definition parameters from |
*/ |
public static $defsLookupService = 'http://spatialreference.org/ref'; |
/** |
Proj4php.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 |
*/ |
protected function initDefs() { |
// These are so widely used, we'll go ahead and throw them in |
// without requiring a separate .js file |
self::$defs['WGS84'] = "+title=long/lat:WGS84 +proj=longlat +ellps=WGS84 +datum=WGS84 +units=degrees"; |
self::$defs['EPSG:4326'] = "+title=long/lat:WGS84 +proj=longlat +a=6378137.0 +b=6356752.31424518 +ellps=WGS84 +datum=WGS84 +units=degrees"; |
self::$defs['EPSG:4269'] = "+title=long/lat:NAD83 +proj=longlat +a=6378137.0 +b=6356752.31414036 +ellps=GRS80 +datum=NAD83 +units=degrees"; |
self::$defs['EPSG:3875'] = "+title= Google Mercator +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"; |
self::$defs['EPSG:3785'] = self::$defs['EPSG:3875']; |
self::$defs['GOOGLE'] = self::$defs['EPSG:3875']; |
self::$defs['EPSG:900913'] = self::$defs['EPSG:3875']; |
self::$defs['EPSG:102113'] = self::$defs['EPSG:3875']; |
} |
//lookup table to go from the projection name in WKT to the Proj4php projection name |
//build this out as required |
protected function initWKTProjections() { |
self::$wktProjections["Lambert Tangential Conformal Conic Projection"] = "lcc"; |
self::$wktProjections["Mercator"] = "merc"; |
self::$wktProjections["Mercator_1SP"] = "merc"; |
self::$wktProjections["Transverse_Mercator"] = "tmerc"; |
self::$wktProjections["Transverse Mercator"] = "tmerc"; |
self::$wktProjections["Lambert Azimuthal Equal Area"] = "laea"; |
self::$wktProjections["Universal Transverse Mercator System"] = "utm"; |
} |
protected function initDatum() { |
self::$datum["WGS84"] = array( 'towgs84' => "0,0,0", 'ellipse' => "WGS84", 'datumName' => "WGS84" ); |
self::$datum["GGRS87"] = array( 'towgs84' => "-199.87,74.79,246.62", 'ellipse' => "GRS80", 'datumName' => "Greek_Geodetic_Reference_System_1987" ); |
self::$datum["NAD83"] = array( 'towgs84' => "0,0,0", 'ellipse' => "GRS80", 'datumName' => "North_American_Datum_1983" ); |
self::$datum["NAD27"] = array( 'nadgrids' => "@conus,@alaska,@ntv2_0.gsb,@ntv1_can.dat", 'ellipse' => "clrk66", 'datumName' => "North_American_Datum_1927" ); |
self::$datum["potsdam"] = array( 'towgs84' => "606.0,23.0,413.0", 'ellipse' => "bessel", 'datumName' => "Potsdam Rauenberg 1950 DHDN" ); |
self::$datum["carthage"] = array( 'towgs84' => "-263.0,6.0,431.0", 'ellipse' => "clark80", 'datumName' => "Carthage 1934 Tunisia" ); |
self::$datum["hermannskogel"] = array( 'towgs84' => "653.0,-212.0,449.0", 'ellipse' => "bessel", 'datumName' => "Hermannskogel" ); |
self::$datum["ire65"] = array( 'towgs84' => "482.530,-130.596,564.557,-1.042,-0.214,-0.631,8.15", 'ellipse' => "mod_airy", 'datumName' => "Ireland 1965" ); |
self::$datum["nzgd49"] = array( 'towgs84' => "59.47,-5.04,187.44,0.47,-0.1,1.024,-4.5993", 'ellipse' => "intl", 'datumName' => "New Zealand Geodetic Datum 1949" ); |
self::$datum["OSGB36"] = array( 'towgs84' => "446.448,-125.157,542.060,0.1502,0.2470,0.8421,-20.4894", 'ellipse' => "airy", 'datumName' => "Airy 1830" ); |
} |
protected function initEllipsoid() { |
self::$ellipsoid["MERIT"] = array( 'a' => 6378137.0, 'rf' => 298.257, 'ellipseName' => "MERIT 1983" ); |
self::$ellipsoid["SGS85"] = array( 'a' => 6378136.0, 'rf' => 298.257, 'ellipseName' => "Soviet Geodetic System 85" ); |
self::$ellipsoid["GRS80"] = array( 'a' => 6378137.0, 'rf' => 298.257222101, 'ellipseName' => "GRS 1980(IUGG, 1980)" ); |
self::$ellipsoid["IAU76"] = array( 'a' => 6378140.0, 'rf' => 298.257, 'ellipseName' => "IAU 1976" ); |
self::$ellipsoid["airy"] = array( 'a' => 6377563.396, 'b' => 6356256.910, 'ellipseName' => "Airy 1830" ); |
self::$ellipsoid["APL4."] = array( 'a' => 6378137, 'rf' => 298.25, 'ellipseName' => "Appl. Physics. 1965" ); |
self::$ellipsoid["NWL9D"] = array( 'a' => 6378145.0, 'rf' => 298.25, 'ellipseName' => "Naval Weapons Lab., 1965" ); |
self::$ellipsoid["mod_airy"] = array( 'a' => 6377340.189, 'b' => 6356034.446, 'ellipseName' => "Modified Airy" ); |
self::$ellipsoid["andrae"] = array( 'a' => 6377104.43, 'rf' => 300.0, 'ellipseName' => "Andrae 1876 (Den., Iclnd.)" ); |
self::$ellipsoid["aust_SA"] = array( 'a' => 6378160.0, 'rf' => 298.25, 'ellipseName' => "Australian Natl & S. Amer. 1969" ); |
self::$ellipsoid["GRS67"] = array( 'a' => 6378160.0, 'rf' => 298.2471674270, 'ellipseName' => "GRS 67(IUGG 1967)" ); |
self::$ellipsoid["bessel"] = array( 'a' => 6377397.155, 'rf' => 299.1528128, 'ellipseName' => "Bessel 1841" ); |
self::$ellipsoid["bess_nam"] = array( 'a' => 6377483.865, 'rf' => 299.1528128, 'ellipseName' => "Bessel 1841 (Namibia)" ); |
self::$ellipsoid["clrk66"] = array( 'a' => 6378206.4, 'b' => 6356583.8, 'ellipseName' => "Clarke 1866" ); |
self::$ellipsoid["clrk80"] = array( 'a' => 6378249.145, 'rf' => 293.4663, 'ellipseName' => "Clarke 1880 mod." ); |
self::$ellipsoid["CPM"] = array( 'a' => 6375738.7, 'rf' => 334.29, 'ellipseName' => "Comm. des Poids et Mesures 1799" ); |
self::$ellipsoid["delmbr"] = array( 'a' => 6376428.0, 'rf' => 311.5, 'ellipseName' => "Delambre 1810 (Belgium)" ); |
self::$ellipsoid["engelis"] = array( 'a' => 6378136.05, 'rf' => 298.2566, 'ellipseName' => "Engelis 1985" ); |
self::$ellipsoid["evrst30"] = array( 'a' => 6377276.345, 'rf' => 300.8017, 'ellipseName' => "Everest 1830" ); |
self::$ellipsoid["evrst48"] = array( 'a' => 6377304.063, 'rf' => 300.8017, 'ellipseName' => "Everest 1948" ); |
self::$ellipsoid["evrst56"] = array( 'a' => 6377301.243, 'rf' => 300.8017, 'ellipseName' => "Everest 1956" ); |
self::$ellipsoid["evrst69"] = array( 'a' => 6377295.664, 'rf' => 300.8017, 'ellipseName' => "Everest 1969" ); |
self::$ellipsoid["evrstSS"] = array( 'a' => 6377298.556, 'rf' => 300.8017, 'ellipseName' => "Everest (Sabah & Sarawak)" ); |
self::$ellipsoid["fschr60"] = array( 'a' => 6378166.0, 'rf' => 298.3, 'ellipseName' => "Fischer (Mercury Datum) 1960" ); |
self::$ellipsoid["fschr60m"] = array( 'a' => 6378155.0, 'rf' => 298.3, 'ellipseName' => "Fischer 1960" ); |
self::$ellipsoid["fschr68"] = array( 'a' => 6378150.0, 'rf' => 298.3, 'ellipseName' => "Fischer 1968" ); |
self::$ellipsoid["helmert"] = array( 'a' => 6378200.0, 'rf' => 298.3, 'ellipseName' => "Helmert 1906" ); |
self::$ellipsoid["hough"] = array( 'a' => 6378270.0, 'rf' => 297.0, 'ellipseName' => "Hough" ); |
self::$ellipsoid["intl"] = array( 'a' => 6378388.0, 'rf' => 297.0, 'ellipseName' => "International 1909 (Hayford)" ); |
self::$ellipsoid["kaula"] = array( 'a' => 6378163.0, 'rf' => 298.24, 'ellipseName' => "Kaula 1961" ); |
self::$ellipsoid["lerch"] = array( 'a' => 6378139.0, 'rf' => 298.257, 'ellipseName' => "Lerch 1979" ); |
self::$ellipsoid["mprts"] = array( 'a' => 6397300.0, 'rf' => 191.0, 'ellipseName' => "Maupertius 1738" ); |
self::$ellipsoid["new_intl"] = array( 'a' => 6378157.5, 'b' => 6356772.2, 'ellipseName' => "New International 1967" ); |
self::$ellipsoid["plessis"] = array( 'a' => 6376523.0, 'rf' => 6355863.0, 'ellipseName' => "Plessis 1817 (France)" ); |
self::$ellipsoid["krass"] = array( 'a' => 6378245.0, 'rf' => 298.3, 'ellipseName' => "Krassovsky, 1942" ); |
self::$ellipsoid["SEasia"] = array( 'a' => 6378155.0, 'b' => 6356773.3205, 'ellipseName' => "Southeast Asia" ); |
self::$ellipsoid["walbeck"] = array( 'a' => 6376896.0, 'b' => 6355834.8467, 'ellipseName' => "Walbeck" ); |
self::$ellipsoid["WGS60"] = array( 'a' => 6378165.0, 'rf' => 298.3, 'ellipseName' => "WGS 60" ); |
self::$ellipsoid["WGS66"] = array( 'a' => 6378145.0, 'rf' => 298.25, 'ellipseName' => "WGS 66" ); |
self::$ellipsoid["WGS72"] = array( 'a' => 6378135.0, 'rf' => 298.26, 'ellipseName' => "WGS 72" ); |
self::$ellipsoid["WGS84"] = array( 'a' => 6378137.0, 'rf' => 298.257223563, 'ellipseName' => "WGS 84" ); |
self::$ellipsoid["sphere"] = array( 'a' => 6370997.0, 'b' => 6370997.0, 'ellipseName' => "Normal Sphere (r=6370997)" ); |
} |
protected function initPrimeMeridian() { |
self::$primeMeridian["greenwich"] = '0.0'; //"0dE", |
self::$primeMeridian["lisbon"] = -9.131906111111; //"9d07'54.862\"W", |
self::$primeMeridian["paris"] = 2.337229166667; //"2d20'14.025\"E", |
self::$primeMeridian["bogota"] = -74.080916666667; //"74d04'51.3\"W", |
self::$primeMeridian["madrid"] = -3.687938888889; //"3d41'16.58\"W", |
self::$primeMeridian["rome"] = 12.452333333333; //"12d27'8.4\"E", |
self::$primeMeridian["bern"] = 7.439583333333; //"7d26'22.5\"E", |
self::$primeMeridian["jakarta"] = 106.807719444444; //"106d48'27.79\"E", |
self::$primeMeridian["ferro"] = -17.666666666667; //"17d40'W", |
self::$primeMeridian["brussels"] = 4.367975; //"4d22'4.71\"E", |
self::$primeMeridian["stockholm"] = 18.058277777778; //"18d3'29.8\"E", |
self::$primeMeridian["athens"] = 23.7163375; //"23d42'58.815\"E", |
self::$primeMeridian["oslo"] = 10.722916666667; //"10d43'22.5\"E" |
} |
/** |
* |
*/ |
public function __construct() { |
$this->initWKTProjections(); |
$this->initDefs(); |
$this->initDatum(); |
$this->initEllipsoid(); |
$this->initPrimeMeridian(); |
self::$proj['longlat'] = new proj4phpLongLat(); |
self::$proj['identity'] = new proj4phpLongLat(); |
self::$common = new proj4phpCommon(); |
self::$WGS84 = new Proj4phpProj( 'WGS84' ); |
} |
/** |
* 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 - {Proj4phpProj} source map projection for the transformation |
* dest - {Proj4phpProj} 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. |
*/ |
public function transform( $source, $dest, $point ) { |
if( !$source->readyToUse ) { |
self::reportError( "Proj4php initialization for:" . $source->srsCode . " not yet complete" ); |
return $point; |
} |
if( !$dest->readyToUse ) { |
self::reportError( "Proj4php initialization for:" . $dest->srsCode . " not yet complete" ); |
return $point; |
} |
// Workaround for datum shifts towgs84, if either source or destination projection is not wgs84 |
if ( isset($source->datum) && isset($dest->datum) && ( |
(($source->datum->datum_type == Proj4php::$common->PJD_3PARAM || $source->datum->datum_type == Proj4php::$common->PJD_7PARAM) && (isset($dest->datumCode) && $dest->datumCode != "WGS84")) || |
(($dest->datum->datum_type == Proj4php::$common->PJD_3PARAM || $dest->datum->datum_type == Proj4php::$common->PJD_7PARAM) && (isset($source->datumCode) && $source->datumCode != "WGS84")))) { |
$wgs84 = Proj4php::$WGS84; |
$this->transform($source, $wgs84, $point); |
$source = $wgs84; |
} |
// Workaround for Spherical Mercator => skipped in proj4js 1.1.0 |
/* |
if( ($source->srsProjNumber == "900913" && $dest->datumCode != "WGS84") || |
($dest->srsProjNumber == "900913" && $source->datumCode != "WGS84") ) { |
$wgs84 = Proj4php::$WGS84; // DONT KNOW WHAT YET |
$this->transform( $source, $wgs84, $point ); |
$source = $wgs84; |
} |
*/ |
// DGR, 2010/11/12 |
if( $source->axis != "enu" ) { |
$this->adjust_axis( $source, false, $point ); |
} |
// Transform source points to long/lat, if they aren't already. |
if( $source->projName == "longlat" ) { |
$point->x *= Proj4php::$common->D2R; // convert degrees to radians |
$point->y *= Proj4php::$common->D2R; |
} else { |
if( isset($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( isset( $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( isset( $dest->from_greenwich ) ) { |
$point->x -= $dest->from_greenwich; |
} |
if( $dest->projName == "longlat" ) { |
// convert radians to decimal degrees |
$point->x *= Proj4php::$common->R2D; |
$point->y *= Proj4php::$common->R2D; |
} else { // else project |
$dest->forward( $point ); |
if( isset($dest->to_meter) ) { |
$point->x /= $dest->to_meter; |
$point->y /= $dest->to_meter; |
} |
} |
// DGR, 2010/11/12 |
if( $dest->axis != "enu" ) { |
$this->adjust_axis( $dest, true, $point ); |
} |
return $point; |
} |
/** datum_transform() |
source coordinate system definition, |
destination coordinate system definition, |
point to transform in geodetic coordinates (long, lat, height) |
*/ |
public function datum_transform( $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 == Proj4php::$common->PJD_NODATUM |
|| $dest->datum_type == Proj4php::$common->PJD_NODATUM ) { |
return $point; |
} |
/* |
// If this datum requires grid shifts, then apply it to geodetic coordinates. |
if( $source->datum_type == Proj4php::$common->PJD_GRIDSHIFT ) { |
throw(new Exception( "ERROR: Grid shift transformations are not implemented yet." )); |
} |
if( $dest->datum_type == Proj4php::$common->PJD_GRIDSHIFT ) { |
throw(new Exception( "ERROR: Grid shift transformations are not implemented yet." )); |
} |
*/ |
// Do we need to go through geocentric coordinates? |
if( $source->es != $dest->es || $source->a != $dest->a |
|| $source->datum_type == Proj4php::$common->PJD_3PARAM |
|| $source->datum_type == Proj4php::$common->PJD_7PARAM |
|| $dest->datum_type == Proj4php::$common->PJD_3PARAM |
|| $dest->datum_type == Proj4php::$common->PJD_7PARAM ) { |
// Convert to geocentric coordinates. |
$source->geodetic_to_geocentric( $point ); |
// CHECK_RETURN; |
// Convert between datums |
if( $source->datum_type == Proj4php::$common->PJD_3PARAM || $source->datum_type == Proj4php::$common->PJD_7PARAM ) { |
$source->geocentric_to_wgs84( $point ); |
// CHECK_RETURN; |
} |
if( $dest->datum_type == Proj4php::$common->PJD_3PARAM || $dest->datum_type == Proj4php::$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 == Proj4php::$common->PJD_GRIDSHIFT ) { |
throw(new Exception( "ERROR: Grid shift transformations are not implemented yet." )); |
// pj_apply_gridshift( pj_param(dest.params,"snadgrids").s, 1, point); |
// CHECK_RETURN; |
} |
*/ |
return $point; |
} |
/** |
* Function: adjust_axis |
* Normalize or de-normalized the x/y/z axes. The normal form is "enu" |
* (easting, northing, up). |
* Parameters: |
* crs {Proj4php.Proj} the coordinate reference system |
* denorm {Boolean} when false, normalize |
* point {Object} the coordinates to adjust |
*/ |
public function adjust_axis( $crs, $denorm, $point ) { |
$xin = $point->x; |
$yin = $point->y; |
$zin = isset( $point->z ) ? $point->z : 0.0; |
#$v; |
#$t; |
for( $i = 0; $i < 3; $i++ ) { |
if( $denorm && $i == 2 && !isset( $point->z ) ) { |
continue; |
} |
if( $i == 0 ) { |
$v = $xin; |
$t = 'x'; |
} else if( $i == 1 ) { |
$v = $yin; |
$t = 'y'; |
} else { |
$v = $zin; |
$t = 'z'; |
} |
switch( $crs->axis[$i] ) { |
case 'e': |
$point[$t] = $v; |
break; |
case 'w': |
$point[$t] = -$v; |
break; |
case 'n': |
$point[$t] = $v; |
break; |
case 's': |
$point[$t] = -$v; |
break; |
case 'u': |
if( isset( $point[$t] ) ) { |
$point->z = $v; |
} |
break; |
case 'd': |
if( isset( $point[$t] ) ) { |
$point->z = -$v; |
} |
break; |
default : |
throw(new Exception( "ERROR: unknow axis (" . $crs->axis[$i] . ") - check definition of " . $crs->projName )); |
return null; |
} |
} |
return $point; |
} |
/** |
* Function: reportError |
* An internal method to report errors back to user. |
* Override this in applications to report error messages or throw exceptions. |
*/ |
public static function reportError( $msg ) { |
//console.log(msg); |
echo $msg . "<br />\n"; |
} |
/** |
* Function : loadScript |
* adapted from original. PHP is simplier. |
*/ |
public static function loadScript( $filename, $onload = null, $onfail = null, $loadCheck = null ) { |
if( stripos($filename, 'http://') !== false ) { |
return @file_get_contents($filename); |
} |
elseif( file_exists( $filename ) ) { |
require_once($filename); |
return true; |
} |
else { |
throw(new Exception( "File $filename could not be found or was not able to be loaded." )); |
return false; |
} |
} |
/** |
* 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. |
*/ |
public static function extend( $destination, $source ) { |
if( $source != null ) |
foreach( $source as $key => $value ) { |
$destination->$key = $value; |
} |
return $destination; |
} |
} |
/branches/v5.3-amandaie/scripts/modules/ifn/bibliotheque/proj4php/proj4phpLongLat.php |
---|
New file |
0,0 → 1,23 |
<?php |
/** |
* Author : Julien Moquet |
* |
* Inspired by Proj4js from Mike Adair madairATdmsolutions.ca |
* and Richard Greenwood rich@greenwoodmap.com |
* License: LGPL as per: http://www.gnu.org/copyleft/lesser.html |
*/ |
class proj4phpLongLat { |
public function init() { |
} |
public function forward( $pt ) { |
return $pt; |
} |
public function inverse( $pt ) { |
return $pt; |
} |
} |
/branches/v5.3-amandaie/scripts/modules/ifn/bibliotheque/proj4php/defs/EPSG21781.php |
---|
New file |
0,0 → 1,2 |
<?php |
Proj4php::$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"; |
/branches/v5.3-amandaie/scripts/modules/ifn/bibliotheque/proj4php/defs/EPSG26912.php |
---|
New file |
0,0 → 1,2 |
<?php |
Proj4php::$defs["EPSG26912"] = "+title=NAD83 / UTM zone 12N +proj=utm +zone=12 +a=6378137.0 +b=6356752.3141403"; |
/branches/v5.3-amandaie/scripts/modules/ifn/bibliotheque/proj4php/defs/EPSG25832.php |
---|
New file |
0,0 → 1,2 |
<?php |
Proj4php::$defs["EPSG:25832"] = "+proj=utm +zone=32 +ellps=GRS80 +units=m +no_defs"; |
/branches/v5.3-amandaie/scripts/modules/ifn/bibliotheque/proj4php/defs/EPSG31467.php |
---|
New file |
0,0 → 1,2 |
<?php |
Proj4php::$defs["EPSG:31467"] = "+proj=tmerc +lat_0=0 +lon_0=9 +k=1.000000 +x_0=3500000 +y_0=0 +ellps=bessel +datum=potsdam +units=m +no_defs"; |
/branches/v5.3-amandaie/scripts/modules/ifn/bibliotheque/proj4php/defs/EPSG27571.php |
---|
New file |
0,0 → 1,2 |
<?php |
Proj4php::$defs["EPSG:27571"] = "+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"; |
/branches/v5.3-amandaie/scripts/modules/ifn/bibliotheque/proj4php/defs/EPSG31468.php |
---|
New file |
0,0 → 1,2 |
<?php |
Proj4php::$defs["EPSG:31468"] = "+proj=tmerc +lat_0=0 +lon_0=12 +k=1.000000 +x_0=4500000 +y_0=0 +ellps=bessel +datum=potsdam +units=m +no_defs"; |
/branches/v5.3-amandaie/scripts/modules/ifn/bibliotheque/proj4php/defs/EPSG26591.php |
---|
New file |
0,0 → 1,2 |
<?php |
Proj4php::$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"; |
/branches/v5.3-amandaie/scripts/modules/ifn/bibliotheque/proj4php/defs/EPSG27563.php |
---|
New file |
0,0 → 1,2 |
<?php |
Proj4php::$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 "; |
/branches/v5.3-amandaie/scripts/modules/ifn/bibliotheque/proj4php/defs/EPSG4302.php |
---|
New file |
0,0 → 1,3 |
<?php |
Proj4php::$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"; |
/branches/v5.3-amandaie/scripts/modules/ifn/bibliotheque/proj4php/defs/EPSG2154.php |
---|
New file |
0,0 → 1,2 |
<?php |
Proj4php::$defs["EPSG:2154"] = "+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"; |
/branches/v5.3-amandaie/scripts/modules/ifn/bibliotheque/proj4php/defs/GOOGLE.php |
---|
New file |
0,0 → 1,3 |
<?php |
Proj4php::$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"; |
Proj4php::$defs["EPSG:900913"]=Proj4php::$defs["GOOGLE"]; |
/branches/v5.3-amandaie/scripts/modules/ifn/bibliotheque/proj4php/defs/EPSG900913.txt |
---|
New file |
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 \ |
"; |
Property changes: |
Added: svn:eol-style |
+native |
\ No newline at end of property |
/branches/v5.3-amandaie/scripts/modules/ifn/bibliotheque/proj4php/defs/EPSG4181.php |
---|
New file |
0,0 → 1,2 |
<?php |
Proj4php::$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"; |
/branches/v5.3-amandaie/scripts/modules/ifn/bibliotheque/proj4php/defs/EPSG4272.php |
---|
New file |
0,0 → 1,2 |
<?php |
Proj4php::$defs["EPSG:4272"] = "+title=NZGD49 +proj=longlat +ellps=intl +datum=nzgd49 +no_defs "; |
/branches/v5.3-amandaie/scripts/modules/ifn/bibliotheque/proj4php/defs/EPSG4139.php |
---|
New file |
0,0 → 1,2 |
<?php |
Proj4php::$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"; |
/branches/v5.3-amandaie/scripts/modules/ifn/bibliotheque/proj4php/defs/EPSG900913.php |
---|
New file |
0,0 → 1,6 |
<?php |
// 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 |
Proj4php::$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"; |
/branches/v5.3-amandaie/scripts/modules/ifn/bibliotheque/proj4php/defs/EPSG102757.php |
---|
New file |
0,0 → 1,2 |
<?php |
Proj4php::$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"; |
/branches/v5.3-amandaie/scripts/modules/ifn/bibliotheque/proj4php/defs/EPSG41001.php |
---|
New file |
0,0 → 1,2 |
<?php |
Proj4php::$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"; |
/branches/v5.3-amandaie/scripts/modules/ifn/bibliotheque/proj4php/defs/EPSG102758.php |
---|
New file |
0,0 → 1,2 |
<?php |
Proj4php::$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"; |
/branches/v5.3-amandaie/scripts/modules/ifn/bibliotheque/proj4php/defs/EPSG27200.php |
---|
New file |
0,0 → 1,2 |
<?php |
Proj4php::$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"; |
/branches/v5.3-amandaie/scripts/modules/ifn/bibliotheque/proj4php/defs/EPSG42304.php |
---|
New file |
0,0 → 1,2 |
<?php |
Proj4php::$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"; |
/branches/v5.3-amandaie/scripts/modules/ifn/bibliotheque/proj4php/defs/EPSG31370.php |
---|
New file |
0,0 → 1,2 |
<?php |
Proj4php::$defs["EPSG:31370"] = "+proj=lcc +lat_1=51.16666723333333 +lat_2=49.8333339 +lat_0=90 +lon_0=4.367486666666666 +x_0=150000.013 +y_0=5400088.438 +ellps=intl +towgs84=106.869,-52.2978,103.724,-0.33657,0.456955,-1.84218,1 +units=m +no_defs"; |
/branches/v5.3-amandaie/scripts/modules/ifn/bibliotheque/proj4php/WSProj4PHP_1.0.php |
---|
New file |
0,0 → 1,104 |
<?php |
include_once("proj4php.php"); |
$error = false; |
/** |
* Geometry-Points |
*/ |
if( isset( $_GET['GEOM'] ) ) { |
list($x, $y) = explode( ' ', $_GET['GEOM'] ); |
} else { |
if( isset( $_GET['x'] ) ) { |
$x = $_GET['x']; |
} |
else |
$error = true; |
if( isset( $_GET['y'] ) ) { |
$y = $_GET['y']; |
} |
else |
$error = true; |
} |
/** |
* Source-CRS |
*/ |
if( isset( $_GET['SOURCECRS'] ) ) { |
$srcProjection = str_replace( '::', ':', $_GET['SOURCECRS'] ); |
} else if( isset( $_GET['projectionxy'] ) ) { |
$srcProjection = $_GET['projectionxy']; |
$srcProjection = str_replace( '::', ':', $srcProjection ); |
} |
else |
$srcProjection = 'EPSG:2154'; |
/** |
* Target-CRS |
*/ |
if( isset( $_GET['TARGETCRS'] ) ) { |
$tgtProjection = str_replace( '::', ':', $_GET['TARGETCRS'] ); |
} else if( isset( $_GET['projection'] ) ) { |
$tgtProjection = $_GET['projection']; |
$tgtProjection = str_replace( '::', ':', $tgtProjection ); |
} |
else |
$tgtProjection = 'EPSG:4326'; |
/** |
* Format |
*/ |
if( isset( $_GET['format'] ) ) { |
$format = $_GET['format']; |
if( !($format == 'xml' || $format == 'json') ) |
$error = true; |
} |
else |
$format = 'xml'; |
$proj4 = new Proj4php(); |
$projsource = new Proj4phpProj( $srcProjection, $proj4 ); |
$projdest = new Proj4phpProj( $tgtProjection, $proj4 ); |
// check the projections |
if( Proj4php::$defs[$srcProjection] == Proj4php::$defs['WGS84'] && $srcProjection != 'EPSG:4326' ) |
$error = true; |
if( Proj4php::$defs[$tgtProjection] == Proj4php::$defs['WGS84'] && $tgtProjection != 'EPSG:4326' ) |
$error = true; |
if( $error === true ) { |
if( $format == 'json' ) { |
echo "{\"status\":\"error\", \"erreur\": {\"code\": 2, \"message\": \"Wrong parameters.\"} }"; |
exit; |
} else { |
echo "<reponse>"; |
echo " <erreur>"; |
echo " <code>2</code>"; |
echo " <message>Wrong parameters</message>"; |
echo " </erreur>"; |
echo "</reponse>"; |
exit; |
} |
} |
$pointSrc = new proj4phpPoint( $x, $y ); |
$pointDest = $proj4->transform( $projsource, $projdest, $pointSrc ); |
$tgtProjection = str_replace( ':', '::', $tgtProjection ); |
if( $format == 'json' ) { |
echo "{\"status\" :\"success\", \"point\" : {\"x\":" . $pointDest->x . ", \"y\":" . $pointDest->y . ",\"projection\" :\"" . $tgtProjection . "\"}}"; |
exit; |
} else { |
header ("Content-Type:text/xml"); |
echo "<reponse>"; |
echo "<point>"; |
echo "<x>" . $pointDest->x . "</x>"; |
echo "<y>" . $pointDest->y . "</y>"; |
echo "<projection>" . $tgtProjection . "</projection>"; |
echo "</point>"; |
echo "</reponse>"; |
} |
/branches/v5.3-amandaie/scripts/modules/ifn/bibliotheque/proj4php/proj4phpCommon.php |
---|
New file |
0,0 → 1,389 |
<?php |
/** |
* Author : Julien Moquet |
* |
* Inspired by Proj4js from Mike Adair madairATdmsolutions.ca |
* and Richard Greenwood rich@greenwoodmap.com |
* License: LGPL as per: http://www.gnu.org/copyleft/lesser.html |
*/ |
class Proj4phpCommon { |
public $PI = M_PI; #3.141592653589793238; //Math.PI, |
public $HALF_PI = M_PI_2; #1.570796326794896619; //Math.PI*0.5, |
public $TWO_PI = 6.283185307179586477; //Math.PI*2, |
public $FORTPI = 0.78539816339744833; |
public $R2D = 57.29577951308232088; |
public $D2R = 0.01745329251994329577; |
public $SEC_TO_RAD = 4.84813681109535993589914102357e-6; /* SEC_TO_RAD = Pi/180/3600 */ |
public $EPSLN = 1.0e-10; |
public $MAX_ITER = 20; |
// following constants from geocent.c |
public $COS_67P5 = 0.38268343236508977; /* cosine of 67.5 degrees */ |
public $AD_C = 1.0026000; /* Toms region 1 constant */ |
/* datum_type values */ |
public $PJD_UNKNOWN = 0; |
public $PJD_3PARAM = 1; |
public $PJD_7PARAM = 2; |
public $PJD_GRIDSHIFT = 3; |
public $PJD_WGS84 = 4; // WGS84 or equivalent |
public $PJD_NODATUM = 5; // WGS84 or equivalent |
const SRS_WGS84_SEMIMAJOR = 6378137.0; // only used in grid shift transforms |
// ellipoid pj_set_ell.c |
public $SIXTH = .1666666666666666667; /* 1/6 */ |
public $RA4 = .04722222222222222222; /* 17/360 */ |
public $RA6 = .02215608465608465608; /* 67/3024 */ |
public $RV4 = .06944444444444444444; /* 5/72 */ |
public $RV6 = .04243827160493827160; /* 55/1296 */ |
/* meridinal distance for ellipsoid and inverse |
* * 8th degree - accurate to < 1e-5 meters when used in conjuction |
* * with typical major axis values. |
* * Inverse determines phi to EPS (1e-11) radians, about 1e-6 seconds. |
*/ |
protected $C00 = 1.0; |
protected $C02 = .25; |
protected $C04 = .046875; |
protected $C06 = .01953125; |
protected $C08 = .01068115234375; |
protected $C22 = .75; |
protected $C44 = .46875; |
protected $C46 = .01302083333333333333; |
protected $C48 = .00712076822916666666; |
protected $C66 = .36458333333333333333; |
protected $C68 = .00569661458333333333; |
protected $C88 = .3076171875; |
/** |
* Function to compute the constant small m which is the radius of |
* a parallel of latitude, phi, divided by the semimajor axis. |
* |
* @param type $eccent |
* @param type $sinphi |
* @param type $cosphi |
* @return type |
*/ |
public function msfnz( $eccent, $sinphi, $cosphi ) { |
$con = $eccent * $sinphi; |
return $cosphi / (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. |
* |
* @param type $eccent |
* @param type $phi |
* @param type $sinphi |
* @return type |
*/ |
public function tsfnz( $eccent, $phi, $sinphi ) { |
$con = $eccent * $sinphi; |
$com = 0.5 * $eccent; |
$con = pow( ((1.0 - $con) / (1.0 + $con) ), $com ); |
return (tan( .5 * (M_PI_2 - $phi) ) / $con); |
} |
/** |
* Function to compute the latitude angle, phi2, for the inverse of the |
* Lambert Conformal Conic and Polar Stereographic projections. |
* |
* rise up an assertion if there is no convergence. |
* |
* @param type $eccent |
* @param type $ts |
* @return type |
*/ |
public function phi2z( $eccent, $ts ) { |
$eccnth = .5 * $eccent; |
$phi = M_PI_2 - 2 * atan( $ts ); |
for( $i = 0; $i <= 15; $i++ ) { |
$con = $eccent * sin( $phi ); |
$dphi = M_PI_2 - 2 * atan( $ts * (pow( ((1.0 - $con) / (1.0 + $con) ), $eccnth )) ) - $phi; |
$phi += $dphi; |
if( abs( $dphi ) <= .0000000001 ) |
return $phi; |
} |
assert( "false; /* 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. |
* |
* @param type $eccent |
* @param type $sinphi |
* @return type |
*/ |
public function qsfnz( $eccent, $sinphi ) { |
if( $eccent > 1.0e-7 ) { |
$con = $eccent * $sinphi; |
return (( 1.0 - $eccent * $eccent) * ($sinphi / (1.0 - $con * $con) - (.5 / $eccent) * log( (1.0 - $con) / (1.0 + $con) ))); |
} |
return (2.0 * $sinphi); |
} |
/** |
* Function to eliminate roundoff errors in asin |
* |
* @param type $x |
* @return type |
*/ |
public function asinz( $x ) { |
return asin( |
abs( $x ) > 1.0 ? ($x > 1.0 ? 1.0 : -1.0) : $x |
); |
#if( abs( $x ) > 1.0 ) { |
# $x = ($x > 1.0) ? 1.0 : -1.0; |
#} |
#return asin( $x ); |
} |
/** |
* following functions from gctpc cproj.c for transverse mercator projections |
* |
* @param type $x |
* @return type |
*/ |
public function e0fn( $x ) { |
return (1.0 - 0.25 * $x * (1.0 + $x / 16.0 * (3.0 + 1.25 * $x))); |
} |
/** |
* |
* @param type $x |
* @return type |
*/ |
public function e1fn( $x ) { |
return (0.375 * $x * (1.0 + 0.25 * $x * (1.0 + 0.46875 * $x))); |
} |
/** |
* |
* @param type $x |
* @return type |
*/ |
public function e2fn( $x ) { |
return (0.05859375 * $x * $x * (1.0 + 0.75 * $x)); |
} |
/** |
* |
* @param type $x |
* @return type |
*/ |
public function e3fn( $x ) { |
return ($x * $x * $x * (35.0 / 3072.0)); |
} |
/** |
* |
* @param type $e0 |
* @param type $e1 |
* @param type $e2 |
* @param type $e3 |
* @param type $phi |
* @return type |
*/ |
public function mlfn( $e0, $e1, $e2, $e3, $phi ) { |
return ($e0 * $phi - $e1 * sin( 2.0 * $phi ) + $e2 * sin( 4.0 * $phi ) - $e3 * sin( 6.0 * $phi )); |
} |
/** |
* |
* @param type $esinp |
* @param type $exp |
* @return type |
*/ |
public function srat( $esinp, $exp ) { |
return (pow( (1.0 - $esinp) / (1.0 + $esinp), $exp )); |
} |
/** |
* Function to return the sign of an argument |
* |
* @param type $x |
* @return type |
*/ |
public function sign( $x ) { |
return $x < 0.0 ? -1 : 1; |
} |
/** |
* Function to adjust longitude to -180 to 180; input in radians |
* |
* @param type $x |
* @return type |
*/ |
public function adjust_lon( $x ) { |
return (abs( $x ) < M_PI) ? $x : ($x - ($this->sign( $x ) * $this->TWO_PI) ); |
} |
/** |
* IGNF - DGR : algorithms used by IGN France |
* Function to adjust latitude to -90 to 90; input in radians |
* |
* @param type $x |
* @return type |
*/ |
public function adjust_lat( $x ) { |
$x = (abs( $x ) < M_PI_2) ? $x : ($x - ($this->sign( $x ) * M_PI) ); |
return $x; |
} |
/** |
* Latitude Isometrique - close to tsfnz ... |
* |
* @param type $eccent |
* @param float $phi |
* @param type $sinphi |
* @return string |
*/ |
public function latiso( $eccent, $phi, $sinphi ) { |
if( abs( $phi ) > M_PI_2 ) |
return +NaN; |
if( $phi == M_PI_2 ) |
return INF; |
if( $phi == -1.0 * M_PI_2 ) |
return -1.0 * INF; |
$con = $eccent * $sinphi; |
return log( tan( (M_PI_2 + $phi) / 2.0 ) ) + $eccent * log( (1.0 - $con) / (1.0 + $con) ) / 2.0; |
} |
/** |
* |
* @param type $x |
* @param type $L |
* @return type |
*/ |
public function fL( $x, $L ) { |
return 2.0 * atan( $x * exp( $L ) ) - M_PI_2; |
} |
/** |
* Inverse Latitude Isometrique - close to ph2z |
* |
* @param type $eccent |
* @param type $ts |
* @return type |
*/ |
public function invlatiso( $eccent, $ts ) { |
$phi = $this->fL( 1.0, $ts ); |
$Iphi = 0.0; |
$con = 0.0; |
do { |
$Iphi = $phi; |
$con = $eccent * sin( $Iphi ); |
$phi = $this->fL( exp( $eccent * log( (1.0 + $con) / (1.0 - $con) ) / 2.0 ), $ts ); |
} while( abs( $phi - $Iphi ) > 1.0e-12 ); |
return $phi; |
} |
/** |
* Grande Normale |
* |
* @param type $a |
* @param type $e |
* @param type $sinphi |
* @return type |
*/ |
public function gN( $a, $e, $sinphi ) { |
$temp = $e * $sinphi; |
return $a / sqrt( 1.0 - $temp * $temp ); |
} |
/** |
* code from the PROJ.4 pj_mlfn.c file; this may be useful for other projections |
* |
* @param type $es |
* @return type |
*/ |
public function pj_enfn( $es ) { |
$en = array( ); |
$en[0] = $this->C00 - $es * ($this->C02 + $es * ($this->C04 + $es * ($this->C06 + $es * $this->C08))); |
$en[1] = es * ($this->C22 - $es * ($this->C04 + $es * ($this->C06 + $es * $this->C08))); |
$t = $es * $es; |
$en[2] = $t * ($this->C44 - $es * ($this->C46 + $es * $this->C48)); |
$t *= $es; |
$en[3] = $t * ($this->C66 - $es * $this->C68); |
$en[4] = $t * $es * $this->C88; |
return $en; |
} |
/** |
* |
* @param type $phi |
* @param type $sphi |
* @param type $cphi |
* @param type $en |
* @return type |
*/ |
public function pj_mlfn( $phi, $sphi, $cphi, $en ) { |
$cphi *= $sphi; |
$sphi *= $sphi; |
return ($en[0] * $phi - $cphi * ($en[1] + $sphi * ($en[2] + $sphi * ($en[3] + $sphi * $en[4])))); |
} |
/** |
* |
* @param type $arg |
* @param type $es |
* @param type $en |
* @return type |
*/ |
public function pj_inv_mlfn( $arg, $es, $en ) { |
$k = (float) 1 / (1 - $es); |
$phi = $arg; |
for( $i = Proj4php::$common->MAX_ITER; $i; --$i ) { /* rarely goes over 2 iterations */ |
$s = sin( $phi ); |
$t = 1. - $es * $s * $s; |
//$t = $this->pj_mlfn($phi, $s, cos($phi), $en) - $arg; |
//$phi -= $t * ($t * sqrt($t)) * $k; |
$t = ($this->pj_mlfn( $phi, $s, cos( $phi ), $en ) - $arg) * ($t * sqrt( $t )) * $k; |
$phi -= $t; |
if( abs( $t ) < Proj4php::$common->EPSLN ) |
return $phi; |
} |
Proj4php::reportError( "cass:pj_inv_mlfn: Convergence error" ); |
return $phi; |
} |
} |
/branches/v5.3-amandaie/scripts/modules/ifn/bibliotheque/proj4php/projCode/eqc.php |
---|
New file |
0,0 → 1,58 |
<?php |
/** |
* Author : Julien Moquet |
* |
* Inspired by Proj4php from Mike Adair madairATdmsolutions.ca |
* and Richard Greenwood rich@greenwoodma$p->com |
* License: LGPL as per: http://www.gnu.org/copyleft/lesser.html |
*/ |
/* similar to equi.js FIXME proj4 uses eqc */ |
class Proj4phpProjEqc { |
public function init() { |
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 = cos( $this->lat_ts ); |
} |
// forward equations--mapping lat,long to x,y |
// ----------------------------------------------------------------- |
public function forward( $p ) { |
$lon = $p->x; |
$lat = $p->y; |
$dlon = Proj4php::$common->adjust_lon( $lon - $this->long0 ); |
$dlat = Proj4php::$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 |
// ----------------------------------------------------------------- |
public function inverse( $p ) { |
$x = $p->x; |
$y = $p->y; |
$p->x = Proj4php::$common->adjust_lon( $this->long0 + (($x - $this->x0) / ($this->a * $this->rc)) ); |
$p->y = Proj4php::$common->adjust_lat( $this->lat0 + (($y - $this->y0) / ($this->a )) ); |
return $p; |
} |
} |
Proj4php::$proj['eqc'] = new Proj4phpProjEqc(); |
/branches/v5.3-amandaie/scripts/modules/ifn/bibliotheque/proj4php/projCode/aeqd.php |
---|
New file |
0,0 → 1,101 |
<?php |
/** |
* Author : Julien Moquet |
* |
* Inspired by Proj4php from Mike Adair madairATdmsolutions.ca |
* and Richard Greenwood rich@greenwoodma$p->com |
* License: LGPL as per: http://www.gnu.org/copyleft/lesser.html |
*/ |
class Proj4phpProjAeqd { |
public function init() { |
$this->sin_p12 = sin( $this->lat0 ); |
$this->cos_p12 = cos( $this->lat0 ); |
} |
/** |
* |
* @param type $p |
* @return type |
*/ |
public function forward( $p ) { |
#$lon = $p->x; |
#$lat = $p->y; |
#$ksp; |
$sinphi = sin( $p->y ); |
$cosphi = cos( $p->y ); |
$dlon = Proj4php::$common->adjust_lon( lon - $this->long0 ); |
$coslon = cos( $dlon ); |
$g = $this->sin_p12 * $sinphi + $this->cos_p12 * $cosphi * $coslon; |
if( abs( abs( $g ) - 1.0 ) < Proj4php::$common->EPSLN ) { |
$ksp = 1.0; |
if( $g < 0.0 ) { |
Proj4php::reportError( "aeqd:Fwd:PointError" ); |
return; |
} |
} else { |
$z = acos( $g ); |
$ksp = $z / sin( $z ); |
} |
$p->x = $this->x0 + $this->a * $ksp * $cosphi * sin( $dlon ); |
$p->y = $this->y0 + $this->a * $ksp * ($this->cos_p12 * $sinphi - $this->sin_p12 * $cosphi * $coslon); |
return $p; |
} |
/** |
* |
* @param type $p |
* @return type |
*/ |
public function inverse( $p ) { |
$p->x -= $this->x0; |
$p->y -= $this->y0; |
$rh = sqrt( $p->x * $p->x + $p->y * $p->y ); |
if( $rh > (2.0 * Proj4php::$common->HALF_PI * $this->a) ) { |
Proj4php::reportError( "aeqdInvDataError" ); |
return; |
} |
$z = $rh / $this->a; |
$sinz = sin( $z ); |
$cosz = cos( $z ); |
$lon = $this->long0; |
#$lat; |
if( abs( $rh ) <= Proj4php::$common->EPSLN ) { |
$lat = $this->lat0; |
} else { |
$lat = Proj4php::$common->asinz( $cosz * $this->sin_p12 + ($p->y * $sinz * $this->cos_p12) / $rh ); |
$con = abs( $this->lat0 ) - Proj4php::$common->HALF_PI; |
if( abs( $con ) <= Proj4php::$common->EPSLN ) { |
if( $this->lat0 >= 0.0 ) { |
$lon = Proj4php::$common->adjust_lon( $this->long0 + atan2( $p->x, -$p->y ) ); |
} else { |
$lon = Proj4php::$common->adjust_lon( $this->long0 - atan2( -$p->x, $p->y ) ); |
} |
} else { |
$con = $cosz - $this->sin_p12 * sin( $lat ); |
if( (abs( $con ) < Proj4php::$common->EPSLN) && (abs( $p->x ) < Proj4php::$common->EPSLN) ) { |
//no-op, just keep the lon value as is |
} else { |
#$temp = atan2( ($p->x * $sinz * $this->cos_p12 ), ($con * $rh ) ); // $temp is unused !?! |
$lon = Proj4php::$common->adjust_lon( $this->long0 + atan2( ($p->x * $sinz * $this->cos_p12 ), ($con * $rh ) ) ); |
} |
} |
} |
$p->x = $lon; |
$p->y = $lat; |
return $p; |
} |
} |
Proj4php::$proj['aeqd'] = new Proj4phpProjAeqd(); |
/branches/v5.3-amandaie/scripts/modules/ifn/bibliotheque/proj4php/projCode/tmerc.php |
---|
New file |
0,0 → 1,166 |
<?php |
/** |
* Author : Julien Moquet |
* |
* Inspired by Proj4php from Mike Adair madairATdmsolutions.ca |
* and Richard Greenwood rich@greenwoodma$p->com |
* License: LGPL as per: http://www.gnu.org/copyleft/lesser.html |
*/ |
/******************************************************************************* |
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 |
*/ |
class Proj4phpProjTmerc { |
private $e0, $e1, $e2, $e3, $ml0; |
/** |
* |
*/ |
public function init() { |
$this->e0 = Proj4php::$common->e0fn( $this->es ); |
$this->e1 = Proj4php::$common->e1fn( $this->es ); |
$this->e2 = Proj4php::$common->e2fn( $this->es ); |
$this->e3 = Proj4php::$common->e3fn( $this->es ); |
$this->ml0 = $this->a * Proj4php::$common->mlfn( $this->e0, $this->e1, $this->e2, $this->e3, $this->lat0 ); |
} |
/** |
Transverse Mercator Forward - long/lat to x/y |
long/lat in radians |
*/ |
public function forward( $p ) { |
$lon = $p->x; |
$lat = $p->y; |
$delta_lon = Proj4php::$common->adjust_lon( $lon - $this->long0 ); // Delta longitude |
#$con = 0; // cone constant |
#$x = 0; |
#$y = 0; |
$sin_phi = sin( $lat ); |
$cos_phi = cos( $lat ); |
if( isset($this->sphere) && $this->sphere === true ) { /* spherical form */ |
$b = $cos_phi * sin( $delta_lon ); |
if( (abs( abs( $b ) - 1.0 )) < .0000000001 ) { |
Proj4php::reportError( "tmerc:forward: Point projects into infinity" ); |
return(93); |
} else { |
$x = .5 * $this->a * $this->k0 * log( (1.0 + $b) / (1.0 - $b) ); |
$con = acos( $cos_phi * cos( $delta_lon ) / sqrt( 1.0 - $b * $b ) ); |
if( $lat < 0 ) |
$con = - $con; |
$y = $this->a * $this->k0 * ($con - $this->lat0); |
} |
} else { |
$al = $cos_phi * $delta_lon; |
$als = pow( $al, 2 ); |
$c = $this->ep2 * pow( $cos_phi, 2 ); |
$tq = tan( $lat ); |
$t = pow( $tq, 2 ); |
$con = 1.0 - $this->es * pow( $sin_phi, 2 ); |
$n = $this->a / sqrt( $con ); |
$ml = $this->a * Proj4php::$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 + 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 * pow( $c, 2 ) + $als / 30.0 * (61.0 - 58.0 * $t + pow( $t, 2 ) + 600.0 * $c - 330.0 * $this->ep2))))) + $this->y0; |
} |
$p->x = $x; |
$p->y = $y; |
return $p; |
} |
/** |
Transverse Mercator Inverse - x/y to long/lat |
*/ |
public function inverse( $p ) { |
#$phi; /* temporary angles */ |
#$delta_phi; /* difference between longitudes */ |
$max_iter = 6; /* maximun number of iterations */ |
if( isset($this->sphere) && $this->sphere === true ) { /* spherical form */ |
$f = exp( $p->x / ($this->a * $this->k0) ); |
$g = .5 * ($f - 1 / $f); |
$temp = $this->lat0 + $p->y / ($this->a * $this->k0); |
$h = cos( $temp ); |
$con = sqrt( (1.0 - $h * $h) / (1.0 + $g * $g) ); |
$lat = Proj4php::$common->asinz( $con ); |
if( $temp < 0 ) |
$lat = -$lat; |
if( ($g == 0) && ($h == 0) ) { |
$lon = $this->long0; |
} else { |
$lon = Proj4php::$common->adjust_lon( atan2( $g, $h ) + $this->long0 ); |
} |
} else { // ellipsoidal form |
$x = $p->x - $this->x0; |
$y = $p->y - $this->y0; |
$con = ($this->ml0 + $y / $this->k0) / $this->a; |
$phi = $con; |
for( $i = 0; true; $i++ ) { |
$delta_phi = (($con + $this->e1 * sin( 2.0 * $phi ) - $this->e2 * sin( 4.0 * $phi ) + $this->e3 * sin( 6.0 * $phi )) / $this->e0) - $phi; |
$phi += $delta_phi; |
if( abs( $delta_phi ) <= Proj4php::$common->EPSLN ) |
break; |
if( $i >= $max_iter ) { |
Proj4php::reportError( "tmerc:inverse: Latitude failed to converge" ); |
return(95); |
} |
} // for() |
if( abs( $phi ) < Proj4php::$common->HALF_PI ) { |
// sincos(phi, &sin_phi, &cos_phi); |
$sin_phi = sin( $phi ); |
$cos_phi = cos( $phi ); |
$tan_phi = tan( $phi ); |
$c = $this->ep2 * pow( $cos_phi, 2 ); |
$cs = pow( $c, 2 ); |
$t = pow( $tan_phi, 2 ); |
$ts = pow( $t, 2 ); |
$con = 1.0 - $this->es * pow( $sin_phi, 2 ); |
$n = $this->a / sqrt( $con ); |
$r = $n * (1.0 - $this->es) / $con; |
$d = $x / ($n * $this->k0); |
$ds = 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 = Proj4php::$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 = Proj4php::$common->HALF_PI * Proj4php::$common->sign( $y ); |
$lon = $this->long0; |
} |
} |
$p->x = $lon; |
$p->y = $lat; |
return $p; |
} |
} |
Proj4php::$proj['tmerc'] = new Proj4phpProjTmerc(); |
/branches/v5.3-amandaie/scripts/modules/ifn/bibliotheque/proj4php/projCode/nzmg.php |
---|
New file |
0,0 → 1,338 |
<?php |
/** |
* Author : Julien Moquet |
* |
* Inspired by Proj4php from Mike Adair madairATdmsolutions.ca |
* and Richard Greenwood rich@greenwoodma$p->com |
* License: LGPL as per: http://www.gnu.org/copyleft/lesser.html |
*/ |
/******************************************************************************* |
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 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 |
Proj4php.defs["EPSG:4272"] = "+proj=longlat +ellps=intl +datum=nzgd49 +no_defs "; |
Proj4php.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 |
*/ |
class Proj4phpProjNzmg { |
/** |
* iterations: Number of iterations to refine inverse transform. |
* 0 -> km accuracy |
* 1 -> m accuracy -- suitable for most mapping applications |
* 2 -> mm accuracy |
*/ |
protected $iterations = 1; |
/** |
* |
*/ |
public function init() { |
$this->A = 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 = array( ); |
$this->B_im = 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 = array( ); |
$this->C_im = 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 = 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 |
*/ |
public function forward( $p ) { |
$lon = $p->x; |
$lat = $p->y; |
$delta_lat = $lat - $this->lat0; |
$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. |
$d_phi = $delta_lat / Proj4php::$common->SEC_TO_RAD * 1E-5; |
$d_lambda = $delta_lon; |
$d_phi_n = 1; // d_phi^0 |
$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 |
$th_re = $d_psi; |
$th_im = $d_lambda; |
// 3. Calculate z |
$th_n_re = 1; |
$th_n_im = 0; // theta^0 |
#$th_n_re1; |
#$th_n_im1; |
$z_re = 0; |
$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 |
$p->x = ($z_im * $this->a) + $this->x0; |
$p->y = ($z_re * $this->a) + $this->y0; |
return $p; |
} |
/** |
New Zealand Map Grid Inverse - x/y to long/lat |
*/ |
public function inverse( $p ) { |
$x = $p->x; |
$y = $p->y; |
$delta_x = $x - $this->x0; |
$delta_y = $y - $this->y0; |
// 1. Calculate z |
$z_re = $delta_y / $this->a; |
$z_im = $delta_x / $this->a; |
// 2a. Calculate theta - first approximation gives km accuracy |
$z_n_re = 1; |
$z_n_im = 0; // z^0 |
$z_n_re1; |
$z_n_im1; |
$th_re = 0; |
$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++ ) { |
$th_n_re = $th_re; |
$th_n_im = $th_im; |
$th_n_re1; |
$th_n_im1; |
$num_re = $z_re; |
$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; |
$den_re = $this->B_re[1]; |
$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 |
$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 |
$d_psi = $th_re; |
$d_lambda = $th_im; |
$d_psi_n = 1; // d_psi^0 |
$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. |
$lat = $this->lat0 + ($d_phi * Proj4php::$common->SEC_TO_RAD * 1E5); |
$lon = $this->long0 + $d_lambda; |
$p->x = $lon; |
$p->y = $lat; |
return $p; |
} |
} |
Proj4php::$proj['nzmg'] = new Proj4phpProjNzmg(); |
/branches/v5.3-amandaie/scripts/modules/ifn/bibliotheque/proj4php/projCode/eqdc.php |
---|
New file |
0,0 → 1,152 |
<?php |
/** |
* Author : Julien Moquet |
* |
* Inspired by Proj4php from Mike Adair madairATdmsolutions.ca |
* and Richard Greenwood rich@greenwoodma$p->com |
* License: LGPL as per: http://www.gnu.org/copyleft/lesser.html |
*/ |
/******************************************************************************* |
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 |
-----------------------------------------------------*/ |
class Proj4phpProjEqdc { |
/* Initialize the Equidistant Conic projection |
------------------------------------------ */ |
public function init() { |
/* 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 - pow( $this->temp, 2 ); |
$this->e = sqrt( $this->es ); |
$this->e0 = Proj4php::$common->e0fn( $this->es ); |
$this->e1 = Proj4php::$common->e1fn( $this->es ); |
$this->e2 = Proj4php::$common->e2fn( $this->es ); |
$this->e3 = Proj4php::$common->e3fn( $this->es ); |
$this->sinphi = sin( $this->lat1 ); |
$this->cosphi = cos( $this->lat1 ); |
$this->ms1 = Proj4php::$common->msfnz( $this->e, $this->sinphi, $this->cosphi ); |
$this->ml1 = Proj4php::$common->mlfn( $this->e0, $this->e1, $this->e2, $this->e3, $this->lat1 ); |
/* format B |
--------- */ |
if( $this->mode != 0 ) { |
if( abs( $this->lat1 + $this->lat2 ) < Proj4php::$common->EPSLN ) { |
Proj4php::reportError( "eqdc:Init:EqualLatitudes" ); |
//return(81); |
} |
$this->sinphi = sin( $this->lat2 ); |
$this->cosphi = cos( $this->lat2 ); |
$this->ms2 = Proj4php::$common->msfnz( $this->e, $this->sinphi, $this->cosphi ); |
$this->ml2 = Proj4php::$common->mlfn( $this->e0, $this->e1, $this->e2, $this->e3, $this->lat2 ); |
if( abs( $this->lat1 - $this->lat2 ) >= Proj4php::$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 = Proj4php::$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 |
----------------------------------------------------------- */ |
public function forward( $p ) { |
$lon = $p->x; |
$lat = $p->y; |
/* Forward equations |
----------------- */ |
$ml = Proj4php::$common->mlfn( $this->e0, $this->e1, $this->e2, $this->e3, $lat ); |
$rh1 = $this->a * ($this->g - $ml); |
$theta = $this->ns * Proj4php::$common->adjust_lon( $lon - $this->long0 ); |
$x = $this->x0 + $rh1 * sin( $theta ); |
$y = $this->y0 + $this->rh - $rh1 * cos( $theta ); |
$p->x = $x; |
$p->y = $y; |
return $p; |
} |
/* Inverse equations |
----------------- */ |
public function inverse( $p ) { |
$p->x -= $this->x0; |
$p->y = $this->rh - $p->y + $this->y0; |
if( $this->ns >= 0 ) { |
$rh1 = sqrt( $p->x * $p->x + $p->y * $p->y ); |
$con = 1.0; |
} else { |
$rh1 = -sqrt( $p->x * $p->x + $p->y * $p->y ); |
$con = -1.0; |
} |
$theta = 0.0; |
if( $rh1 != 0.0 ) |
$theta = atan2( $con * $p->x, $con * $p->y ); |
$ml = $this->g - $rh1 / $this->a; |
$lat = $this->phi3z( $ml, $this->e0, $this->e1, $this->e2, $this->e3 ); |
$lon = Proj4php::$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. |
----------------------------------------------------------------- */ |
public function phi3z( $ml, $e0, $e1, $e2, $e3 ) { |
$phi = $ml; |
for( $i = 0; $i < 15; $i++ ) { |
$dphi = ($ml + $e1 * sin( 2.0 * $phi ) - $e2 * sin( 4.0 * $phi ) + $e3 * sin( 6.0 * $phi )) / $e0 - $phi; |
$phi += $dphi; |
if( abs( $dphi ) <= .0000000001 ) { |
return $phi; |
} |
} |
Proj4php::reportError( "PHI3Z-CONV:Latitude failed to converge after 15 iterations" ); |
return null; |
} |
} |
Proj4php::$proj['eqdc'] = new Proj4phpProjEqdc(); |
/branches/v5.3-amandaie/scripts/modules/ifn/bibliotheque/proj4php/projCode/sinu.php |
---|
New file |
0,0 → 1,139 |
<?php |
/** |
* Author : Julien Moquet |
* |
* Inspired by Proj4php from Mike Adair madairATdmsolutions.ca |
* and Richard Greenwood rich@greenwoodma$p->com |
* License: LGPL as per: http://www.gnu.org/copyleft/lesser.html |
*/ |
/******************************************************************************* |
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. |
* ***************************************************************************** */ |
class Proj4phpProjSinu { |
/* Initialize the Sinusoidal projection |
------------------------------------ */ |
public function init() { |
/* Place parameters in static storage for common use |
------------------------------------------------- */ |
#$this->R = 6370997.0; //Radius of earth |
if( !$this->sphere ) { |
$this->en = Proj4php::$common->pj_enfn( $this->es ); |
} else { |
$this->n = 1.; |
$this->m = 0.; |
$this->es = 0; |
$this->C_y = sqrt( ($this->m + 1.) / $this->n ); |
$this->C_x = $this->C_y / ($this->m + 1.); |
} |
} |
/* Sinusoidal forward equations--mapping lat,long to x,y |
----------------------------------------------------- */ |
public function forward( $p ) { |
#$x,y,delta_lon; |
$lon = $p->x; |
$lat = $p->y; |
/* Forward equations |
----------------- */ |
$lon = Proj4php::$common->adjust_lon( $lon - $this->long0 ); |
if( isset($this->sphere) ) { |
if( !$this->m ) { |
$lat = $this->n != 1. ? asin( $this->n * sin( $lat ) ) : $lat; |
} else { |
$k = $this->n * sin( $lat ); |
for( $i = Proj4php::$common->MAX_ITER; $i; --$i ) { |
$V = ($this->m * $lat + sin( $lat ) - $k) / ($this->m + cos( $lat )); |
$lat -= $V; |
if( abs( $V ) < Proj4php::$common->EPSLN ) |
break; |
} |
} |
$x = $this->a * $this->C_x * $lon * ($this->m + cos( $lat )); |
$y = $this->a * $this->C_y * $lat; |
} else { |
$s = sin( $lat ); |
$c = cos( $lat ); |
$y = $this->a * Proj4php::$common->pj_mlfn( $lat, $s, $c, $this->en ); |
$x = $this->a * $lon * $c / sqrt( 1. - $this->es * $s * $s ); |
} |
$p->x = $x; |
$p->y = $y; |
return $p; |
} |
/** |
* |
* @param type $p |
* @return type |
*/ |
public function inverse( $p ) { |
#$lat; |
#$temp; |
#$lon; |
/* Inverse equations |
----------------- */ |
$p->x -= $this->x0; |
$p->y -= $this->y0; |
$lat = $p->y / $this->a; |
if( isset($this->sphere) ) { |
$p->y /= $this->C_y; |
$lat = $this->m ? asin( ($this->m * $p->y + sin( $p->y )) / $this->n ) : ( $this->n != 1. ? asin( sin( $p->y ) / $this->n ) : $p->y ); |
$lon = $p->x / ($this->C_x * ($this->m + cos( $p->y ))); |
} |
else { |
$lat = Proj4php::$common->pj_inv_mlfn( $p->y / $this->a, $this->es, $this->en ); |
$s = abs( $lat ); |
if( $s < Proj4php::$common->HALF_PI ) { |
$s = sin( $lat ); |
$temp = $this->long0 + $p->x * sqrt( 1. - $this->es * $s * $s ) / ($this->a * cos( $lat )); |
//temp = $this->long0 + $p->x / ($this->a * cos($lat)); |
$lon = Proj4php::$common->adjust_lon( $temp ); |
} else if( ($s - Proj4php::$common->EPSLN) < Proj4php::$common->HALF_PI ) { |
$lon = $this->long0; |
} |
} |
$p->x = $lon; |
$p->y = $lat; |
return $p; |
} |
} |
Proj4php::$proj['sinu'] = new Proj4phpProjSinu(); |
/branches/v5.3-amandaie/scripts/modules/ifn/bibliotheque/proj4php/projCode/stere.php |
---|
New file |
0,0 → 1,303 |
<?php |
/** |
* Author : Julien Moquet |
* |
* Inspired by Proj4php from Mike Adair madairATdmsolutions.ca |
* and Richard Greenwood rich@greenwoodma$p->com |
* License: LGPL as per: http://www.gnu.org/copyleft/lesser.html |
*/ |
// Initialize the Stereographic projection |
class Proj4phpProjStere { |
protected $TOL = 1.e-8; |
protected $NITER = 8; |
protected $CONV = 1.e-10; |
protected $S_POLE = 0; |
protected $N_POLE = 1; |
protected $OBLIQ = 2; |
protected $EQUIT = 3; |
/** |
* |
* @param type $phit |
* @param type $sinphi |
* @param type $eccen |
* @return type |
*/ |
public function ssfn_( $phit, $sinphi, $eccen ) { |
$sinphi *= $eccen; |
return (tan( .5 * (Proj4php::$common->HALF_PI + $phit) ) * pow( (1. - $sinphi) / (1. + $sinphi), .5 * $eccen )); |
} |
/** |
* |
*/ |
public function init() { |
$this->phits = $this->lat_ts ? $this->lat_ts : Proj4php::$common->HALF_PI; |
$t = abs( $this->lat0 ); |
if( (abs( $t ) - Proj4php::$common->HALF_PI) < Proj4php::$common->EPSLN ) { |
$this->mode = $this->lat0 < 0. ? $this->S_POLE : $this->N_POLE; |
} else { |
$this->mode = $t > Proj4php::$common->EPSLN ? $this->OBLIQ : $this->EQUIT; |
} |
$this->phits = abs( $this->phits ); |
if( $this->es ) { |
#$X; |
switch( $this->mode ) { |
case $this->N_POLE: |
case $this->S_POLE: |
if( abs( $this->phits - Proj4php::$common->HALF_PI ) < Proj4php::$common->EPSLN ) { |
$this->akm1 = 2. * $this->k0 / sqrt( pow( 1 + $this->e, 1 + $this->e ) * pow( 1 - $this->e, 1 - $this->e ) ); |
} else { |
$t = sin( $this->phits ); |
$this->akm1 = cos( $this->phits ) / Proj4php::$common->tsfnz( $this->e, $this->phits, $t ); |
$t *= $this->e; |
$this->akm1 /= sqrt( 1. - $t * $t ); |
} |
break; |
case $this->EQUIT: |
$this->akm1 = 2. * $this->k0; |
break; |
case $this->OBLIQ: |
$t = sin( $this->lat0 ); |
$X = 2. * atan( $this->ssfn_( $this->lat0, $t, $this->e ) ) - Proj4php::$common->HALF_PI; |
$t *= $this->e; |
$this->akm1 = 2. * $this->k0 * cos( $this->lat0 ) / sqrt( 1. - $t * $t ); |
$this->sinX1 = sin( $X ); |
$this->cosX1 = cos( $X ); |
break; |
} |
} else { |
switch( $this->mode ) { |
case $this->OBLIQ: |
$this->sinph0 = sin( $this->lat0 ); |
$this->cosph0 = cos( $this->lat0 ); |
case $this->EQUIT: |
$this->akm1 = 2. * $this->k0; |
break; |
case $this->S_POLE: |
case $this->N_POLE: |
$this->akm1 = abs( $this->phits - Proj4php::$common->HALF_PI ) >= Proj4php::$common->EPSLN ? |
cos( $this->phits ) / tan( Proj4php::$common->FORTPI - .5 * $this->phits ) : |
2. * $this->k0; |
break; |
} |
} |
} |
/** |
* Stereographic forward equations--mapping lat,long to x,y |
* |
* @param type $p |
* @return type |
*/ |
public function forward( $p ) { |
$lon = $p->x; |
$lon = Proj4php::$common->adjust_lon( $lon - $this->long0 ); |
$lat = $p->y; |
#$x; |
#$y; |
if( $this->sphere ) { |
/* |
$sinphi; |
$cosphi; |
$coslam; |
$sinlam; |
*/ |
$sinphi = sin( $lat ); |
$cosphi = cos( $lat ); |
$coslam = cos( $lon ); |
$sinlam = sin( $lon ); |
switch( $this->mode ) { |
case $this->EQUIT: |
$y = 1. + $cosphi * $coslam; |
if( y <= Proj4php::$common->EPSLN ) { |
Proj4php::reportError("stere:forward:Equit"); |
} |
$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 <= Proj4php::$common->EPSLN ) { |
Proj4php::reportError("stere:forward:Obliq"); |
} |
$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( abs( $lat - Proj4php::$common->HALF_PI ) < $this->TOL ) { |
Proj4php::reportError("stere:forward:S_POLE"); |
} |
$y = $this->akm1 * tan( Proj4php::$common->FORTPI + .5 * $lat ); |
$x = $sinlam * $y; |
$y *= $coslam; |
break; |
} |
} else { |
$coslam = cos( $lon ); |
$sinlam = sin( $lon ); |
$sinphi = sin( $lat ); |
if( $this->mode == $this->OBLIQ || $this->mode == $this->EQUIT ) { |
$Xt = 2. * atan( $this->ssfn_( $lat, $sinphi, $this->e ) ); |
$sinX = sin( $Xt - Proj4php::$common->HALF_PI ); |
$cosX = cos( $Xt ); |
} |
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 * Proj4php::$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 |
* |
* @param type $p |
* @return type |
*/ |
public function inverse( $p ) { |
$x = ($p->x - $this->x0) / $this->a; /* descale and de-offset */ |
$y = ($p->y - $this->y0) / $this->a; |
/* |
$lon; |
$lat; |
$cosphi; |
$sinphi; |
$rho; |
$tp = 0.0; |
$phi_l = 0.0; |
$i; |
*/ |
$halfe = 0.0; |
$pi2 = 0.0; |
if( $this->sphere ) { |
/* |
$c; |
$rh; |
$sinc; |
$cosc; |
*/ |
$rh = sqrt( $x * $x + $y * $y ); |
$c = 2. * atan( $rh / $this->akm1 ); |
$sinc = sin( $c ); |
$cosc = cos( $c ); |
$lon = 0.; |
switch( $this->mode ) { |
case $this->EQUIT: |
if( abs( $rh ) <= Proj4php::$common->EPSLN ) { |
$lat = 0.; |
} else { |
$lat = asin( $y * $sinc / $rh ); |
} |
if( $cosc != 0. || $x != 0. ) |
$lon = atan2( $x * $sinc, $cosc * $rh ); |
break; |
case $this->OBLIQ: |
if( abs( $rh ) <= Proj4php::$common->EPSLN ) { |
$lat = $this->phi0; |
} else { |
$lat = asin( $cosc * $this->sinph0 + $y * $sinc * $this->cosph0 / $rh ); |
} |
$c = $cosc - $this->sinph0 * sin( $lat ); |
if( $c != 0. || $x != 0. ) { |
$lon = atan2( $x * $sinc * $this->cosph0, $c * $rh ); |
} |
break; |
case $this->N_POLE: |
$y = -$y; |
case $this->S_POLE: |
if( abs( $rh ) <= Proj4php::$common->EPSLN ) { |
$lat = $this->phi0; |
} else { |
$lat = asin( $this->mode == $this->S_POLE ? -$cosc : $cosc ); |
} |
$lon = ($x == 0. && $y == 0.) ? 0. : atan2( $x, $y ); |
break; |
} |
$p->x = Proj4php::$common->adjust_lon( $lon + $this->long0 ); |
$p->y = $lat; |
} else { |
$rho = sqrt( $x * $x + $y * $y ); |
switch( $this->mode ) { |
case $this->OBLIQ: |
case $this->EQUIT: |
$tp = 2. * atan2( $rho * $this->cosX1, $this->akm1 ); |
$cosphi = cos( $tp ); |
$sinphi = sin( $tp ); |
if( $rho == 0.0 ) { |
$phi_l = asin( $cosphi * $this->sinX1 ); |
} else { |
$phi_l = asin( $cosphi * $this->sinX1 + ($y * $sinphi * $this->cosX1 / $rho) ); |
} |
$tp = tan( .5 * (Proj4php::$common->HALF_PI + $phi_l) ); |
$x *= $sinphi; |
$y = $rho * $this->cosX1 * $cosphi - $y * $this->sinX1 * $sinphi; |
$pi2 = Proj4php::$common->HALF_PI; |
$halfe = .5 * $this->e; |
break; |
case $this->N_POLE: |
$y = -$y; |
case $this->S_POLE: |
$tp = - $rho / $this->akm1; |
$phi_l = Proj4php::$common->HALF_PI - 2. * atan( $tp ); |
$pi2 = -Proj4php::$common->HALF_PI; |
$halfe = -.5 * $this->e; |
break; |
} |
for( $i = $this->NITER; $i--; $phi_l = $lat ) { //check this |
$sinphi = $this->e * sin( $phi_l ); |
$lat = 2. * atan( $tp * pow( (1. + $sinphi) / (1. - $sinphi), $halfe ) ) - $pi2; |
if( abs( phi_l - lat ) < $this->CONV ) { |
if( $this->mode == $this->S_POLE ) |
$lat = -$lat; |
$lon = ($x == 0. && $y == 0.) ? 0. : atan2( $x, $y ); |
$p->x = Proj4php::$common->adjust_lon( $lon + $this->long0 ); |
$p->y = $lat; |
return $p; |
} |
} |
} |
} |
} |
Proj4php::$proj['stere'] = new Proj4phpProjStere(); |
/branches/v5.3-amandaie/scripts/modules/ifn/bibliotheque/proj4php/projCode/gauss.php |
---|
New file |
0,0 → 1,74 |
<?php |
/** |
* Author : Julien Moquet |
* |
* Inspired by Proj4php from Mike Adair madairATdmsolutions.ca |
* and Richard Greenwood rich@greenwoodma$p->com |
* License: LGPL as per: http://www.gnu.org/copyleft/lesser.html |
*/ |
class Proj4phpProjGauss { |
/** |
* |
*/ |
public function init() { |
$sphi = sin( $this->lat0 ); |
$cphi = cos( $this->lat0 ); |
$cphi *= $cphi; |
$this->rc = sqrt( 1.0 - $this->es ) / (1.0 - $this->es * $sphi * $sphi); |
$this->C = sqrt( 1.0 + $this->es * $cphi * $cphi / (1.0 - $this->es) ); |
$this->phic0 = asin( $sphi / $this->C ); |
$this->ratexp = 0.5 * $this->C * $this->e; |
$this->K = tan( 0.5 * $this->phic0 + Proj4php::$common->FORTPI ) / (pow( tan( 0.5 * $this->lat0 + Proj4php::$common->FORTPI ), $this->C ) * Proj4php::$common->srat( $this->e * $sphi, $this->ratexp )); |
} |
/** |
* |
* @param type $p |
* @return type |
*/ |
public function forward( $p ) { |
$lon = $p->x; |
$lat = $p->y; |
$p->y = 2.0 * atan( $this->K * pow( tan( 0.5 * $lat + Proj4php::$common->FORTPI ), $this->C ) * Proj4php::$common->srat( $this->e * sin( $lat ), $this->ratexp ) ) - Proj4php::$common->HALF_PI; |
$p->x = $this->C * $lon; |
return $p; |
} |
/** |
* |
* @param type $p |
* @return null |
*/ |
public function inverse( $p ) { |
$DEL_TOL = 1e-14; |
$lon = $p->x / $this->C; |
$lat = $p->y; |
$num = pow( tan( 0.5 * $lat + Proj4php::$common . FORTPI ) / $this->K, 1. / $this->C ); |
for( $i = Proj4php::$common . MAX_ITER; $i > 0; --$i ) { |
$lat = 2.0 * atan( $num * Proj4php::$common->srat( $this->e * sin( $p->y ), -0.5 * $this->e ) ) - Proj4php::$common->HALF_PI; |
if( abs( $lat - $p->y ) < $DEL_TOL ) |
break; |
$p->y = $lat; |
} |
/* convergence failed */ |
if( !$i ) { |
Proj4php::reportError( "gauss:inverse:convergence failed" ); |
return null; |
} |
$p->x = $lon; |
$p->y = $lat; |
return $p; |
} |
} |
Proj4php::$proj['gauss'] = new Proj4phpProjGauss(); |
/branches/v5.3-amandaie/scripts/modules/ifn/bibliotheque/proj4php/projCode/sterea.php |
---|
New file |
0,0 → 1,91 |
<?php |
/** |
* Author : Julien Moquet |
* |
* Inspired by Proj4php from Mike Adair madairATdmsolutions.ca |
* and Richard Greenwood rich@greenwoodma$p->com |
* License: LGPL as per: http://www.gnu.org/copyleft/lesser.html |
*/ |
class Proj4phpProjSterea { |
protected $dependsOn = 'gauss'; |
/** |
* |
* @return void |
*/ |
public function init() { |
if( !$this->rc ) { |
Proj4php::reportError( "sterea:init:E_ERROR_0" ); |
return; |
} |
$this->sinc0 = sin( $this->phic0 ); |
$this->cosc0 = cos( $this->phic0 ); |
$this->R2 = 2.0 * $this->rc; |
if( !$this->title ) |
$this->title = "Oblique Stereographic Alternative"; |
} |
/** |
* |
* @param type $p |
* @return type |
*/ |
public function forward( $p ) { |
$p->x = Proj4php::$common->adjust_lon( $p->x - $this->long0 ); /* adjust del longitude */ |
$p = Proj4php::$proj['gauss']->forward( $p ); |
$sinc = sin( $p->y ); |
$cosc = cos( $p->y ); |
$cosl = cos( $p->x ); |
$k = $this->k0 * $this->R2 / (1.0 + $this->sinc0 * $sinc + $this->cosc0 * $cosc * $cosl); |
$p->x = $k * $cosc * 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; |
} |
/** |
* |
* @param type $p |
* @return type |
*/ |
public function inverse( $p ) { |
#$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 = sqrt( $p->x * $p->x + $p->y * $p->y ) ) ) { |
$c = 2.0 * atan2( $rho, $this->R2 ); |
$sinc = sin( $c ); |
$cosc = cos( $c ); |
$lat = asin( $cosc * $this->sinc0 + $p->y * $sinc * $this->cosc0 / $rho ); |
$lon = 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; |
$p = Proj4php::$proj['gauss']->inverse( $p ); |
$p->x = Proj4php::$common->adjust_lon( $p->x + $this->long0 ); /* adjust longitude to CM */ |
return $p; |
} |
} |
Proj4php::$proj['sterea'] = new Proj4phpProjSterea(); |
/branches/v5.3-amandaie/scripts/modules/ifn/bibliotheque/proj4php/projCode/poly.php |
---|
New file |
0,0 → 1,192 |
<?php |
/** |
* Author : Julien Moquet |
* |
* Inspired by Proj4php from Mike Adair madairATdmsolutions.ca |
* and Richard Greenwood rich@greenwoodma$p->com |
* License: LGPL as per: http://www.gnu.org/copyleft/lesser.html |
*/ |
/* Function to compute, phi4, the latitude for the inverse of the |
Polyconic projection. |
------------------------------------------------------------ */ |
function phi4z( $eccent, $e0, $e1, $e2, $e3, $a, $b, &$c, $phi ) { |
/* |
$sinphi; |
$sin2ph; |
$tanph; |
$ml; |
$mlp; |
$con1; |
$con2; |
$con3; |
$dphi; |
$i; |
*/ |
$phi = $a; |
for( $i = 1; $i <= 15; $i++ ) { |
$sinphi = sin( $phi ); |
$tanphi = tan( $phi ); |
$c = $tanphi * sqrt( 1.0 - $eccent * $sinphi * $sinphi ); |
$sin2ph = 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 * sin( 4.0 * $phi ) - $e3 * sin( 6.0 * $phi ); |
$mlp = $e0 - 2.0 * $e1 * cos( 2.0 * $phi ) + 4.0 * $e2 * cos( 4.0 * $phi ) - 6.0 * $e3 * 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( abs( $dphi ) <= .0000000001 ) |
return($phi); |
} |
Proj4php::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 ) { |
#$con; |
#$com; |
$con = 1.0 + $x; |
$com = 1.0 - $x; |
return (sqrt( (pow( $con, $con )) * (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. |
* ***************************************************************************** */ |
class Proj4phpProjPoly { |
/* Initialize the POLYCONIC projection |
---------------------------------- */ |
public function init() { |
#$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 - pow( $this->temp, 2 ); // devait etre dans tmerc.js mais n y est pas donc je commente sinon retour de valeurs nulles |
$this->e = sqrt( $this->es ); |
$this->e0 = Proj4php::$common->e0fn( $this->es ); |
$this->e1 = Proj4php::$common->e1fn( $this->es ); |
$this->e2 = Proj4php::$common->e2fn( $this->es ); |
$this->e3 = Proj4php::$common->e3fn( $this->es ); |
$this->ml0 = Proj4php::$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 |
--------------------------------------------------- */ |
public function forward( $p ) { |
/* |
$sinphi; |
$cosphi; // sin and cos value |
$al; // temporary values |
$c; // temporary values |
$con; |
$ml; // cone constant, small m |
$ms; // small m |
$x; |
$y; |
*/ |
$lon = $p->x; |
$lat = $p->y; |
$con = Proj4php::$common->adjust_lon( $lon - $this->long0 ); |
if( abs( $lat ) <= .0000001 ) { |
$x = $this->x0 + $this->a * $con; |
$y = $this->y0 - $this->a * $this->ml0; |
} else { |
$sinphi = sin( $lat ); |
$cosphi = cos( $lat ); |
$ml = Proj4php::$common->mlfn( $this->e0, $this->e1, $this->e2, $this->e3, $lat ); |
$ms = Proj4php::$common->msfnz( $this->e, $sinphi, $cosphi ); |
$x = $this->x0 + $this->a * $ms * sin( $sinphi ) / $sinphi; |
$y = $this->y0 + $this->a * ($ml - $this->ml0 + $ms * (1.0 - cos( $sinphi )) / $sinphi); |
} |
$p->x = $x; |
$p->y = $y; |
return $p; |
} |
/* Inverse equations |
----------------- */ |
public function inverse( $p ) { |
/* |
$sin_phi; |
$cos_phi; // sin and cos values |
$al; // temporary values |
$b; // temporary values |
$c; // temporary values |
$con; |
$ml; // cone constant, small m |
$iflg; // error flag |
$lon; |
$lat; |
*/ |
$p->x -= $this->x0; |
$p->y -= $this->y0; |
$al = $this->ml0 + $p->y / $this->a; |
$iflg = 0; |
if( 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 = Proj4php::$common->adjust_lon( (Proj4php::$common->asinz( $p->x * $c / $this->a ) / sin( $lat )) + $this->long0 ); |
} |
$p->x = $lon; |
$p->y = $lat; |
return $p; |
} |
} |
Proj4php::$proj['poly'] = new Proj4phpProjPoly(); |
/branches/v5.3-amandaie/scripts/modules/ifn/bibliotheque/proj4php/projCode/aea.php |
---|
New file |
0,0 → 1,184 |
<?php |
/******************************************************************************* |
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. |
*******************************************************************************/ |
/** |
* Author : Julien Moquet |
* |
* Inspired by Proj4php from Mike Adair madairATdmsolutions.ca |
* and Richard Greenwood rich@greenwoodma$p->com |
* License: LGPL as per: http://www.gnu.org/copyleft/lesser.html |
*/ |
class Proj4phpProjAea { |
/** |
* |
* @return void |
*/ |
public function init() { |
if( abs( $this->lat1 + $this->lat2 ) < Proj4php::$common->EPSLN ) { |
Proj4php::reportError( "aeaInitEqualLatitudes" ); |
return; |
} |
$this->temp = $this->b / $this->a; |
$this->es = 1.0 - pow( $this->temp, 2 ); |
$this->e3 = sqrt( $this->es ); |
$this->sin_po = sin( $this->lat1 ); |
$this->cos_po = cos( $this->lat1 ); |
$this->t1 = $this->sin_po; |
$this->con = $this->sin_po; |
$this->ms1 = Proj4php::$common->msfnz( $this->e3, $this->sin_po, $this->cos_po ); |
$this->qs1 = Proj4php::$common->qsfnz( $this->e3, $this->sin_po, $this->cos_po ); |
$this->sin_po = sin( $this->lat2 ); |
$this->cos_po = cos( $this->lat2 ); |
$this->t2 = $this->sin_po; |
$this->ms2 = Proj4php::$common->msfnz( $this->e3, $this->sin_po, $this->cos_po ); |
$this->qs2 = Proj4php::$common->qsfnz( $this->e3, $this->sin_po, $this->cos_po ); |
$this->sin_po = sin( $this->lat0 ); |
$this->cos_po = cos( $this->lat0 ); |
$this->t3 = $this->sin_po; |
$this->qs0 = Proj4php::$common->qsfnz( $this->e3, $this->sin_po, $this->cos_po ); |
if( abs( $this->lat1 - $this->lat2 ) > Proj4php::$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 * sqrt( $this->c - $this->ns0 * $this->qs0 ) / $this->ns0; |
} |
/** |
* Albers Conical Equal Area forward equations--mapping lat,long to x,y |
* |
* @param Point $p |
* @return Point $p |
*/ |
public function forward( $p ) { |
$lon = $p->x; |
$lat = $p->y; |
$this->sin_phi = sin( $lat ); |
$this->cos_phi = cos( $lat ); |
$qs = Proj4php::$common->qsfnz( $this->e3, $this->sin_phi, $this->cos_phi ); |
$rh1 = $this->a * sqrt( $this->c - $this->ns0 * $qs ) / $this->ns0; |
$theta = $this->ns0 * Proj4php::$common->adjust_lon( $lon - $this->long0 ); |
$x = rh1 * sin( $theta ) + $this->x0; |
$y = $this->rh - $rh1 * cos( $theta ) + $this->y0; |
$p->x = $x; |
$p->y = $y; |
return $p; |
} |
/** |
* |
* @param Point $p |
* @return Point $p |
*/ |
public function inverse( $p ) { |
$p->x -= $this->x0; |
$p->y = $this->rh - $p->y + $this->y0; |
if( $this->ns0 >= 0 ) { |
$rh1 = sqrt( $p->x * $p->x + $p->y * $p->y ); |
$con = 1.0; |
} else { |
$rh1 = -sqrt( $p->x * $p->x + $p->y * $p->y ); |
$con = -1.0; |
} |
$theta = 0.0; |
if( $rh1 != 0.0 ) { |
$theta = 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) * log( (1.0 - $this->e3) / (1.0 + $this->e3) ) / $this->e3; |
if( abs( abs( $con ) - abs( $qs ) ) > .0000000001 ) { |
$lat = $this->phi1z( $this->e3, $qs ); |
} else { |
if( $qs >= 0 ) { |
$lat = .5 * Proj4php::$Common->PI; |
} else { |
$lat = -.5 * Proj4php::$Common->PI; |
} |
} |
} else { |
$lat = $this->phi1z( $this->e3, $qs ); |
} |
$lon = Proj4php::$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. |
* |
* @param type $eccent |
* @param type $qs |
* @return $phi or null on Convergence error |
*/ |
public function phi1z( $eccent, $qs ) { |
$phi = Proj4php::$common->asinz( .5 * $qs ); |
if( $eccent < Proj4php::$common->EPSLN ) |
return $phi; |
$eccnts = $eccent * $eccent; |
for( $i = 1; $i <= 25; ++$i ) { |
$sinphi = sin( $phi ); |
$cosphi = cos( $phi ); |
$con = $eccent * $sinphi; |
$com = 1.0 - $con * $con; |
$dphi = .5 * $com * $com / $cosphi * ($qs / (1.0 - $eccnts) - $sinphi / $com + .5 / $eccent * log( (1.0 - $con) / (1.0 + $con) )); |
$phi = $phi + $dphi; |
if( abs( $dphi ) <= 1e-7 ) |
return $phi; |
} |
Proj4php::reportError( "aea:phi1z:Convergence error" ); |
return null; |
} |
} |
Proj4php::$proj['aea'] = new Proj4phpProjAea(); |
/branches/v5.3-amandaie/scripts/modules/ifn/bibliotheque/proj4php/projCode/merc.php |
---|
New file |
0,0 → 1,129 |
<?php |
/** |
* Author : Julien Moquet |
* |
* Inspired by Proj4php from Mike Adair madairATdmsolutions.ca |
* and Richard Greenwood rich@greenwoodma$p->com |
* License: LGPL as per: http://www.gnu.org/copyleft/lesser.html |
*/ |
/* * ***************************************************************************** |
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 |
class Proj4phpProjMerc { |
public function init() { |
//?$this->temp = $this->r_minor / $this->r_major; |
//$this->temp = $this->b / $this->a; |
//$this->es = 1.0 - sqrt($this->temp); |
//$this->e = sqrt( $this->es ); |
//?$this->m1 = cos($this->lat_origin) / (sqrt( 1.0 - $this->es * sin($this->lat_origin) * sin($this->lat_origin))); |
//$this->m1 = cos(0.0) / (sqrt( 1.0 - $this->es * sin(0.0) * sin(0.0))); |
if( $this->lat_ts ) { |
if( $this->sphere ) { |
$this->k0 = cos( $this->lat_ts ); |
} else { |
$this->k0 = Proj4php::$common->msfnz( $this->es, sin( $this->lat_ts ), cos( $this->lat_ts ) ); |
} |
} |
} |
/* Mercator forward equations--mapping lat,long to x,y |
-------------------------------------------------- */ |
public function forward( $p ) { |
//alert("ll2m coords : ".coords); |
$lon = $p->x; |
$lat = $p->y; |
// convert to radians |
if( $lat * Proj4php::$common->R2D > 90.0 && |
$lat * Proj4php::$common->R2D < -90.0 && |
$lon * Proj4php::$common->R2D > 180.0 && |
$lon * Proj4php::$common->R2D < -180.0 ) { |
Proj4php::reportError( "merc:forward: llInputOutOfRange: " . $lon . " : " . $lat ); |
return null; |
} |
if( abs( abs( $lat ) - Proj4php::$common->HALF_PI ) <= Proj4php::$common->EPSLN ) { |
Proj4php::reportError( "merc:forward: ll2mAtPoles" ); |
return null; |
} else { |
if( $this->sphere ) { |
$x = $this->x0 + $this->a * $this->k0 * Proj4php::$common->adjust_lon( $lon - $this->long0 ); |
$y = $this->y0 + $this->a * $this->k0 * log( tan( Proj4php::$common->FORTPI + 0.5 * $lat ) ); |
} else { |
$sinphi = sin( lat ); |
$ts = Proj4php::$common . tsfnz( $this->e, $lat, $sinphi ); |
$x = $this->x0 + $this->a * $this->k0 * Proj4php::$common->adjust_lon( $lon - $this->long0 ); |
$y = $this->y0 - $this->a * $this->k0 * log( $ts ); |
} |
$p->x = $x; |
$p->y = $y; |
return $p; |
} |
} |
/* Mercator inverse equations--mapping x,y to lat/long |
-------------------------------------------------- */ |
public function inverse( $p ) { |
$x = $p->x - $this->x0; |
$y = $p->y - $this->y0; |
if( $this->sphere ) { |
$lat = Proj4php::$common->HALF_PI - 2.0 * atan( exp( -$y / $this->a * $this->k0 ) ); |
} else { |
$ts = exp( -$y / ($this->a * $this->k0) ); |
$lat = Proj4php::$common->phi2z( $this->e, $ts ); |
if( $lat == -9999 ) { |
Proj4php::reportError( "merc:inverse: lat = -9999" ); |
return null; |
} |
} |
$lon = Proj4php::$common->adjust_lon( $this->long0 + $x / ($this->a * $this->k0) ); |
$p->x = $lon; |
$p->y = $lat; |
return $p; |
} |
} |
Proj4php::$proj['merc'] = new Proj4phpProjMerc(); |
/branches/v5.3-amandaie/scripts/modules/ifn/bibliotheque/proj4php/projCode/somerc.php |
---|
New file |
0,0 → 1,135 |
<?php |
/** |
* Author : Julien Moquet |
* |
* Inspired by Proj4php from Mike Adair madairATdmsolutions.ca |
* and Richard Greenwood rich@greenwoodma$p->com |
* License: LGPL as per: http://www.gnu.org/copyleft/lesser.html |
*/ |
/******************************************************************************* |
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 |
*******************************************************************************/ |
class Proj4phpProjSomerc { |
/** |
* |
*/ |
public function init() { |
$phy0 = $this->lat0; |
$this->lambda0 = $this->long0; |
$sinPhy0 = sin( $phy0 ); |
$semiMajorAxis = $this->a; |
$invF = $this->rf; |
$flattening = 1 / $invF; |
$e2 = 2 * $flattening - pow( $flattening, 2 ); |
$e = $this->e = sqrt( $e2 ); |
$this->R = $this->k0 * $semiMajorAxis * sqrt( 1 - $e2 ) / (1 - $e2 * pow( $sinPhy0, 2.0 )); |
$this->alpha = sqrt( 1 + $e2 / (1 - $e2) * pow( cos( $phy0 ), 4.0 ) ); |
$this->b0 = asin( $sinPhy0 / $this->alpha ); |
$this->K = log( tan( $PI / 4.0 + $this->b0 / 2.0 ) ) |
- $this->alpha |
* log( tan( $PI / 4.0 + $phy0 / 2.0 ) ) |
+ $this->alpha |
* $e / 2 |
* log( (1 + $e * $sinPhy0) |
/ (1 - $e * $sinPhy0) ); |
} |
/** |
* |
* @param type $p |
* @return type |
*/ |
public function forward( $p ) { |
$Sa1 = log( tan( $PI / 4.0 - $p->y / 2.0 ) ); |
$Sa2 = $this->e / 2.0 |
* log( (1 + $this->e * sin( $p->y )) |
/ (1 - $this->e * sin( $p->y )) ); |
$S = -$this->alpha * ($Sa1 + $Sa2) + $this->K; |
// spheric latitude |
$b = 2.0 * (atan( exp( $S ) ) - proj4phpCommon::PI / 4.0); |
// spheric longitude |
$I = $this->alpha * ($p->x - $this->lambda0); |
// psoeudo equatorial rotation |
$rotI = atan( sin( $I ) |
/ (sin( $this->b0 ) * tan( $b ) + |
cos( $this->b0 ) * cos( $I )) ); |
$rotB = asin( cos( $this->b0 ) * sin( $b ) - |
sin( $this->b0 ) * cos( $b ) * cos( $I ) ); |
$p->y = $this->R / 2.0 |
* log( (1 + sin( $rotB )) / (1 - sin( $rotB )) ) |
+ $this->y0; |
$p->x = $this->R * $rotI + $this->x0; |
return $p; |
} |
/** |
* |
* @param type $p |
* @return type |
*/ |
public function inverse( $p ) { |
$Y = $p->x - $this->x0; |
$X = $p->y - $this->y0; |
$rotI = $Y / $this->R; |
$rotB = 2 * (atan( exp( $X / $this->R ) ) - $PI / 4.0); |
$b = asin( cos( $this->b0 ) * sin( $rotB ) |
+ sin( $this->b0 ) * cos( $rotB ) * cos( $rotI ) ); |
$I = atan( sin( $rotI ) |
/ (cos( $this->b0 ) * cos( $rotI ) - sin( $this->b0 ) |
* tan( $rotB )) ); |
$lambda = $this->lambda0 + $I / $this->alpha; |
$S = 0.0; |
$phy = $b; |
$prevPhy = -1000.0; |
$iteration = 0; |
while( abs( $phy - $prevPhy ) > 0.0000001 ) { |
if( ++$iteration > 20 ) { |
Proj4php::reportError( "omercFwdInfinity" ); |
return; |
} |
//S = log(tan(PI / 4.0 + phy / 2.0)); |
$S = 1.0 |
/ $this->alpha |
* (log( tan( $PI / 4.0 + $b / 2.0 ) ) - $this->K) |
+ $this->e |
* log( tan( $PI / 4.0 |
+ asin( $this->e * sin( $phy ) ) |
/ 2.0 ) ); |
$prevPhy = $phy; |
$phy = 2.0 * atan( exp( $S ) ) - $PI / 2.0; |
} |
$p->x = $lambda; |
$p->y = $phy; |
return $p; |
} |
} |
Proj4php::$proj['somerc'] = new Proj4phpProjSomerc(); |
/branches/v5.3-amandaie/scripts/modules/ifn/bibliotheque/proj4php/projCode/cea.php |
---|
New file |
0,0 → 1,97 |
<?php |
/******************************************************************************* |
NAME LAMBERT CYLINDRICAL EQUAL AREA |
PURPOSE: Transforms input longitude and latitude to Easting and |
Northing for the Lambert Cylindrical Equal Area projection. |
This class of projection includes the Behrmann and |
Gall-Peters Projections. The |
longitude and latitude must be in radians. The Easting |
and Northing values will be returned in meters. |
PROGRAMMER DATE |
---------- ---- |
R. Marsden August 2009 |
Winwaed Software Tech LLC, http://www.winwaed.com |
This function was adapted from the Miller Cylindrical Projection in the Proj4php |
library. |
Note: This implementation assumes a Spherical Earth. The (commented) code |
has been included for the ellipsoidal forward transform, but derivation of |
the ellispoidal inverse transform is beyond me. Note that most of the |
Proj4php implementations do NOT currently support ellipsoidal figures. |
Therefore this is not seen as a problem - especially this lack of support |
is explicitly stated here. |
ALGORITHM REFERENCES |
1. "Cartographic Projection Procedures for the UNIX Environment - |
A User's Manual" by Gerald I. Evenden, USGS Open File Report 90-284 |
and Release 4 Interim Reports (2003) |
2. Snyder, John P., "Flattening the Earth - Two Thousand Years of Map |
Projections", Univ. Chicago Press, 1993 |
****************************************************************************** */ |
/** |
* Author : Julien Moquet |
* |
* Inspired by Proj4php from Mike Adair madairATdmsolutions.ca |
* and Richard Greenwood rich@greenwoodma$p->com |
* License: LGPL as per: http://www.gnu.org/copyleft/lesser.html |
*/ |
class Proj4phpProjCea { |
/* Initialize the Cylindrical Equal Area projection |
------------------------------------------- */ |
public function init() { |
//no-op |
} |
/* Cylindrical Equal Area forward equations--mapping lat,long to x,y |
------------------------------------------------------------ */ |
public function forward( $p ) { |
$lon = $p->x; |
$lat = $p->y; |
/* Forward equations |
----------------- */ |
$dlon = Proj4php::$common->adjust_lon( $lon - $this->long0 ); |
$x = $this->x0 + $this->a * $dlon * cos( $this->lat_ts ); |
$y = $this->y0 + $this->a * sin( $lat ) / cos( $this->lat_ts ); |
/* Elliptical Forward Transform |
Not implemented due to a lack of a matchign inverse function |
{ |
$Sin_Lat = sin(lat); |
$Rn = $this->a * (sqrt(1.0e0 - $this->es * Sin_Lat * Sin_Lat )); |
x = $this->x0 + $this->a * dlon * cos($this->lat_ts); |
y = $this->y0 + Rn * sin(lat) / cos($this->lat_ts); |
} |
*/ |
$p->x = $x; |
$p->y = $y; |
return $p; |
} |
/** |
* Cylindrical Equal Area inverse equations--mapping x,y to lat/long |
* |
* @param type $p |
* @return type |
*/ |
public function inverse( $p ) { |
$p->x -= $this->x0; |
$p->y -= $this->y0; |
$p->x = Proj4php::$common->adjust_lon( $this->long0 + ($p->x / $this->a) / cos( $this->lat_ts ) ); |
$p->y = asin( ($p->y / $this->a) * cos( $this->lat_ts ) ); |
return $p; |
} |
} |
Proj4php::$proj['cea'] = new Proj4phpProjCea(); |
/branches/v5.3-amandaie/scripts/modules/ifn/bibliotheque/proj4php/projCode/cass.php |
---|
New file |
0,0 → 1,118 |
<?php |
/******************************************************************************* |
NAME CASSINI |
PURPOSE: Transforms input longitude and latitude to Easting and |
Northing for the Cassini projection. The |
longitude and latitude must be in radians. The Easting |
and Northing values will be returned in meters. |
Ported from PROJ.4. |
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 |
****************************************************************************** */ |
/** |
* Author : Julien Moquet |
* |
* Inspired by Proj4php from Mike Adair madairATdmsolutions.ca |
* and Richard Greenwood rich@greenwoodma$p->com |
* License: LGPL as per: http://www.gnu.org/copyleft/lesser.html |
*/ |
//Proj4php.defs["EPSG:28191"] = "+proj=cass +lat_0=31.73409694444445 +lon_0=35.21208055555556 +x_0=170251.555 +y_0=126867.909 +a=6378300.789 +b=6356566.435 +towgs84=-275.722,94.7824,340.894,-8.001,-4.42,-11.821,1 +units=m +no_defs"; |
// Initialize the Cassini projection |
// ----------------------------------------------------------------- |
class Proj4phpProjCass { |
public function init() { |
if( !$this->sphere ) { |
$this->en = Proj4php::$common->pj_enfn( $this->es ); |
$this->m0 = Proj4php::$common->pj_mlfn( $this->lat0, sin( $this->lat0 ), cos( $this->lat0 ), $this->en ); |
} |
} |
protected $C1 = .16666666666666666666; |
protected $C2 = .00833333333333333333; |
protected $C3 = .04166666666666666666; |
protected $C4 = .33333333333333333333; |
protected $C5 = .06666666666666666666; |
/* Cassini forward equations--mapping lat,long to x,y |
----------------------------------------------------------------------- */ |
public function forward( $p ) { |
/* Forward equations |
----------------- */ |
#$x; |
#$y; |
$lam = $p->x; |
$phi = $p->y; |
$lam = Proj4php::$common->adjust_lon( $lam - $this->long0 ); |
if( $this->sphere ) { |
$x = asin( cos( $phi ) * sin( $lam ) ); |
$y = atan2( tan( $phi ), cos( $lam ) ) - $this->phi0; |
} else { |
//ellipsoid |
$this->n = sin( $phi ); |
$this->c = cos( $phi ); |
$y = $this->pj_mlfn( $phi, $this->n, $this->c, $this->en ); |
$this->n = 1. / sqrt( 1. - $this->es * $this->n * $this->n ); |
$this->tn = tan( $phi ); |
$this->t = $this->tn * $this->tn; |
$this->a1 = $lam * $this->c; |
$this->c *= $this->es * $this->c / (1 - $this->es); |
$this->a2 = $this->a1 * $this->a1; |
$x = $this->n * $this->a1 * (1. - $this->a2 * $this->t * ($this->C1 - (8. - $this->t + 8. * $this->c) * $this->a2 * $this->C2)); |
$y -= $this->m0 - $this->n * $this->tn * $this->a2 * (.5 + (5. - $this->t + 6. * $this->c) * $this->a2 * $this->C3); |
} |
$p->x = $this->a * $x + $this->x0; |
$p->y = $this->a * $y + $this->y0; |
return $p; |
} |
/* Inverse equations |
----------------- */ |
public function inverse( $p ) { |
$p->x -= $this->x0; |
$p->y -= $this->y0; |
$x = $p->x / $this->a; |
$y = $p->y / $this->a; |
if( $this->sphere ) { |
$this->dd = $y + $this->lat0; |
$phi = asin( sin( $this->dd ) * cos( $x ) ); |
$lam = atan2( tan( $x ), cos( $this->dd ) ); |
} else { |
/* ellipsoid */ |
$ph1 = Proj4php::$common->pj_inv_mlfn( $this->m0 + $y, $this->es, $this->en ); |
$this->tn = tan( $ph1 ); |
$this->t = $this->tn * $this->tn; |
$this->n = sin( $ph1 ); |
$this->r = 1. / (1. - $this->es * $this->n * $this->n); |
$this->n = sqrt( $this->r ); |
$this->r *= (1. - $this->es) * $this->n; |
$this->dd = $x / $this->n; |
$this->d2 = $this->dd * $this->dd; |
$phi = $ph1 - ($this->n * $this->tn / $this->r) * $this->d2 * (.5 - (1. + 3. * $this->t) * $this->d2 * $this->C3); |
$lam = $this->dd * (1. + $this->t * $this->d2 * (-$this->C4 + (1. + 3. * $this->t) * $this->d2 * $this->C5)) / cos( $ph1 ); |
} |
$p->x = Proj4php::$common->adjust_lon( $this->long0 + $lam ); |
$p->y = $phi; |
return $p; |
} |
} |
Proj4php::$proj['cass'] = new Proj4phpProjCass(); |
/branches/v5.3-amandaie/scripts/modules/ifn/bibliotheque/proj4php/projCode/ortho.php |
---|
New file |
0,0 → 1,139 |
<?php |
/** |
* Author : Julien Moquet |
* |
* Inspired by Proj4php from Mike Adair madairATdmsolutions.ca |
* and Richard Greenwood rich@greenwoodma$p->com |
* License: LGPL as per: http://www.gnu.org/copyleft/lesser.html |
*/ |
/* * ***************************************************************************** |
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. |
* ***************************************************************************** */ |
class Proj4phpProjOrtho { |
/* Initialize the Orthographic projection |
------------------------------------- */ |
public function init( $def ) { |
//double temp; /* temporary variable */ |
/* Place parameters in static storage for common use |
------------------------------------------------- */; |
$this->sin_p14 = sin( $this->lat0 ); |
$this->cos_p14 = cos( $this->lat0 ); |
} |
/* Orthographic forward equations--mapping lat,long to x,y |
--------------------------------------------------- */ |
public function forward( $p ) { |
/* |
$sinphi; |
$cosphi; // sin and cos value |
$dlon; // delta longitude value |
$coslon; // cos of longitude |
$ksp; // scale factor |
$g; |
*/ |
$lon = $p->x; |
$lat = $p->y; |
/* Forward equations |
----------------- */ |
$dlon = Proj4php::$common->adjust_lon( $lon - $this->long0 ); |
$sinphi = sin( $lat ); |
$cosphi = cos( $lat ); |
$coslon = cos( $dlon ); |
$g = $this->sin_p14 * sinphi + $this->cos_p14 * $cosphi * $coslon; |
$ksp = 1.0; |
if( ($g > 0) || (abs( $g ) <= Proj4php::$common->EPSLN) ) { |
$x = $this->a * $ksp * $cosphi * sin( $dlon ); |
$y = $this->y0 + $this->a * $ksp * ($this->cos_p14 * $sinphi - $this->sin_p14 * $cosphi * $coslon); |
} else { |
Proj4php::reportError( "orthoFwdPointError" ); |
} |
$p->x = $x; |
$p->y = $y; |
return $p; |
} |
/** |
* |
* @param type $p |
* @return type |
*/ |
public function inverse( $p ) { |
/* |
$rh; // height above ellipsoid |
$z; // angle |
$sinz; |
$cosz; // sin of z and cos of z |
$temp; |
$con; |
$lon; |
$lat; |
*/ |
/* Inverse equations |
----------------- */ |
$p->x -= $this->x0; |
$p->y -= $this->y0; |
$rh = sqrt( $p->x * $p->x + $p->y * $p->y ); |
if( $rh > $this->a + .0000001 ) { |
Proj4php::reportError( "orthoInvDataError" ); |
} |
$z = Proj4php::$common . asinz( $rh / $this->a ); |
$sinz = sin( $z ); |
$cosz = cos( $z ); |
$lon = $this->long0; |
if( abs( $rh ) <= Proj4php::$common->EPSLN ) { |
$lat = $this->lat0; |
} |
$lat = Proj4php::$common . asinz( $cosz * $this->sin_p14 + ($p->y * $sinz * $this->cos_p14) / $rh ); |
$con = abs( $this->lat0 ) - Proj4php::$common->HALF_PI; |
if( abs( con ) <= Proj4php::$common->EPSLN ) { |
if( $this->lat0 >= 0 ) { |
$lon = Proj4php::$common->adjust_lon( $this->long0 + atan2( $p->x, -$p->y ) ); |
} else { |
$lon = Proj4php::$common->adjust_lon( $this->long0 - atan2( -$p->x, $p->y ) ); |
} |
} |
$con = $cosz - $this->sin_p14 * sin( $lat ); |
$p->x = $lon; |
$p->y = $lat; |
return $p; |
} |
} |
Proj4php::$proj['ortho'] = new Proj4phpProjOrtho(); |
/branches/v5.3-amandaie/scripts/modules/ifn/bibliotheque/proj4php/projCode/krovak.php |
---|
New file |
0,0 → 1,156 |
<?php |
/** |
NOTES: According to EPSG the full Krovak projection method should have |
the following parameters. Within PROJ.4 the azimuth, and pseudo |
standard parallel are hardcoded in the algorithm and can't be |
altered from outside. The others all have defaults to match the |
common usage with Krovak projection. |
lat_0 = latitude of centre of the projection |
lon_0 = longitude of centre of the projection |
* * = azimuth (true) of the centre line passing through the centre of the projection |
* * = latitude of pseudo standard parallel |
k = scale factor on the pseudo standard parallel |
x_0 = False Easting of the centre of the projection at the apex of the cone |
y_0 = False Northing of the centre of the projection at the apex of the cone |
**/ |
class Proj4phpProjKrovak { |
/** |
* |
*/ |
public function init() { |
/* we want Bessel as fixed ellipsoid */ |
$this->a = 6377397.155; |
$this->es = 0.006674372230614; |
$this->e = sqrt( $this->es ); |
/* if latitude of projection center is not set, use 49d30'N */ |
if( !$this->lat0 ) { |
$this->lat0 = 0.863937979737193; |
} |
if( !$this->long0 ) { |
$this->long0 = 0.7417649320975901 - 0.308341501185665; |
} |
/* if scale not set default to 0.9999 */ |
if( !$this->k0 ) { |
$this->k0 = 0.9999; |
} |
$this->s45 = 0.785398163397448; /* 45° */ |
$this->s90 = 2 * $this->s45; |
$this->fi0 = $this->lat0; /* Latitude of projection centre 49° 30' */ |
/* Ellipsoid Bessel 1841 a = 6377397.155m 1/f = 299.1528128, |
e2=0.006674372230614; |
*/ |
$this->e2 = $this->es; /* 0.006674372230614; */ |
$this->e = sqrt( $this->e2 ); |
$this->alfa = sqrt( 1. + ($this->e2 * pow( cos( $this->fi0 ), 4 )) / (1. - $this->e2) ); |
$this->uq = 1.04216856380474; /* DU(2, 59, 42, 42.69689) */ |
$this->u0 = asin( sin( $this->fi0 ) / $this->alfa ); |
$this->g = pow( (1. + $this->e * sin( $this->fi0 )) / (1. - $this->e * sin( $this->fi0 )), $this->alfa * $this->e / 2. ); |
$this->k = tan( $this->u0 / 2. + $this->s45 ) / pow( tan( $this->fi0 / 2. + $this->s45 ), $this->alfa ) * $this->g; |
$this->k1 = $this->k0; |
$this->n0 = $this->a * sqrt( 1. - $this->e2 ) / (1. - $this->e2 * pow( sin( $this->fi0 ), 2 )); |
$this->s0 = 1.37008346281555; /* Latitude of pseudo standard parallel 78° 30'00" N */ |
$this->n = sin( $this->s0 ); |
$this->ro0 = $this->k1 * $this->n0 / tan( $this->s0 ); |
$this->ad = $this->s90 - $this->uq; |
} |
/** |
* ellipsoid |
* calculate xy from lat/lon |
* Constants, identical to inverse transform function |
* |
* @param type $p |
* @return type |
*/ |
public function forward( $p ) { |
$lon = $p->x; |
$lat = $p->y; |
$delta_lon = Proj4php::$common->adjust_lon( $lon - $this->long0 ); // Delta longitude |
/* Transformation */ |
$gfi = pow( ((1. + $this->e * sin( $lat )) / (1. - $this->e * sin( $lat )) ), ($this->alfa * $this->e / 2. ) ); |
$u = 2. * (atan( $this->k * pow( tan( $lat / 2. + $this->s45 ), $this->alfa ) / $gfi ) - $this->s45); |
$deltav = - $delta_lon * $this->alfa; |
$s = asin( cos( $this->ad ) * sin( $u ) + sin( $this->ad ) * cos( $u ) * cos( $deltav ) ); |
$d = asin( cos( $u ) * sin( $deltav ) / cos( $s ) ); |
$eps = $this->n * $d; |
$ro = $this->ro0 * pow( tan( $this->s0 / 2. + $this->s45 ), $this->n ) / pow( tan( $s / 2. + $this->s45 ), $this->n ); |
/* x and y are reverted! */ |
//$p->y = ro * cos(eps) / a; |
//$p->x = ro * sin(eps) / a; |
$p->y = $ro * cos( $eps ) / 1.0; |
$p->x = $ro * sin( $eps ) / 1.0; |
if( $this->czech ) { |
$p->y *= -1.0; |
$p->x *= -1.0; |
} |
return $p; |
} |
/** |
* calculate lat/lon from xy |
* |
* @param Point $p |
* @return Point $p |
*/ |
public function inverse( $p ) { |
/* Transformation */ |
/* revert y, x */ |
$tmp = $p->x; |
$p->x = $p->y; |
$p->y = $tmp; |
if( $this->czech ) { |
$p->y *= -1.0; |
$p->x *= -1.0; |
} |
$ro = sqrt( $p->x * $p->x + $p->y * $p->y ); |
$eps = atan2( $p->y, $p->x ); |
$d = $eps / sin( $this->s0 ); |
$s = 2. * (atan( pow( $this->ro0 / $ro, 1. / $this->n ) * tan( $this->s0 / 2. + $this->s45 ) ) - $this->s45); |
$u = asin( cos( $this->ad ) * sin( s ) - sin( $this->ad ) * cos( s ) * cos( d ) ); |
$deltav = asin( cos( $s ) * sin( $d ) / cos( $u ) ); |
$p->x = $this->long0 - $deltav / $this->alfa; |
/* ITERATION FOR $lat */ |
$fi1 = $u; |
$ok = 0; |
$iter = 0; |
do { |
$p->y = 2. * ( atan( pow( $this->k, -1. / $this->alfa ) * |
pow( tan( $u / 2. + $this->s45 ), 1. / $this->alfa ) * |
pow( (1. + $this->e * sin( $fi1 )) / (1. - $this->e * sin( $fi1 )), $this->e / 2. ) |
) - $this->s45); |
if( abs( $fi1 - $p->y ) < 0.0000000001 ) |
$ok = 1; |
$fi1 = $p->y; |
$iter += 1; |
} while( $ok == 0 && $iter < 15 ); |
if( $iter >= 15 ) { |
Proj4php::reportError( "PHI3Z-CONV:Latitude failed to converge after 15 iterations" ); |
//console.log('iter:', iter); |
return null; |
} |
return $p; |
} |
} |
Proj4php::$proj['krovak'] = new Proj4phpProjKrovak(); |
/branches/v5.3-amandaie/scripts/modules/ifn/bibliotheque/proj4php/projCode/mill.php |
---|
New file |
0,0 → 1,82 |
<?php |
/** |
* Author : Julien Moquet |
* |
* Inspired by Proj4php from Mike Adair madairATdmsolutions.ca |
* and Richard Greenwood rich@greenwoodma$p->com |
* License: LGPL as per: http://www.gnu.org/copyleft/lesser.html |
*/ |
/******************************************************************************* |
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. |
* ***************************************************************************** */ |
class Proj4phpProjMill { |
/* Initialize the Miller Cylindrical projection |
------------------------------------------- */ |
public function init() { |
//no-op |
} |
/* Miller Cylindrical forward equations--mapping lat,long to x,y |
------------------------------------------------------------ */ |
public function forward( $p ) { |
$lon = $p->x; |
$lat = $p->y; |
/* Forward equations |
----------------- */ |
$dlon = Proj4php::$common->adjust_lon( $lon - $this->long0 ); |
$x = $this->x0 + $this->a * $dlon; |
$y = $this->y0 + $this->a * log( tan( (Proj4php::$common->PI / 4.0) + ($lat / 2.5) ) ) * 1.25; |
$p->x = $x; |
$p->y = $y; |
return $p; |
} |
/* Miller Cylindrical inverse equations--mapping x,y to lat/long |
------------------------------------------------------------ */ |
public function inverse( $p ) { |
$p->x -= $this->x0; |
$p->y -= $this->y0; |
$lon = Proj4php::$common->adjust_lon( $this->long0 + $p->x / $this->a ); |
$lat = 2.5 * (atan( exp( 0.8 * $p->y / $this->a ) ) - Proj4php::$common->PI / 4.0); |
$p->x = $lon; |
$p->y = $lat; |
return $p; |
} |
} |
Proj4php::$proj['mill'] = new Proj4phpProjMill(); |
/branches/v5.3-amandaie/scripts/modules/ifn/bibliotheque/proj4php/projCode/vandg.php |
---|
New file |
0,0 → 1,167 |
<?php |
/** |
* Author : Julien Moquet |
* |
* Inspired by Proj4php from Mike Adair madairATdmsolutions.ca |
* and Richard Greenwood rich@greenwoodma$p->com |
* License: LGPL as per: http://www.gnu.org/copyleft/lesser.html |
*/ |
/******************************************************************************* |
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. |
* ***************************************************************************** */ |
class Proj4phpProjVandg { |
/* Initialize the Van Der Grinten projection |
---------------------------------------- */ |
public function init() { |
$this->R = 6370997.0; //Radius of earth |
} |
/** |
* |
* @param type $p |
* @return type |
*/ |
public function forward( $p ) { |
$lon = $p->x; |
$lat = $p->y; |
/* Forward equations |
----------------- */ |
$dlon = Proj4php::$common->adjust_lon( $lon - $this->long0 ); |
$x; |
$y; |
if( abs( $lat ) <= Proj4php::$common->EPSLN ) { |
$x = $this->x0 + $this->R * $dlon; |
$y = $this->y0; |
} |
$theta = Proj4php::$common . asinz( 2.0 * abs( $lat / Proj4php::$common->PI ) ); |
if( (abs( $dlon ) <= Proj4php::$common->EPSLN) || (abs( abs( $lat ) - Proj4php::$common->HALF_PI ) <= Proj4php::$common->EPSLN) ) { |
$x = $this->x0; |
if( $lat >= 0 ) { |
$y = $this->y0 + Proj4php::$common->PI * $this->R * tan( .5 * $theta ); |
} else { |
$y = $this->y0 + Proj4php::$common->PI * $this->R * - tan( .5 * $theta ); |
} |
// return(OK); |
} |
$al = .5 * abs( (Proj4php::$common->PI / $dlon) - ($dlon / Proj4php::$common->PI) ); |
$asq = $al * $al; |
$sinth = sin( $theta ); |
$costh = cos( $theta ); |
$g = $costh / ($sinth + $costh - 1.0); |
$gsq = $g * $g; |
$m = $g * (2.0 / $sinth - 1.0); |
$msq = $m * $m; |
$con = Proj4php::$common->PI * $this->R * ($al * ($g - $msq) + sqrt( $asq * ($g - $sq) * ($g - $msq) - ($msq + $asq) * ($gsq - $msq) )) / ($msq + $asq); |
if( $dlon < 0 ) { |
$con = -$con; |
} |
$x = $this->x0 + $con; |
$con = abs( $con / (Proj4php::$common->PI * $this->R) ); |
if( $lat >= 0 ) { |
$y = $this->y0 + Proj4php::$common->PI * $this->R * sqrt( 1.0 - $con * $con - 2.0 * $al * $con ); |
} else { |
$y = $this->y0 - Proj4php::$common->PI * $this->R * 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 |
--------------------------------------------------------- */ |
public function inverse( $p ) { |
/* |
$dlon; |
$xx; |
$yy; |
$xys; |
$c1; |
$c2; |
$c3; |
$al; |
$asq; |
$a1; |
$m1; |
$con; |
$th1; |
$d; |
*/ |
/* inverse equations |
----------------- */ |
$p->x -= $this->x0; |
$p->y -= $this->y0; |
$con = Proj4php::$common->PI * $this->R; |
$xx = $p->x / $con; |
$yy = $p->y / $con; |
$xys = $xx * $xx + $yy * $yy; |
$c1 = -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 * sqrt( -$a1 / 3.0 ); |
$con = ((3.0 * $d) / $a1) / $m1; |
if( abs( $con ) > 1.0 ) { |
if( $con >= 0.0 ) { |
$con = 1.0; |
} else { |
$con = -1.0; |
} |
} |
$th1 = acos( $con ) / 3.0; |
if( $p->$y >= 0 ) { |
$lat = (-$m1 * cos( $th1 + Proj4php::$common->PI / 3.0 ) - $c2 / 3.0 / $c3) * Proj4php::$common->PI; |
} else { |
$lat = -(-m1 * cos( $th1 + Proj4php::$common->PI / 3.0 ) - $c2 / 3.0 / $c3) * Proj4php::$common->PI; |
} |
if( abs( $xx ) < Proj4php::$common->EPSLN ) { |
$lon = $this->$long0; |
} |
$lon = Proj4php::$common->adjust_lon( $this->long0 + Proj4php::$common->PI * ($xys - 1.0 + sqrt( 1.0 + 2.0 * ($xx * $xx - $yy * $yy) + $xys * $xys )) / 2.0 / $xx ); |
$p->x = $lon; |
$p->y = $lat; |
return $p; |
} |
} |
Proj4php::$proj['vandg'] = new Proj4phpProjVandg(); |
/branches/v5.3-amandaie/scripts/modules/ifn/bibliotheque/proj4php/projCode/gnom.php |
---|
New file |
0,0 → 1,145 |
<?php |
/** |
* Author : Julien Moquet |
* |
* Inspired by Proj4php from Mike Adair madairATdmsolutions.ca |
* and Richard Greenwood rich@greenwoodma$p->com |
* License: LGPL as per: http://www.gnu.org/copyleft/lesser.html |
*/ |
/***************************************************************************** |
NAME GNOMONIC |
PURPOSE: Transforms input longitude and latitude to Easting and |
Northing for the Gnomonic Projection. |
Implementation based on the existing sterea and ortho |
implementations. |
PROGRAMMER DATE |
---------- ---- |
Richard Marsden November 2009 |
ALGORITHM REFERENCES |
1. Snyder, John P., "Flattening the Earth - Two Thousand Years of Map |
Projections", University of Chicago Press 1993 |
2. Wolfram Mathworld "Gnomonic Projection" |
http://mathworld.wolfram.com/GnomonicProjection.html |
Accessed: 12th November 2009 |
******************************************************************************/ |
class Proj4phpProjGnom { |
/** |
* Initialize the Gnomonic projection |
* |
* @todo $def not used in context...? |
* @param type $def |
*/ |
public function init( $def ) { |
/* Place parameters in static storage for common use |
------------------------------------------------- */ |
$this->sin_p14 = sin( $this->lat0 ); |
$this->cos_p14 = cos( $this->lat0 ); |
// Approximation for projecting points to the horizon (infinity) |
$this->infinity_dist = 1000 * $this->a; |
$this->rc = 1; |
} |
/* Gnomonic forward equations--mapping lat,long to x,y |
--------------------------------------------------- */ |
public function forward( $p ) { |
/* |
$sinphi; |
$cosphi; // sin and cos value |
$dlon; // delta longitude value |
$coslon; // cos of longitude |
$ksp; // scale factor |
$g; |
*/ |
$lon = $p->x; |
$lat = $p->y; |
/* Forward equations |
----------------- */ |
$dlon = Proj4php::$common->adjust_lon( $lon - $this->long0 ); |
$sinphi = sin( $lat ); |
$cosphi = cos( $lat ); |
$coslon = cos( $dlon ); |
$g = $this->sin_p14 * $sinphi + $this->cos_p14 * $cosphi * $coslon; |
$ksp = 1.0; |
if( (g > 0) || (abs( g ) <= Proj4php::$common->EPSLN) ) { |
$x = $this->x0 + $this->a * $ksp * $cosphi * sin( $dlon ) / $g; |
$y = $this->y0 + $this->a * $ksp * ($this->cos_p14 * $sinphi - $this->sin_p14 * $cosphi * $coslon) / $g; |
} else { |
Proj4php::reportError( "orthoFwdPointError" ); |
// Point is in the opposing hemisphere and is unprojectable |
// We still need to return a reasonable point, so we project |
// to infinity, on a bearing |
// equivalent to the northern hemisphere equivalent |
// This is a reasonable approximation for short shapes and lines that |
// straddle the horizon. |
$x = $this->x0 + $this->infinity_dist * $cosphi * sin( $dlon ); |
$y = $this->y0 + $this->infinity_dist * ($this->cos_p14 * $sinphi - $this->sin_p14 * $cosphi * $coslon); |
} |
$p->x = $x; |
$p->y = $y; |
return $p; |
} |
/** |
* |
* @param type $p |
* @return type |
*/ |
public function inverse( $p ) { |
/* |
$rh; // Rho |
$z; // angle |
$sinc; |
$cosc; |
$c; |
$lon; |
$lat; |
*/ |
/* Inverse equations |
----------------- */ |
$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( ($rh = sqrt( $p->x * $p->x + $p->y * $p->y ) ) ) { |
$c = atan2( $rh, $this->rc ); |
$sinc = sin( $c ); |
$cosc = cos( $c ); |
$lat = Proj4php::$common->asinz( $cosc * $this->sin_p14 + ($p->y * $sinc * $this->cos_p14) / $rh ); |
$lon = atan2( $p->x * sinc, rh * $this->cos_p14 * $cosc - $p->y * $this->sin_p14 * $sinc ); |
$lon = Proj4php::$common->adjust_lon( $this->long0 + $lon ); |
} else { |
$lat = $this->phic0; |
$lon = 0.0; |
} |
$p->x = $lon; |
$p->y = $lat; |
return $p; |
} |
} |
Proj4php::$proj['gnom'] = new Proj4phpProjGnom(); |
/branches/v5.3-amandaie/scripts/modules/ifn/bibliotheque/proj4php/projCode/lcc.php |
---|
New file |
0,0 → 1,166 |
<?php |
/** |
* Author : Julien Moquet |
* |
* Inspired by Proj4php from Mike Adair madairATdmsolutions.ca |
* and Richard Greenwood rich@greenwoodma$p->com |
* License: LGPL as per: http://www.gnu.org/copyleft/lesser.html |
*/ |
/******************************************************************************* |
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 |
// ----------------------------------------------------------------- |
//class Proj4phpProjlcc = Class.create(); |
class Proj4phpProjLcc { |
public function init() { |
// 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 lat2 is not defined |
if( !isset($this->lat2) ) { |
$this->lat2 = $this->lat0; |
} |
//if k0 is not defined |
if( !isset($this->k0) ) |
$this->k0 = 1.0; |
// Standard Parallels cannot be equal and on opposite sides of the equator |
if( abs( $this->lat1 + $this->lat2 ) < Proj4php::$common->EPSLN ) { |
Proj4php::reportError( "lcc:init: Equal Latitudes" ); |
return; |
} |
$temp = $this->b / $this->a; |
$this->e = sqrt( 1.0 - $temp * $temp ); |
$sin1 = sin( $this->lat1 ); |
$cos1 = cos( $this->lat1 ); |
$ms1 = Proj4php::$common->msfnz( $this->e, $sin1, $cos1 ); |
$ts1 = Proj4php::$common->tsfnz( $this->e, $this->lat1, $sin1 ); |
$sin2 = sin( $this->lat2 ); |
$cos2 = cos( $this->lat2 ); |
$ms2 = Proj4php::$common->msfnz( $this->e, $sin2, $cos2 ); |
$ts2 = Proj4php::$common->tsfnz( $this->e, $this->lat2, $sin2 ); |
$ts0 = Proj4php::$common->tsfnz( $this->e, $this->lat0, sin( $this->lat0 ) ); |
if( abs( $this->lat1 - $this->lat2 ) > Proj4php::$common->EPSLN ) { |
$this->ns = log( $ms1 / $ms2 ) / log( $ts1 / $ts2 ); |
} else { |
$this->ns = $sin1; |
} |
$this->f0 = $ms1 / ($this->ns * pow( $ts1, $this->ns )); |
$this->rh = $this->a * $this->f0 * pow( $ts0, $this->ns ); |
if( !isset($this->title) ) |
$this->title = "Lambert Conformal Conic"; |
} |
// Lambert Conformal conic forward equations--mapping lat,long to x,y |
// ----------------------------------------------------------------- |
public function forward( $p ) { |
$lon = $p->x; |
$lat = $p->y; |
// convert to radians |
if( $lat <= 90.0 && $lat >= -90.0 && $lon <= 180.0 && $lon >= -180.0 ) { |
//lon = lon * Proj4php::$common.D2R; |
//lat = lat * Proj4php::$common.D2R; |
} else { |
Proj4php::reportError( "lcc:forward: llInputOutOfRange: " . $lon . " : " . $lat ); |
return null; |
} |
$con = abs( abs( $lat ) - Proj4php::$common->HALF_PI ); |
if( $con > Proj4php::$common->EPSLN ) { |
$ts = Proj4php::$common->tsfnz( $this->e, $lat, sin( $lat ) ); |
$rh1 = $this->a * $this->f0 * pow( $ts, $this->ns ); |
} else { |
$con = $lat * $this->ns; |
if( $con <= 0 ) { |
Proj4php::reportError( "lcc:forward: No Projection" ); |
return null; |
} |
$rh1 = 0; |
} |
$theta = $this->ns * Proj4php::$common->adjust_lon( $lon - $this->long0 ); |
$p->x = $this->k0 * ($rh1 * sin( $theta )) + $this->x0; |
$p->y = $this->k0 * ($this->rh - $rh1 * cos( $theta )) + $this->y0; |
return $p; |
} |
/** |
* Lambert Conformal Conic inverse equations--mapping x,y to lat/long |
* |
* @param type $p |
* @return null |
*/ |
public function inverse( $p ) { |
$x = ($p->x - $this->x0) / $this->k0; |
$y = ($this->rh - ($p->y - $this->y0) / $this->k0); |
if( $this->ns > 0 ) { |
$rh1 = sqrt( $x * $x + $y * $y ); |
$con = 1.0; |
} else { |
$rh1 = -sqrt( $x * $x + $y * $y ); |
$con = -1.0; |
} |
$theta = 0.0; |
if( $rh1 != 0 ) { |
$theta = atan2( ($con * $x ), ($con * $y ) ); |
} |
if( ($rh1 != 0) || ($this->ns > 0.0) ) { |
$con = 1.0 / $this->ns; |
$ts = pow( ($rh1 / ($this->a * $this->f0) ), $con ); |
$lat = Proj4php::$common->phi2z( $this->e, $ts ); |
if( $lat == -9999 ) |
return null; |
} else { |
$lat = -Proj4php::$common->HALF_PI; |
} |
$lon = Proj4php::$common->adjust_lon( $theta / $this->ns + $this->long0 ); |
$p->x = $lon; |
$p->y = $lat; |
return $p; |
} |
} |
Proj4php::$proj['lcc'] = new Proj4phpProjLcc(); |
/branches/v5.3-amandaie/scripts/modules/ifn/bibliotheque/proj4php/projCode/laea.php |
---|
New file |
0,0 → 1,398 |
<?php |
/** |
* Author : Julien Moquet |
* |
* Inspired by Proj4php from Mike Adair madairATdmsolutions.ca |
* and Richard Greenwood rich@greenwoodma$p->com |
* License: LGPL as per: http://www.gnu.org/copyleft/lesser.html |
*/ |
/* * ***************************************************************************** |
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. |
* ***************************************************************************** */ |
class Proj4phpProjLaea { |
protected $S_POLE = 1; |
protected $N_POLE = 2; |
protected $EQUIT = 3; |
protected $OBLIQ = 4; |
protected $P00 = .33333333333333333333; |
protected $P01 = .17222222222222222222; |
protected $P02 = .10257936507936507936; |
protected $P10 = .06388888888888888888; |
protected $P11 = .06640211640211640211; |
protected $P20 = .01641501294219154443; |
/* Initialize the Lambert Azimuthal Equal Area projection |
------------------------------------------------------ */ |
public function init() { |
$t = abs( $this->lat0 ); |
if( abs( $t - Proj4php::$common->HALF_PI ) < Proj4php::$common->EPSLN ) { |
$this->mode = $this->lat0 < 0. ? $this->S_POLE : $this->N_POLE; |
} else if( abs( $t ) < Proj4php::$common->EPSLN ) { |
$this->mode = $this->EQUIT; |
} else { |
$this->mode = $this->OBLIQ; |
} |
if( $this->es > 0 ) { |
#$sinphi; |
$this->qp = Proj4php::$common->qsfnz( $this->e, 1.0 ); |
$this->mmf = .5 / (1. - $this->es); |
$this->apa = $this->authset( $this->es ); |
switch( $this->mode ) { |
case $this->N_POLE: |
case $this->S_POLE: |
$this->dd = 1.; |
break; |
case $this->EQUIT: |
$this->rq = sqrt( .5 * $this->qp ); |
$this->dd = 1. / $this->rq; |
$this->xmf = 1.; |
$this->ymf = .5 * $this->qp; |
break; |
case $this->OBLIQ: |
$this->rq = sqrt( .5 * $this->qp ); |
$sinphi = sin( $this->lat0 ); |
$this->sinb1 = Proj4php::$common->qsfnz( $this->e, $sinphi ) / $this->qp; |
$this->cosb1 = sqrt( 1. - $this->sinb1 * $this->sinb1 ); |
$this->dd = cos( $this->lat0 ) / (sqrt( 1. - $this->es * $sinphi * $sinphi ) * $this->rq * $this->cosb1); |
$this->ymf = ($this->xmf = $this->rq) / $this->dd; |
$this->xmf *= $this->dd; |
break; |
} |
} else { |
if( $this->mode == $this->OBLIQ ) { |
$this->sinph0 = sin( $this->lat0 ); |
$this->cosph0 = cos( $this->lat0 ); |
} |
} |
} |
/* Lambert Azimuthal Equal Area forward equations--mapping lat,long to x,y |
----------------------------------------------------------------------- */ |
public function forward( $p ) { |
/* Forward equations |
----------------- */ |
#$x; |
#$y; |
$lam = $p->x; |
$phi = $p->y; |
$lam = Proj4php::$common->adjust_lon( $lam - $this->long0 ); |
if( $this->sphere ) { |
/* |
$coslam; |
$cosphi; |
$sinphi; |
*/ |
$sinphi = sin( $phi ); |
$cosphi = cos( $phi ); |
$coslam = cos( $lam ); |
switch( $this->mode ) { |
case $this->OBLIQ: |
case $this->EQUIT: |
$y = ($this->mode == $this->EQUIT) ? 1. + $cosphi * $coslam : 1. + $this->sinph0 * $sinphi + $this->cosph0 * $cosphi * $coslam; |
if( y <= Proj4php::$common->EPSLN ) { |
Proj4php::reportError( "laea:fwd:y less than eps" ); |
return null; |
} |
$y = sqrt( 2. / $y ); |
$x = $y * cosphi * sin( $lam ); |
$y *= ($this->mode == $this->EQUIT) ? $sinphi : $this->cosph0 * $sinphi - $this->sinph0 * $cosphi * $coslam; |
break; |
case $this->N_POLE: |
$coslam = -$coslam; |
case $this->S_POLE: |
if( abs( $phi + $this->phi0 ) < Proj4php::$common->EPSLN ) { |
Proj4php::reportError( "laea:fwd:phi < eps" ); |
return null; |
} |
$y = Proj4php::$common->FORTPI - $phi * .5; |
$y = 2. * (($this->mode == $this->S_POLE) ? cos( $y ) : sin( $y )); |
$x = $y * sin( $lam ); |
$y *= $coslam; |
break; |
} |
} else { |
/* |
$coslam; |
$sinlam; |
$sinphi; |
$q; |
*/ |
$sinb = 0.0; |
$cosb = 0.0; |
$b = 0.0; |
$coslam = cos( $lam ); |
$sinlam = sin( $lam ); |
$sinphi = sin( $phi ); |
$q = Proj4php::$common->qsfnz( $this->e, $sinphi ); |
if( $this->mode == $this->OBLIQ || $this->mode == $this->EQUIT ) { |
$sinb = $q / $this->qp; |
$cosb = sqrt( 1. - $sinb * $sinb ); |
} |
switch( $this->mode ) { |
case $this->OBLIQ: |
$b = 1. + $this->sinb1 * $sinb + $this->cosb1 * $cosb * $coslam; |
break; |
case $this->EQUIT: |
$b = 1. + $cosb * $coslam; |
break; |
case $this->N_POLE: |
$b = Proj4php::$common->HALF_PI + $phi; |
$q = $this->qp - $q; |
break; |
case $this->S_POLE: |
$b = $phi - Proj4php::$common->HALF_PI; |
$q = $this->qp + $q; |
break; |
} |
if( abs( $b ) < Proj4php::$common->EPSLN ) { |
Proj4php::reportError( "laea:fwd:b < eps" ); |
return null; |
} |
switch( $this->mode ) { |
case $this->OBLIQ: |
case $this->EQUIT: |
$b = sqrt( 2. / $b ); |
if( $this->mode == $this->OBLIQ ) { |
$y = $this->ymf * $b * ($this->cosb1 * $sinb - $this->sinb1 * $cosb * $coslam); |
} else { |
$y = ($b = sqrt( 2. / (1. + $cosb * $coslam) )) * $sinb * $this->ymf; |
} |
$x = $this->xmf * $b * $cosb * $sinlam; |
break; |
case $this->N_POLE: |
case $this->S_POLE: |
if( q >= 0. ) { |
$x = ($b = sqrt( $q )) * $sinlam; |
$y = $coslam * (($this->mode == $this->S_POLE) ? $b : -$b); |
} else { |
$x = $y = 0.; |
} |
break; |
} |
} |
//v 1.0 |
/* |
$sin_lat=sin(lat); |
$cos_lat=cos(lat); |
$sin_delta_lon=sin(delta_lon); |
$cos_delta_lon=cos(delta_lon); |
$g =$this->sin_lat_o * sin_lat +$this->cos_lat_o * cos_lat * cos_delta_lon; |
if (g == -1.0) { |
Proj4php::reportError("laea:fwd:Point projects to a circle of radius "+ 2.0 * R); |
return null; |
} |
$ksp = $this->a * sqrt(2.0 / (1.0 + g)); |
$x = ksp * cos_lat * sin_delta_lon + $this->x0; |
$y = ksp * ($this->cos_lat_o * sin_lat - $this->sin_lat_o * cos_lat * cos_delta_lon) + $this->y0; |
*/ |
$p->x = $this->a * $x + $this->x0; |
$p->y = $this->a * $y + $this->y0; |
return $p; |
} |
/* Inverse equations |
----------------- */ |
public function inverse( $p ) { |
$p->x -= $this->x0; |
$p->y -= $this->y0; |
$x = $p->x / $this->a; |
$y = $p->y / $this->a; |
if( $this->sphere ) { |
$cosz = 0.0; |
#$rh; |
$sinz = 0.0; |
$rh = sqrt( $x * $x + $y * $y ); |
$phi = $rh * .5; |
if( $phi > 1. ) { |
Proj4php::reportError( "laea:Inv:DataError" ); |
return null; |
} |
$phi = 2. * asin( $phi ); |
if( $this->mode == $this->OBLIQ || $this->mode == $this->EQUIT ) { |
$sinz = sin( $phi ); |
$cosz = cos( $phi ); |
} |
switch( $this->mode ) { |
case $this->EQUIT: |
$phi = (abs( $rh ) <= Proj4php::$common->EPSLN) ? 0. : asin( $y * $sinz / $rh ); |
$x *= $sinz; |
$y = $cosz * $rh; |
break; |
case $this->OBLIQ: |
$phi = (abs( $rh ) <= Proj4php::$common->EPSLN) ? $this->phi0 : asin( $cosz * $this->sinph0 + $y * $sinz * $this->cosph0 / $rh ); |
$x *= $sinz * $this->cosph0; |
$y = ($cosz - sin( $phi ) * $this->sinph0) * $rh; |
break; |
case $this->N_POLE: |
$y = -$y; |
$phi = Proj4php::$common->HALF_PI - $phi; |
break; |
case $this->S_POLE: |
$phi -= Proj4php::$common->HALF_PI; |
break; |
} |
$lam = ($y == 0. && ($this->mode == $this->EQUIT || $this->mode == $this->OBLIQ)) ? 0. : atan2( $x, $y ); |
} else { |
/* |
$cCe; |
$sCe; |
$q; |
$rho; |
*/ |
$ab = 0.0; |
switch( $this->mode ) { |
case $this->EQUIT: |
case $this->OBLIQ: |
$x /= $this->dd; |
$y *= $this->dd; |
$rho = sqrt( $x * $x + $y * $y ); |
if( $rho < Proj4php::$common->EPSLN ) { |
$p->x = 0.; |
$p->y = $this->phi0; |
return $p; |
} |
$sCe = 2. * asin( .5 * $rho / $this->rq ); |
$cCe = cos( $sCe ); |
$x *= ($sCe = sin( $sCe )); |
if( $this->mode == $this->OBLIQ ) { |
$ab = $cCe * $this->sinb1 + $y * $sCe * $this->cosb1 / $rho; |
$q = $this->qp * $ab; |
$y = $rho * $this->cosb1 * $cCe - $y * $this->sinb1 * $sCe; |
} else { |
$ab = $y * $sCe / $rho; |
$q = $this->qp * $ab; |
$y = $rho * $cCe; |
} |
break; |
case $this->N_POLE: |
$y = -$y; |
case $this->S_POLE: |
$q = ($x * $x + $y * $y); |
if( !$q ) { |
$p->x = 0.; |
$p->y = $this->phi0; |
return $p; |
} |
/* |
q = $this->qp - q; |
*/ |
$ab = 1. - $q / $this->qp; |
if( $this->mode == $this->S_POLE ) { |
$ab = - $ab; |
} |
break; |
} |
$lam = atan2( $x, $y ); |
$phi = $this->authlat( asin( $ab ), $this->apa ); |
} |
/* |
$Rh = sqrt($p->x *$p->x +$p->y * $p->y); |
$temp = Rh / (2.0 * $this->a); |
if (temp > 1) { |
Proj4php::reportError("laea:Inv:DataError"); |
return null; |
} |
$z = 2.0 * Proj4php::$common.asinz(temp); |
$sin_z=sin(z); |
$cos_z=cos(z); |
$lon =$this->long0; |
if (abs(Rh) > Proj4php::$common->EPSLN) { |
$lat = Proj4php::$common.asinz($this->sin_lat_o * cos_z +$this-> cos_lat_o * sin_z *$p->y / Rh); |
$temp =abs($this->lat0) - Proj4php::$common->HALF_PI; |
if (abs(temp) > Proj4php::$common->EPSLN) { |
temp = cos_z -$this->sin_lat_o * sin(lat); |
if(temp!=0.0) lon=Proj4php::$common->adjust_lon($this->long0+atan2($p->x*sin_z*$this->cos_lat_o,temp*Rh)); |
} else if ($this->lat0 < 0.0) { |
lon = Proj4php::$common->adjust_lon($this->long0 - atan2(-$p->x,$p->y)); |
} else { |
lon = Proj4php::$common->adjust_lon($this->long0 + atan2($p->x, -$p->y)); |
} |
} else { |
lat = $this->lat0; |
} |
*/ |
//return(OK); |
$p->x = Proj4php::$common->adjust_lon( $this->long0 + $lam ); |
$p->y = $phi; |
return $p; |
} |
/** |
* determine latitude from authalic latitude |
* |
* @param type $es |
* @return type |
*/ |
public function authset( $es ) { |
#$t; |
$APA = array( ); |
$APA[0] = $es * $this->P00; |
$t = $es * $es; |
$APA[0] += $t * $this->P01; |
$APA[1] = $t * $this->P10; |
$t *= $es; |
$APA[0] += $t * $this->P02; |
$APA[1] += $t * $this->P11; |
$APA[2] = $t * $this->P20; |
return $APA; |
} |
/** |
* |
* @param type $beta |
* @param type $APA |
* @return type |
*/ |
public function authlat( $beta, $APA ) { |
$t = $beta + $beta; |
return($beta + $APA[0] * sin( $t ) + $APA[1] * sin( $t + $t ) + $APA[2] * sin( $t + $t + $t )); |
} |
} |
Proj4php::$proj['laea'] = new Proj4phpProjLaea(); |
/branches/v5.3-amandaie/scripts/modules/ifn/bibliotheque/proj4php/projCode/moll.php |
---|
New file |
0,0 → 1,121 |
<?php |
/** |
* Author : Julien Moquet |
* |
* Inspired by Proj4php from Mike Adair madairATdmsolutions.ca |
* and Richard Greenwood rich@greenwoodma$p->com |
* License: LGPL as per: http://www.gnu.org/copyleft/lesser.html |
*/ |
/******************************************************************************* |
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. |
****************************************************************************** */ |
class Proj4phpProjMoll { |
/* Initialize the Mollweide projection |
------------------------------------ */ |
public function init() { |
//no-op |
} |
/* Mollweide forward equations--mapping lat,long to x,y |
---------------------------------------------------- */ |
public function forward( $p ) { |
/* Forward equations |
----------------- */ |
$lon = $p->x; |
$lat = $p->y; |
$delta_lon = Proj4php::$common->adjust_lon( $lon - $this->long0 ); |
$theta = $lat; |
$con = Proj4php::$common->PI * sin( $lat ); |
/* Iterate using the Newton-Raphson method to find theta |
----------------------------------------------------- */ |
for( $i = 0; true; ++$i ) { |
$delta_theta = -($theta + sin( $theta ) - $con) / (1.0 + cos( $theta )); |
$theta += $delta_theta; |
if( abs( $delta_theta ) < Proj4php::$common->EPSLN ) |
break; |
if( $i >= 50 ) { |
Proj4php::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( Proj4php::$common->PI / 2 - abs( $lat ) < Proj4php::$common->EPSLN ) |
$delta_lon = 0; |
$x = 0.900316316158 * $this->a * $delta_lon * cos( $theta ) + $this->x0; |
$y = 1.4142135623731 * $this->a * sin( $theta ) + $this->y0; |
$p->x = $x; |
$p->y = $y; |
return $p; |
} |
/** |
* |
* @param type $p |
* @return type |
*/ |
public function inverse( $p ) { |
#$theta; |
#$arg; |
/* Inverse equations |
----------------- */ |
$p->x-= $this->x0; |
//~ $p->y -= $this->y0; |
$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( abs( $arg ) > 0.999999999999 ) |
$arg = 0.999999999999; |
$theta = asin( $arg ); |
$lon = Proj4php::$common->adjust_lon( $this->long0 + ($p->x / (0.900316316158 * $this->a * cos( $theta ))) ); |
if( $lon < (-Proj4php::$common->PI) ) |
$lon = -Proj4php::$common->PI; |
if( $lon > Proj4php::$common->PI ) |
$lon = Proj4php::$common->PI; |
$arg = (2.0 * $theta + sin( 2.0 * $theta )) / Proj4php::$common->PI; |
if( abs( $arg ) > 1.0 ) |
$arg = 1.0; |
$lat = asin( $arg ); |
//return(OK); |
$p->x = $lon; |
$p->y = $lat; |
return $p; |
} |
} |
Proj4php::$proj['moll'] = new Proj4phpProjMoll(); |
/branches/v5.3-amandaie/scripts/modules/ifn/bibliotheque/proj4php/projCode/equi.php |
---|
New file |
0,0 → 1,80 |
<?php |
/** |
* Author : Julien Moquet |
* |
* Inspired by Proj4php from Mike Adair madairATdmsolutions.ca |
* and Richard Greenwood rich@greenwoodma$p->com |
* License: LGPL as per: http://www.gnu.org/copyleft/lesser.html |
*/ |
/******************************************************************************* |
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. |
*******************************************************************************/ |
class Proj4phpProjEqui { |
public function init() { |
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 |
--------------------------------------------------------- */ |
public function forward( $p ) { |
$lon = $p->x; |
$lat = $p->y; |
$dlon = Proj4php::$common->adjust_lon( $lon - $this->long0 ); |
$x = $this->x0 + $this->a * $dlon * cos( $this->lat0 ); |
$y = $this->y0 + $this->a * $lat; |
$this->t1 = $x; |
$this->t2 = cos( $this->lat0 ); |
$p->x = $x; |
$p->y = $y; |
return $p; |
} |
/* Equirectangular inverse equations--mapping x,y to lat/long |
--------------------------------------------------------- */ |
public function inverse( $p ) { |
$p->x -= $this->x0; |
$p->y -= $this->y0; |
$lat = $p->y / $this->a; |
if( abs( $lat ) > Proj4php::$common->HALF_PI ) { |
Proj4php::reportError( "equi:Inv:DataError" ); |
} |
$lon = Proj4php::$common->adjust_lon( $this->long0 + $p->x / ($this->a * cos( $this->lat0 )) ); |
$p->x = $lon; |
$p->y = $lat; |
} |
} |
Proj4php::$proj['equi'] = new Proj4phpProjEqui(); |
/branches/v5.3-amandaie/scripts/modules/ifn/bibliotheque/proj4php/projCode/gstmerc.php |
---|
New file |
0,0 → 1,63 |
<?php |
/** |
* Author : Julien Moquet |
* |
* Inspired by Proj4php from Mike Adair madairATdmsolutions.ca |
* and Richard Greenwood rich@greenwoodma$p->com |
* License: LGPL as per: http://www.gnu.org/copyleft/lesser.html |
*/ |
class Proj4phpProjGstmerc { |
public function init() { |
// array of: a, b, lon0, lat0, k0, x0, y0 |
$temp = $this->b / $this->a; |
$this->e = sqrt( 1.0 - $temp * $temp ); |
$this->lc = $this->long0; |
$this->rs = sqrt( 1.0 + $this->e * $this->e * pow( cos( $this->lat0 ), 4.0 ) / (1.0 - $this->e * $this->e) ); |
$sinz = sin( $this->lat0 ); |
$pc = asin( $sinz / $this->rs ); |
$sinzpc = sin( $pc ); |
$this->cp = Proj4php::$common->latiso( 0.0, $pc, $sinzpc ) - $this->rs * Proj4php::$common->latiso( $this->e, $this->lat0, $sinz ); |
$this->n2 = $this->k0 * $this->a * 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 |
// ----------------------------------------------------------------- |
public function forward( $p ) { |
$lon = $p->x; |
$lat = $p->y; |
$L = $this->rs * ($lon - $this->lc); |
$Ls = $this->cp + ($this->rs * Proj4php::$common->latiso( $this->e, $lat, sin( $lat ) )); |
$lat1 = asin( sin( $L ) / Proj4php::$common . cosh( $Ls ) ); |
$Ls1 = Proj4php::$common . latiso( 0.0, $lat1, sin( $lat1 ) ); |
$p->x = $this->xs + ($this->n2 * $Ls1); |
$p->y = $this->ys + ($this->n2 * atan( Proj4php::$common->sinh( $Ls ) / cos( $L ) )); |
return $p; |
} |
// inverse equations--mapping x,y to lat/long |
// ----------------------------------------------------------------- |
public function inverse( $p ) { |
$x = $p->x; |
$y = $p->y; |
$L = atan( Proj4php::$common . sinh( ($x - $this->xs) / $this->n2 ) / cos( ($y - $this->ys) / $this->n2 ) ); |
$lat1 = asin( sin( ($y - $this->ys) / $this->n2 ) / Proj4php::$common . cosh( ($x - $this->xs) / $this->n2 ) ); |
$LC = Proj4php::$common . latiso( 0.0, $lat1, sin( $lat1 ) ); |
$p->x = $this->lc + $L / $this->rs; |
$p->y = Proj4php::$common . invlatiso( $this->e, ($LC - $this->cp) / $this->rs ); |
return $p; |
} |
} |
Proj4php::$proj['gstmerc'] = new Proj4phpProjGestmerc(); |
/branches/v5.3-amandaie/scripts/modules/ifn/bibliotheque/proj4php/projCode/omerc.php |
---|
New file |
0,0 → 1,301 |
<?php |
/** |
* Author : Julien Moquet |
* |
* Inspired by Proj4php from Mike Adair madairATdmsolutions.ca |
* and Richard Greenwood rich@greenwoodma$p->com |
* License: LGPL as per: http://www.gnu.org/copyleft/lesser.html |
*/ |
/* * ***************************************************************************** |
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. |
* ***************************************************************************** */ |
class Proj4phpProjOmerc { |
/* Initialize the Oblique Mercator projection |
------------------------------------------ */ |
public function init() { |
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 |
------------------------------------------------- */ |
$temp = $this->b / $this->a; |
$es = 1.0 - pow( $temp, 2 ); |
$e = sqrt( $es ); |
$this->sin_p20 = sin( $this->lat0 ); |
$this->cos_p20 = cos( $this->lat0 ); |
$this->con = 1.0 - $this->es * $this->sin_p20 * $this->sin_p20; |
$this->com = sqrt( 1.0 - $es ); |
$this->bl = sqrt( 1.0 + $this->es * pow( $this->cos_p20, 4.0 ) / (1.0 - $es) ); |
$this->al = $this->a * $this->bl * $this->k0 * $this->com / $this->con; |
if( abs( $this->lat0 ) < Proj4php::$common->EPSLN ) { |
$this->ts = 1.0; |
$this->d = 1.0; |
$this->el = 1.0; |
} else { |
$this->ts = Proj4php::$common->tsfnz( $this->e, $this->lat0, $this->sin_p20 ); |
$this->con = 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 + sqrt( $this->d * $this->d - 1.0 ); |
} else { |
$this->f = $this->d - sqrt( $this->d * $this->d - 1.0 ); |
} |
} else { |
$this->f = $this->d; |
} |
$this->el = $this->f * pow( $this->ts, $this->bl ); |
} |
//$this->longc=52.60353916666667; |
if( $this->mode != 0 ) { |
$this->g = .5 * ($this->f - 1.0 / $this->f); |
$this->gama = Proj4php::$common->asinz( sin( $this->alpha ) / $this->d ); |
$this->longc = $this->longc - Proj4php::$common->asinz( $this->g * 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 = abs( $this->lat0 ); |
if( ($this->con > Proj4php::$common->EPSLN) && (abs( $this->con - Proj4php::$common->HALF_PI ) > Proj4php::$common->EPSLN) ) { |
$this->singam = sin( $this->gama ); |
$this->cosgam = cos( $this->gama ); |
$this->sinaz = sin( $this->alpha ); |
$this->cosaz = cos( $this->alpha ); |
if( $this->lat0 >= 0 ) { |
$this->u = ($this->al / $this->bl) * atan( sqrt( $this->d * $this->d - 1.0 ) / $this->cosaz ); |
} else { |
$this->u = -($this->al / $this->bl) * atan( sqrt( $this->d * $this->d - 1.0 ) / $this->cosaz ); |
} |
} else { |
Proj4php::reportError( "omerc:Init:DataError" ); |
} |
} else { |
$this->sinphi = sin( $this->at1 ); |
$this->ts1 = Proj4php::$common->tsfnz( $this->e, $this->lat1, $this->sinphi ); |
$this->sinphi = sin( $this->lat2 ); |
$this->ts2 = Proj4php::$common->tsfnz( $this->e, $this->lat2, $this->sinphi ); |
$this->h = pow( $this->ts1, $this->bl ); |
$this->l = 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 < -Proj4php::$common->PI ) |
$this->lon2 = $this->lon2 - 2.0 * Proj4php::$common->PI; |
if( $this->dlon > Proj4php::$common->PI ) |
$this->lon2 = $this->lon2 + 2.0 * Proj4php::$common->PI; |
$this->dlon = $this->lon1 - $this->lon2; |
$this->longc = .5 * ($this->lon1 + $this->lon2) - atan( $this->j * tan( .5 * $this->bl * $this->dlon ) / $this->p ) / $this->bl; |
$this->dlon = Proj4php::$common->adjust_lon( $this->lon1 - $this->longc ); |
$this->gama = atan( sin( $this->bl * $this->dlon ) / $this->g ); |
$this->alpha = Proj4php::$common->asinz( $this->d * sin( $this->gama ) ); |
/* Report parameters common to format A |
------------------------------------- */ |
if( abs( $this->lat1 - $this->lat2 ) <= Proj4php::$common->EPSLN ) { |
Proj4php::reportError( "omercInitDataError" ); |
//return(202); |
} else { |
$this->con = abs( $this->lat1 ); |
} |
if( ($this->con <= Proj4php::$common->EPSLN) || (abs( $this->con - Proj4php::$common->HALF_PI ) <= Proj4php::$common->EPSLN) ) { |
Proj4php::reportError( "omercInitDataError" ); |
//return(202); |
} else { |
if( abs( abs( $this->lat0 ) - Proj4php::$common->HALF_PI ) <= Proj4php::$common->EPSLN ) { |
Proj4php::reportError( "omercInitDataError" ); |
//return(202); |
} |
} |
$this->singam = sin( $this->gam ); |
$this->cosgam = cos( $this->gam ); |
$this->sinaz = sin( $this->alpha ); |
$this->cosaz = cos( $this->alpha ); |
if( $this->lat0 >= 0 ) { |
$this->u = ($this->al / $this->bl) * atan( sqrt( $this->d * $this->d - 1.0 ) / $this->cosaz ); |
} else { |
$this->u = -($this->al / $this->bl) * atan( sqrt( $this->d * $this->d - 1.0 ) / $this->cosaz ); |
} |
} |
} |
/* Oblique Mercator forward equations--mapping lat,long to x,y |
---------------------------------------------------------- */ |
public function forward( $p ) { |
/* |
$theta; // angle |
$sin_phi; |
$cos_phi; // sin and cos value |
$b; // temporary values |
$c; |
$t; |
$tq; // temporary values |
$con; |
$n; |
$ml; // cone constant, small m |
$q; |
$us; |
$vl; |
$ul; |
$vs; |
$s; |
$dlon; |
$ts1; |
*/ |
$lon = $p->x; |
$lat = $p->y; |
/* Forward equations |
----------------- */ |
$sin_phi = sin( $lat ); |
$dlon = Proj4php::$common->adjust_lon( $lon - $this->longc ); |
$vl = sin( $this->bl * $dlon ); |
if( abs( abs( $lat ) - Proj4php::$common->HALF_PI ) > Proj4php::$common->EPSLN ) { |
$ts1 = Proj4php::$common->tsfnz( $this->e, $lat, $sin_phi ); |
$q = $this->el / (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 = cos( $this->bl * $dlon ); |
if( abs( con ) < .0000001 ) { |
$us = $this->al * $this->bl * $dlon; |
} else { |
$us = $this->al * atan( ($s * $this->cosgam + $vl * $this->singam) / $con ) / $this->bl; |
if( $con < 0 ) |
$us = $us + Proj4php::$common->PI * $this->al / $this->bl; |
} |
} else { |
if( $lat >= 0 ) { |
$ul = $this->singam; |
} else { |
$ul = -$this->singam; |
} |
$us = $this->al * $lat / $this->bl; |
} |
if( abs( abs( $ul ) - 1.0 ) <= Proj4php::$common->EPSLN ) { |
//alert("Point projects into infinity","omer-for"); |
Proj4php::reportError( "omercFwdInfinity" ); |
//return(205); |
} |
$vs = .5 * $this->al * log( (1.0 - $ul) / (1.0 + $ul) ) / $this->bl; |
$us = $us - $this->u; |
$p->x = $this->x0 + $vs * $this->cosaz + $us * $this->sinaz; |
$p->y = $this->y0 + $us * $this->cosaz - $vs * $this->sinaz; |
return $p; |
} |
/** |
* |
* @param type $p |
* @return type |
*/ |
public function inverse( $p ) { |
/* |
$delta_lon; /* Delta longitude (Given longitude - center |
$theta; /* angle |
$delta_theta; /* adjusted longitude |
$sin_phi; |
$cos_phi; /* sin and cos value |
$b; /* temporary values |
$c; |
$t; |
$tq; /* temporary values |
$con; |
$n; |
$ml; /* cone constant, small m |
$vs; |
$us; |
$q; |
$s; |
$ts1; |
$vl; |
$ul; |
$bs; |
$dlon; |
$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 = exp( -$this->bl * $vs / $this->al ); |
$s = .5 * ($q - 1.0 / $q); |
$t = .5 * ($q + 1.0 / $q); |
$vl = sin( $this->bl * $us / $this->al ); |
$ul = ($vl * $this->cosgam + $s * $this->singam) / $t; |
if( abs( abs( $ul ) - 1.0 ) <= Proj4php::$common->EPSLN ) { |
$lon = $this->longc; |
if( ul >= 0.0 ) { |
$lat = Proj4php::$common->HALF_PI; |
} else { |
$lat = -Proj4php::$common->HALF_PI; |
} |
} else { |
$con = 1.0 / $this->bl; |
$ts1 = pow( ($this->el / sqrt( (1.0 + $ul) / (1.0 - $ul) ) ), $con ); |
$lat = Proj4php::$common->phi2z( $this->e, $ts1 ); |
//if ($flag != 0) |
//return($flag); |
//~ con = cos($this->bl * us /al); |
$theta = $this->longc - atan2( ($s * $this->cosgam - $vl * $this->singam ), $con ) / $this->bl; |
$lon = Proj4php::$common->adjust_lon( $theta ); |
} |
$p->x = $lon; |
$p->y = $lat; |
return $p; |
} |
} |
Proj4php::$proj['omerc'] = new Proj4phpProjOmerc(); |
/branches/v5.3-amandaie/scripts/modules/ifn/bibliotheque/proj4php/projCode/utm.php |
---|
New file |
0,0 → 1,74 |
<?php |
/** |
* Author : Julien Moquet |
* |
* Inspired by Proj4php from Mike Adair madairATdmsolutions.ca |
* and Richard Greenwood rich@greenwoodma$p->com |
* License: LGPL as per: http://www.gnu.org/copyleft/lesser.html |
*/ |
/******************************************************************************* |
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 |
*/ |
class Proj4phpProjUtm { |
public $dependsOn = 'tmerc'; |
public $utmSouth = false; // UTM north/south |
/** |
* |
* @return void |
*/ |
public function init() { |
if( !isset($this->zone) ) { |
Proj4php::reportError( "utm:init: zone must be specified for UTM" ); |
return; |
} |
$this->lat0 = 0.0; |
$this->long0 = ((6 * abs( $this->zone )) - 183) * Proj4php::$common->D2R; |
$this->x0 = 500000.0; |
$this->y0 = $this->utmSouth ? 10000000.0 : 0.0; |
$this->k0 = 0.9996; |
} |
/** |
* |
* @param type $p |
* @return type |
*/ |
public function forward( $p ) { |
return Proj4php::$proj['tmerc']->forward( $p ); |
} |
/** |
* |
* @param type $p |
* @return type |
*/ |
public function inverse( $p ) { |
return Proj4php::$proj['tmerc']->inverse( $p ); |
} |
} |
Proj4php::$proj['utm'] = new Proj4phpProjUtm(); |
/branches/v5.3-amandaie/. |
---|
Property changes: |
Modified: svn:mergeinfo |
Merged /trunk:r998-1001 |