....................................../////.===Shadow-Here===./////................................................ > < > < > < > < > < > < > < > < > < > < > < > < > < > < > < > < > < > < > < > < > < > < > < > < > < > < > < > < > < ------------------------------------------------------------------------------------------------------------------- /////////////////////////////////////////////////////////////////////////////////////////////////////////////////// RIFF¤ WEBPVP8 ˜ ðÑ *ôô>‘HŸK¥¤"§£±¨àð enü¹%½_F‘åè¿2ºQú³íªú`N¿­3ÿƒügµJžaÿ¯ÿ°~¼ÎùnúîÞÖô•òíôÁÉß®Sm¥Ü/ ‡ó˜f£Ùà<˜„xëJ¢Ù€SO3x<ªÔ©4¿+ç¶A`q@Ì“Úñè™ÍÿJÌ´ª-˜ÆtÊÛL]Ïq*‘Ý”ì#ŸÌÏãY]@ê`¿ /ªfkØB4·®£ó z—Üw¥Pxù–ÞLШKÇN¾AkÙTf½è'‰g gÆv›Øuh~ a˜Z— ïj*á¥t d£“uÒ ¨`K˜¹ßþ]b>˜]_ÏÔ6W—è2r4x•íÖ…"ƒÖNîä!¦å Ú}ýxGøÌ —@ ;ÆÚŠ=ɾ1ý8lªË¥ô ^yf®Œ¢u&2©nÙÇ›ñÂñŒ³ aPo['½»øFùà­+4ê“$!lövlüÞ=;N®3ð‚õ›DÉKòÞ>ÄÍ ¥ˆuߤ#ˆ$6ù™¥îЇy’ÍB¼ çxÛ;X"WL£R÷͝*ó-¶Zu}º.s¸sšXqù–DþÿvªhüïwyŸ ¯é³lÀ:KCûÄ£Ëá\…­ ~—ýóî ¼ûûÜTÓüÇy…ŽÆvc»¾×U ñ¸žþоP÷¦ó:Ò¨¨5;Ð#&#ÖúñläÿÁœ GxÉ­/ñ‡áQðìYÉtÒw޼GÔ´zàÒò ð*ëzƒ•4~H]Ø‹f ñÓÈñ`NåWçs'ÆÏW^ø¹!XžµmQ5ÃËoLœÎ: ÞËÍ¥J ù…î èo£ßPÎñ¶ž8.Œ]ʵ~5›ÙË-ù*8ÙÖß±~ ©¹rÓê‚j¶d¸{^Q'˜±Crß ÚH—#¥¥QlÀ×ëã‡DÜ«èî þ&Çæžî;ŽÏºò6ÒLÃXy&ZŒ'j‚¢Ù€IßÚù+–MGi‰*jE€‘JcÜ ÓÌ EÏÚj]o˜ Þr <¾U ûŪæÍ/šÝH¥˜b”¼ ÁñßX GP›ï2›4WŠÏà×£…íÓk†¦H·ÅíMh–*nó÷à]ÁjCº€b7<ب‹¨5車bp2:Á[UªM„QŒçiNMa#<5›áËó¸HýÊ"…×Éw¹¦ì2º–x<›»a±¸3Weü®FÝ⑱ö–î–³|LPÈ~çð~Çå‡|º kD¢µÏàÆAI %1À% ¹Ò – ”ϝS¦‰4&¶£°à Öý”û_Ò Áw°A«Å€?mÇÛgHÉ/8)á¾ÛìáöŽP í¨PŸNÙµº¦‡§Ùš"ÿ«>+ªÕ`Ê÷‡‚ß Õû˜þãÇ-PÍ.¾XV‘€ dÜ"þ4¹ ±Oú‘©t¥¦FªÄÃÄ•b‚znýu½—#cDs˜ÃiÑOˆñ×QO=*IAÊ,¶ŽZƒ;‡wøXè%EÐk:F±Ú” .Ѽ+Áu&Ç`."pÈÉw o&¿dE6‘’EqTuK@Ì¥ã™À(Êk(h‰,H}RÀIXÛš3µ1©_OqÚÒJAñ$ÊÙÜ;D3çŒ[þùœh¬Ã³™ö6ç†NY".Ú‰ï[ªŸŒ '²Ð öø_¨ÂÉ9ué¶³ÒŠõTàîMØ#û¯gN‡bÙ놚X„ö …ÉeüÌ^J ‹€.œ$Æ)βÄeæW#óüßĺŸ€ ÀzwV 9oä»f4V*uB «Ë†¹ì¯žR霓æHXa=&“I4K;¯ç‹h×·"UŠ~<•╪Vêª&ÍSÃÆÅ?ÔqÎ*mTM ˜›µwêd#[C¡©§‘D<©àb†–ÁœøvH/,í:¯( ²£|4-„Æövv„Yͼ™^Á$ˆ„¢Û[6yB.åH*V¨æ?$=˜Ñ€•ñ·­(VlŸ‘ nÀt8W÷´Bûba?q9ú¶Xƒl«ÿ\ù¶’þòUÐj/õ¢Ìµ³g$ƒÎR!¸»|Oߍë’BhîÚÑ¢ñåŒJ„®„£2Ð3•ô02Nt…!£Í]Ïc½Qÿ?ˆ<&ÃA¾Ú,JˆijÌ#5yz„‰Î|ÊŽ5QÏ:‹ÐaóVÔxW—CpeÏzÐïíçôÿÅ_[hãsÐ_/ŽTÝ?BîˆííV$<¿i>²F¬_Eß¿ †bÊŒº­ÿ®Z H“C}”¬,Mp ý/Bá£w>˜YV°aƒúh+cŠ- r/[%|üUMHäQ°X»|û/@|°¥Ð !BÔ Ç¢Ä©š+Õì D«7ìN¶ŽðÔ " ƶ’ÖçtA‰Û×}{tþz­¾GÍ›k¹OEJR$ Â׃ «ëÁ"oÉôž$oUK(Ä)Ãz³Ê-‹êN[Ò3Œñbï8P 4ƒ×q¢bo|?<ÛX¬òÄͰL–±›(™ûG?ýË©ÚÄ–ÂDØÐ_Ç¡ô ¾–ÄÏø ×e8Ë©$ÄF¹Å‹ì[©óìl:F¾f´‹‹Xì²ï®\¬ôùƒ ÿat¥óèÒùHß0äe‚;ü×h:ÆWðHž=Ã8骣"kœ'Y?³}Tûè€>?0l›e1Lòñ„aæKÆw…hÖŠùW…ÈÆÄ0ši·›[pcwËþñiêíY/~-Á5˜!¿†A›™Mÿþ(±“t@â“ö2­´TG5yé]çå僳 .·ÍïçÝ7UÚ±Ð/Nè»,_Ï ùdj7\ï Wì4›„»c¸àešg#ÒÊ⥭áØo5‘?ÌdÝô¯ ¹kzsƒ=´#ëÉK›Ø´±-¥eW?‡çßtòTã…$Ý+qÿ±ƒ÷_3Ô¥í÷:æ–ž<·Ö‡‰Å¢ š‡%Ô—utÌÈìðžgÖÀz²À—ï÷Óîäõ{K'´È÷³yaÏÁjƒô}ž§®æÊydÕÈë5¯èˆõvÕ©ã*çD„ “z„Ó‡^^xÂ3M§A´JG‚öï 3W'ˆ.OvXè¡ÊÕª?5º7†˜(˜Ç¶#çê’¶!ÌdZK§æ 0fãaN]òY³RV ™î$®K2R¨`W!1Ôó\;Ý ýB%qæK•&ÓÈe9È0êI±žeŸß -ú@žQr¦ ö4»M¼Áè¹µmw 9 EÆE_°2ó„ŸXKWÁ×Hóì^´²GѝF©óäR†¦‰ç"V»eØ<3ùd3ÿÚ¤Žú“Gi" —‘_ÙËÎ~Üö¯¥½Î»üŸEÚŽåmÞþí ;ÞólËΦMzA"Âf(´òá;Éï(/7½ûñÌ­cïÕçлþÝz¾-ÍvÑ“pH­–ðÓj$¸Äû¤‚‘ãUBË-n“2åPkS5&‹Â|+g^œ®Ì͆d!OïäîU«c;{Û!ÅŽ«ëZ9Ókóˆ]¯ƒ›né `ÇÒ+tÆš (ØKá¾—=3œ®•vuMñg²\ï Ec€ 05±d™‡×iÇ×›UúvÌ¢£Èþ¡ÕØô¶ßÎA"ß±#Ö²ˆÊŸ¦*Ä~ij|àø.-¼'»Ú¥£h ofº¦‡VsR=N½„Î v˜Z*SÌ{=jÑB‹tê…;’HžH¯8–îDù8ñ¢|Q•bÛçš–‹m³“ê¨ åÏ^m¬Žãþ©ïêO‡½6] µÆ„Ooòü ²x}N¦Ë3ïé¿»€›HA˜m%çÞ/¿í7Fø“‹léUk)É°Œµ8Q8›:ÀŠeT*šõ~ôڝG6 ¢}`ùH­–”¡k ‰P1>š†®9z11!X wKfmÁ¦xÑ,N1Q”–æB¶M…ÒÃv6SMˆhU¬ÊPŽï‘öj=·CŒ¯u¹ƒVIЃsx4’ömÛýcå¡¶7ßŠß 57^\wÒÐÆ k§h,Œý î«q^R½3]J¸ÇðN ‚çU¬ôº^Áì} ³f©Õœ§ˆã:FÄÈ‚é(€™?àýÓüè1Gô£¼éj‚OÅñ  #>×—ßtà 0G¥Åa뀐kßhc™À_ÉñÞ#±)GD" YîäË-ÿÙ̪ ¹™a¯´¢E\ÝÒö‚;™„ë]_ p8‰o¡ñ+^÷ 3‘'dT4œŽ ðVë½° :¬víÑ«£tßÚS-3¶“þ2 †üüʨòrš¹M{É_¤`Û¨0ìjœøJ‡:÷ÃáZ˜†@GP&œÑDGÏs¡þ¦þDGú‘1Yá9Ôþ¼ ûø…§÷8&–ÜÑnÄ_m®^üÆ`;ÉVÁJ£?â€-ßê}suÍ2sõA NÌúA磸‘îÿÚ»ƒìö·á¿±tÑÐ"Tÿü˜[@/äj¬€uüªìù¥Ý˜á8Ý´sõj 8@rˆð äþZÇD®ÿUÏ2ùôõrBzÆÏÞž>Ì™xœ“ wiÎ×7_… ¸ \#€MɁV¶¥üÕÿPÔ9Z‡ø§É8#H:ƒ5ÀÝå9ÍIŒ5åKÙŠ÷qÄ>1AÈøžj"µÂд/ªnÀ qªã}"iŸBå˜ÓÛŽ¦…&ݧ;G@—³b¯“•"´4í¨ôM¨åñC‹ïùÉó¯ÓsSH2Ý@ßáM‡ˆKÀªÛUeø/4\gnm¥‹ŸŒ qÄ b9ÞwÒNÏ_4Ég³ú=܆‚´ •â¥õeíþkjz>éÚyU«Íӝ݃6"8/ø{=Ô¢»G¥ äUw°W«,ô—¿ãㆅү¢³xŠUû™yŒ (øSópÐ 9\åTâ»—*oG$/×ÍT†Y¿1¤Þ¢_‡ ¼ „±ÍçèSaÓ 3ÛMÁBkxs‰’R/¡¤ˆÙçª(*õ„üXÌ´ƒ E§´¬EF"Ù”R/ÐNyÆÂ^°?™6¡œïJ·±$§?º>ÖüœcNÌù¯G ‹ñ2ЁBB„^·úìaz¨k:#¨Æ¨8LÎõލ£^§S&cŒÐU€ü(‡F±Š¼&P>8ÙÁ ‰ p5?0ÊÆƒZl¸aô š¼¡}gÿ¶zÆC²¹¬ÎÖG*HB¡O<º2#ñŒAƒ–¡B˜´É$¥›É:FÀÔx¾u?XÜÏÓvN©RS{2ʈãk9rmP¼Qq̳ è¼ÐFׄ^¡Öì fE“F4A…!ì/…¦Lƒ… … $%´¾yã@CI¬ á—3PþBÏNÿ<ý°4Ü ËÃ#ØÍ~âW«rEñw‹eùMMHß²`¬Öó½íf³:‹k˜¯÷}Z!ã¿<¥,\#öµÀ¯aÒNÆIé,Ћ–lŽ#Àæ9ÀÒS·I’½-Ïp Äz¤Š Â* ­íÄ9­< h>׍3ZkËU¹§˜ŒŠ±f­’¤º³Q ÏB?‹#µíÃ¥®@(Gs«†vI¥Mµ‹Á©e~2ú³ÁP4ìÕi‚²Ê^ö@-DþÓàlÜOÍ]n"µã:žpsŽ¢:! Aõ.ç~ÓBûH÷JCÌ]õVƒd «ú´QÙEA–¯¯Œ!.ˆˆëQ±ù œ·Ì!Õâ )ùL„ÅÀlÚè5@B…o´Æ¸XÓ&Û…O«˜”_#‡ƒ„ûÈt!¤ÁÏ›ÎÝŠ?c9 â\>lÓÁVÄÑ™£eØY]:fÝ–—ù+p{™ðè û³”g±OƒÚSù£áÁÊ„ä,ï7š²G ÕÌBk)~ÑiCµ|h#u¤¶îK¨² #²vݯGãeÖ϶ú…¾múÀ¶þÔñ‚Š9'^($¤§ò “š½{éúp÷J›ušS¹áªCÂubÃH9™D™/ZöØÁ‡¦ÝÙŸ·kð*_”.C‹{áXó€‡c¡c€§/šò/&éš÷,àéJþ‰X›fµ“C¨œ®r¬"kL‰Â_q…Z–.ÉL~O µ›zn‚¹À¦Öª7\àHµšÖ %»ÇníV[¥*Õ;ƒ#½¾HK-ÖIÊdÏEÚ#=o÷Óò³´Š: Ç?{¾+9›–‘OEáU·S€˜j"ÄaÜ ŒÛWt› á–c#a»pÔZÞdŽtWê=9éöÊ¢µ~ ë ;Öe‡Œ®:bî3±ýê¢wà¼îpêñ¹¾4 zc¾ðÖÿzdêŒÑÒŝÀ‰s6¤í³ÎÙB¿OZ”+F¤á‡3@Ñëäg©·Ž ˆèª<ù@É{&S„œÕúÀA)‰h:YÀ5^ÂÓŒ°õäU\ ùËÍû#²?Xe¬tu‰^zÒÔãë¼ÛWtEtû …‚g¶Úüâî*moGè¨7%u!]PhÏd™Ý%Îx: VÒ¦ôÊD3ÀŽKÛËãvÆî…N¯ä>Eró–ð`5 Œ%u5XkñÌ*NU%¶áœÊ:Qÿú»“úzyÏ6å-၇¾ ´ ÒÊ]y žO‘w2Äøæ…H’²f±ÎÇ.ª|¥'gîV•Ü .̘¯€šòü¤U~Ù†*¢!?ò wý,}´°ÔÞnïoKq5µb!áÓ3"vAßH¡³¡·G(ÐÎ0Îò¼MG!/ài®@—¬04*`…«é8ªøøló“ˆÊ”èù¤…ßÊoÿé'ËuÌÖ5×È¡§ˆˆfŽë9}hìâ_!!¯  B&Ëö¶‰ÀAÙNVŸ Wh›¸®XÑJì¨ú“¿÷3uj²˜¨ÍÎìë±aúŠÝå¯ð*Ó¨ôJ“yºØ)m°WýOè68†ŸÏ2—‰Ïüꪫٚ¥‹l1 ø ÏÄFjêµvÌbü¦èÝx:X±¢H=MÐß—,ˆÉÇ´(9ú¾^ÅÚ4¿m‡$âX‘å%(AlZo@½¨UOÌÕ”1ø¸jÎÀÃÃ_ µ‘Ü.œº¦Ut: Æï’!=¯uwû#,“pþÇúŒø(é@?³ü¥‘Mo §—s@Œ#)§ŒùkL}NOÆêA›¸~r½¼ÙA—HJ«eˆÖ´*¡ÓpÌŸö.m<-"³ûÈ$¬_6­åf£ïÚâj1y§ÕJ½@dÞÁr&Í\Z%D£Íñ·AZ Û³øüd/ªAi†/Й~  ‡âĮҮÏh§°b—›Û«mJžòG'[ÈYýŒ¦9psl ýÁ ®±f¦x,‰½tN ‚Xª9 ÙÖH.«Lo0×?͹m¡å†Ѽ+›2ƒF ±Ê8 7Hցϓ²Æ–m9…òŸï]Â1äN†VLâCˆU .ÿ‰Ts +ÅÎx(%¦u]6AF Š ØF鈄‘ |¢¶c±soŒ/t[a¾–û:s·`i햍ê›ËchÈ…8ßÀUÜewŒðNOƒõD%q#éû\9¤x¹&UE×G¥ Í—™$ð E6-‡¼!ýpãÔM˜ Âsìe¯ñµK¢Ç¡ùôléœ4Ö£”À Š®Ðc ^¨À}ÙËŸ§›ºê{ÊuÉC ×Sr€¤’fÉ*j!úÓ’Gsùìoîßîn%ò· àc Wp÷$¨˜)û»H ×8ŽÒ€Zj¤3ÀÙºY'Ql¦py{-6íÔCeiØp‘‡XÊîÆUߢ܂ž£Xé¼Y8þ©ëgñß}é.ÎógÒ„ÃØËø¯»™§Xýy M%@NŠ À(~áÐvu7&•,Ù˜ó€uP‡^^®=_E„jt’ 403WebShell
403Webshell
Server IP : 213.186.33.2  /  Your IP : 216.73.216.250
Web Server : Apache
System : Linux webd003.cluster102.gra.hosting.ovh.net 5.15.206-ovh-vps-grsec-zfs-classid #1 SMP Fri May 15 02:41:25 UTC 2026 x86_64
User : uneseuleoc ( 96096)
PHP Version : 7.4.33
Disable Function : _dyuweyrj4,_dyuweyrj4r,dl
MySQL : OFF  |  cURL : ON  |  WGET : ON  |  Perl : ON  |  Python : ON  |  Sudo : OFF  |  Pkexec : OFF
Directory :  /home/uneseuleoc/www/plugins/auto/gis/v5.0.0/

Upload File :
current_dir [ Writeable ] document_root [ Writeable ]

 

Command :


[ Back ]     

Current File : /home/uneseuleoc/www/plugins/auto/gis/v5.0.0/gis_fonctions.php
<?php

if (!defined('_ECRIRE_INC_VERSION')) {
	return;
}

include_spip('inc/config');
include_spip('inc/json');

/**
 * Filtre dec_to_dms, http://www.statemaster.com/encyclopedia/Geographic-coordinate-conversion
 *
 * @param float $coord
 * @return string
 */
function dec_to_dms($coord) {
	return sprintf(
		'%0.0f° %2.3f',
		floor(abs($coord)),
		60 * (abs($coord) - floor(abs($coord)))
	);
}

/**
 * Filtre dms_to_dec, http://www.statemaster.com/encyclopedia/Geographic-coordinate-conversion
 *
 * @param string $ref N, E, S, W
 * @param int $deg
 * @param int $min
 * @param int $sec
 * @return float
 */
function dms_to_dec($ref, $deg, $min, $sec) {

	$arrLatLong = [];
	$arrLatLong['N'] = 1;
	$arrLatLong['E'] = 1;
	$arrLatLong['S'] = -1;
	$arrLatLong['W'] = -1;

	return ($deg + ((($min * 60) + ($sec)) / 3600)) * $arrLatLong[$ref];
}

/**
 * Filtre distance pour renvoyer la distance entre deux points
 * http://snipplr.com/view/2531/calculate-the-distance-between-two-coordinates-latitude-longitude/
 * sinon voir ici : https://zone.spip.org/trac/spip-zone/browser/_plugins_/forms/geoforms/inc/gPoint.php
 *
 * @param int|array $from
 *     id_gis du point de référence ou tableau de coordonnées
 * @param int|array $to
 *     id_gis du point distant ou tableau de coordonnées
 * @param bool $miles
 *     Renvoyer le résultat en miles (kilomètres par défaut)
 * @return float
 *     Retourne la distance en kilomètre ou en miles
 */
function distance($from, $to, $miles = false) {
	// On ne travaille que si on a toutes les infos
	if (
		((is_array($from) and isset($from['lat']) and isset($from['lon'])) // Le départ est soit un tableau soit un entier
		or ($from = intval($from) and $from > 0 and $from = sql_fetsel('lat,lon', 'spip_gis', "id_gis=$from")))
		and ((is_array($to) and isset($to['lat']) and isset($to['lon'])) or ($to = intval($to) and $to > 0 and $to = sql_fetsel('lat,lon', 'spip_gis', "id_gis=$to"))) // Le distant est soit un tableau soit un entier
	) {
		$pi80 = M_PI / 180;
		$from['lat'] *= $pi80;
		$from['lon'] *= $pi80;
		$to['lat'] *= $pi80;
		$to['lon'] *= $pi80;

		$r = 6372.797; // mean radius of Earth in km
		$dlat = $to['lat'] - $from['lat'];
		$dlng = $to['lon'] - $from['lon'];
		$a = sin($dlat / 2) * sin($dlat / 2) + cos($from['lat']) * cos($to['lat']) * sin($dlng / 2) * sin($dlng / 2);
		$c = 2 * atan2(sqrt($a), sqrt(1 - $a));
		$km = $r * $c;

		return ($miles ? ($km * 0.621371192) : $km);
	}

	return false;
}

/**
 * Afficher proprement une distance
 *
 * @param float $distance
 * 		Nombre indiquant une distance
 * @param int $precision
 * 		Précision des décimales du nombre final, par défaut 2
 * @param string $format_entree
 * 		Format de distance donnée en entrée : par défaut en kilomètres, sinon en mètres avec "m"
 * @return string
 * 		Retourne une chaine composée d'un nombre arrondi et d'une unité de mesure de distance
 **/
function distance_en_metres($distance, $precision = 2, $format_entree = 'km') {
	if ($distance) {
		// On passe toujours tout en kilomètres pour uniformiser
		if ($format_entree == 'm') {
			$distance = $distance / 1000;
		}

		// Si c'est supérieur à 1, on reste en kilomètres
		$unite = 'km';
		if ($distance > 1) {
			$unite = 'km';
		} elseif (($distance = $distance * 1000) > 1) {
			$unite = 'm';
		}

		$distance = number_format($distance, $precision, ',', '') . ' ' . $unite;
	}

	return $distance;
}

/**
 * Compilation du critère {distancefrom}
 *
 * Critère {distancefrom} qui permet de ne sélectionner que les objets se trouvant à une distance comparée avec un point de repère.
 * On doit lui passer 3 paramètres obligatoires :
 * - le point de repère qui est un tableau avec les clés "lat" et "lon" ou un id_gis
 * - l'opérateur de comparaison
 * - la distance à comparer, en kilomètres
 * Cela donne par exemple :
 *   {distancefrom #ARRAY{lat,#LAT,lon,#LON},<,30}
 *   {distancefrom #ARRAY{lat,#ENV{lat},lon,#ENV{lon}},<=,#ENV{distance}}
 *
 * @param string $idb Identifiant de la boucle
 * @param object $boucles AST du squelette
 * @param object $crit Paramètres du critère dans cette boucle
 * @return void
 */
function critere_distancefrom_dist($idb, &$boucles, $crit) {
	$boucle = &$boucles[$idb];
	$id_table = $boucle->id_table; // articles
	$primary = $boucle->primary; // id_article
	$objet = objet_type($id_table); // article

	if (
		($id_table == 'gis' or isset($boucle->join['gis'])) // Soit depuis une boucle (GIS) soit un autre objet mais avec {gis}
		and (is_countable($crit->param) ? count($crit->param) : 0) == 3 // Il faut aussi qu'il y ait 3 critères obligatoires
	) {
		$point_reference = calculer_liste($crit->param[0], [], $boucles, $boucles[$idb]->id_parent);
		$operateur = calculer_liste($crit->param[1], [], $boucles, $boucles[$idb]->id_parent);
		$distance = calculer_liste($crit->param[2], [], $boucles, $boucles[$idb]->id_parent);

		// Si le point de référence est un entier, on essaye de récupérer les coordonnées du point GIS
		// Et si on a toujours pas de tableau correct, on met false
		$boucle->hierarchie .= '$point_reference = ' . $point_reference . ';';
		$boucle->hierarchie .= 'if (is_numeric($point_reference)){ $point_reference = sql_fetsel("lat,lon", "spip_gis", "id_gis = ".intval($point_reference)); }';
		$boucle->hierarchie .= 'if (!is_array($point_reference) or !isset($point_reference["lat"]) or !isset($point_reference["lon"])){ $point_reference = false; }';
		// L'opérateur doit exister dans une liste précise
		$boucle->hierarchie .= '$operateur_distance = trim(' . $operateur . ');';
		$boucle->hierarchie .= 'if (!in_array($operateur_distance, array("=","<",">","<=",">="))){ $operateur_distance = false; }';
		$boucle->hierarchie .= '$distance = ' . $distance . ';';

		$boucle->select[] = '".(!$point_reference ? "\'\' as distance" : "(6371 * acos( cos( radians(".$point_reference["lat"].") ) * cos( radians( gis.lat ) ) * cos( radians( gis.lon ) - radians(".$point_reference["lon"].") ) + sin( radians(".$point_reference["lat"].") ) * sin( radians( gis.lat ) ) ) ) AS distance")."';
		$boucle->having[] = '((!$point_reference or !$operateur_distance or !$distance) ? "1=1" : "distance $operateur_distance ".sql_quote($distance))';
	}
}

/**
 * Compile le critère `{gis}` qui permet de compléter la boucle avec les points GIS
 *
 * Usage
 * - `{gis}` Retourne les objets ayant des points (et ajoute les balises spéciales GIS tel que `#TITRE_GIS`)
 * - `{!gis}` Retourne les objets sans points
 * - `{gis distance<XX}`, sur une boucle `GIS`, filtre une liste de points par rapport à la distance du point de l'env
 *
 * @param string $idb Identifiant de la boucle
 * @param object $boucles AST du squelette
 * @param object $crit Paramètres du critère dans cette boucle
 * @return void
 */
function critere_gis_dist($idb, &$boucles, $crit) {
	$boucle = &$boucles[$idb];
	$id_table = $boucle->id_table; // articles
	$primary = $boucle->primary; // id_article
	$objet = objet_type($id_table); // article

	if ($id_table == 'gis') {
		// exclure l'élément en cours des résultats
		$id_gis = calculer_argument_precedent($idb, $primary, $boucles);
		$boucle->where[] = ["'!='", "'$boucle->id_table." . "$primary'", $id_gis];

		// récupérer les paramètres du critère
		$op = $op_val = '';
		$params = $crit->param;
		$type = array_shift($params);
		$type = $type[0]->texte;
		if (preg_match(',^(\w+)([<>=]+)([0-9]+)$,', $type, $r)) {
			$type = $r[1];
			$op = $r[2];
			$op_val = $r[3];
		}
		if ($op) {
			$boucle->having[] = ["'" . $op . "'", "'" . $type . "'",$op_val];
		}

		// récupérer lat/lon du point de la boucle englobante
		$lat = calculer_argument_precedent($idb, 'lat', $boucles);
		$lon = calculer_argument_precedent($idb, 'lon', $boucles);

		// http://www.awelty.fr/developpement-web/php/
		// http://www.movable-type.co.uk/scripts/latlong-db.html
		// http://code.google.com/intl/fr/apis/maps/articles/geospatial.html#geospatial
		$select = "(6371 * acos( cos( radians(\".$lat.\") ) * cos( radians( gis.lat ) ) * cos( radians( gis.lon ) - radians(\".$lon.\") ) + sin( radians(\".$lat.\") ) * sin( radians( gis.lat ) ) ) ) AS distance";
		$order = "'distance'";

		$boucle->select[] = $select;
		$boucle->order[] = $order;
	} else {
		/* Recherche d'objets SANS point */
		if ($crit->not) {
			$boucle->from['gis_liens'] = 'spip_gis_liens';
			$boucle->from_type['gis_liens'] = 'LEFT';
			$boucle->join['gis_liens'] = ["'$id_table'","'id_objet'","'$primary'","'gis_liens.objet='.sql_quote('$objet')"];
			$boucle->where[] = "'gis_liens.id_gis IS NULL'";

		/* Recherche d'objets AVEC point + ajout des champs GIS */
		} else {
			// ajouter tous les champs du point au select
			// et les suffixer pour lever toute ambiguite avec des champs homonymes
			if (!function_exists('objet_info')) {
				include_spip('inc/filtres');
			}
			$champs = objet_info('gis', 'champs_critere_gis');
			foreach ($champs as $champ) {
				$boucle->select[] = $champ;
			}
			// jointure sur spip_gis_liens/spip_gis
			// cf plugin notation
			// $boucle->join["surnom (as) table de liaison"] = array("surnom de la table a lier", "cle primaire de la table de liaison", "identifiant a lier", "type d'objet de l'identifiant");
			$boucle->from['gis_liens'] = 'spip_gis_liens';
			$boucle->join['gis_liens'] = ["'$id_table'","'id_objet'","'$primary'","'gis_liens.objet='.sql_quote('$objet')"];
			$boucle->from['gis'] = 'spip_gis';
			$boucle->join['gis'] = ["'gis_liens'","'id_gis'"];
			// bien renvoyer tous les points qui son attachés à l'objet
			// mais attention, si on trouve en amont un groupement portant sur un champ *de GIS*,
			// alors cela signifie que la personne veut faire une opération de groupement sur les points donc là on n'ajoute pas id_gis
			$tous_les_points = true;
			foreach ($boucle->group as $champ) {
				if (in_array($champ, ['ville', 'code_postal', 'pays', 'code_pays', 'region','departement'])) {
					$tous_les_points = false;
				}
			}
			if ($tous_les_points) {
				$boucle->group[] = 'gis_liens.id_gis';
			}
			// ajouter gis aux jointures et spécifier les jointures explicites pour pouvoir utiliser les balises de la table de jointure
			// permet de passer dans trouver_champ_exterieur() depuis index_tables_en_pile()
			// cf http://article.gmane.org/gmane.comp.web.spip.zone/6628
			$boucle->jointures[] = 'gis';
			if (empty($boucle->jointures_explicites)) {
				$boucle->jointures_explicites = 'gis_liens gis';
			} else {
				$boucle->jointures_explicites .= ' gis_liens gis';
			}
		}
	}
}
function critere_gis_tout_dist($idb, &$boucles, $crit) {
	$crit->op = 'gis';
	$critere_gis = charger_fonction('gis', 'critere/');
	$critere_gis($idb, $boucles, $crit);
	$boucle = &$boucles[$idb];
	$boucle->from_type['gis_liens'] = 'LEFT';
	$boucle->from_type['gis'] = 'LEFT';
}

/**
 * Balise #DISTANCE prenant en compte les critères {gis distance<XX} et {distancefrom}
 * merci marcimat : http://formation.magraine.net/spip.php?article61
 *
 * Retourne la distance calculée par GIS en présence des critères adéquats,
 * sinon la valeur du champ.
 *
 * @param object $p
 */
function balise_distance_dist($p) {
	$p = rindex_pile($p, 'distance', 'gis');
	if ($p->code === "''") {
		$p->code = champ_sql('distance', $p);
	}
	return $p;
}

/**
 * Balise #TITRE_GIS : retourne le titre du point
 * Necessite le critere {gis} sur la boucle
 *
 * @param object $p
 */
function balise_titre_gis_dist($p) {
	return rindex_pile($p, 'titre_gis', 'gis');
}

/**
 * Balise #DESCRIPTIF_GIS : retourne le descriptif du point
 * Necessite le critere {gis} sur la boucle
 *
 * @param object $p
 */
function balise_descriptif_gis_dist($p) {
	return rindex_pile($p, 'descriptif_gis', 'gis');
}

/**
 * Balise #ADRESSE_GIS : retourne l'adresse du point
 * Necessite le critere {gis} sur la boucle
 *
 * @param object $p
 */
function balise_adresse_gis_dist($p) {
	return rindex_pile($p, 'adresse_gis', 'gis');
}

/**
 * Balise #PAYS_GIS : retourne le pays du point
 * Necessite le critere {gis} sur la boucle
 *
 * @param object $p
 */
function balise_pays_gis_dist($p) {
	return rindex_pile($p, 'pays_gis', 'gis');
}

/**
 * Balise #CODE_PAYS_GIS : retourne le code pays du point
 * Necessite le critere {gis} sur la boucle
 *
 * @param object $p
 */
function balise_code_pays_gis_dist($p) {
	return rindex_pile($p, 'code_pays_gis', 'gis');
}

/**
 * Balise #VILLE_GIS : retourne la ville du point
 * Necessite le critere {gis} sur la boucle
 *
 * @param object $p
 */
function balise_ville_gis_dist($p) {
	return rindex_pile($p, 'ville_gis', 'gis');
}

/**
 * Balise #REGION_GIS : retourne la région du point
 * Necessite le critere {gis} sur la boucle
 *
 * @param object $p
 */
function balise_region_gis_dist($p) {
	return rindex_pile($p, 'region_gis', 'gis');
}

/**
 * Balise #DEPARTEMENT_GIS : censé retourner le département du point
 * Necessite le critere {gis} sur la boucle
 *
 * @param object $p
 */
function balise_departement_gis_dist($p) {
	return rindex_pile($p, 'departement_gis', 'gis');
}

/**
 * Balise #CODE_POSTAL_GIS : retourne le code postal du point
 * Necessite le critere {gis} sur la boucle
 *
 * @param object $p
 */
function balise_code_postal_gis_dist($p) {
	return rindex_pile($p, 'code_postal_gis', 'gis');
}

/**
 * Définition du fond de carte à utiliser par défaut en prenant compte les defines
 */
function gis_layer_defaut() {
	$defaut = 'openstreetmap_mapnik';
	if (defined('_GIS_LAYER_DEFAUT_FORCE')) {
		return _GIS_LAYER_DEFAUT_FORCE;
	} else {
		if (defined('_GIS_LAYER_DEFAUT')) {
			$defaut = _GIS_LAYER_DEFAUT;
		}
		$config = lire_config('gis/layer_defaut');
		return $config ?: $defaut;
	}
}

/**
 * Recuperer les cles primaires du env pour l'appel a l'url json des points
 * @param array|string $env
 * @return array
 */
function gis_modele_url_json_env($env) {
	$contexte = [];
	if (is_string($env)) {
		$env = unserialize($env);
	}
	if ($env) {
		// d'abord toutes les cles primaires connues
		$tables_sql = lister_tables_objets_sql();
		foreach (array_keys($tables_sql) as $table) {
			$primary = id_table_objet($table);
			if (isset($env[$primary])) {
				$contexte[$primary] = is_array($env[$primary]) ? $env[$primary] : trim($env[$primary]);
			}
		}
		// puis cas particuliers et ceux ajoutés par le pipeline
		$keys = pipeline('gis_modele_parametres_autorises', ['objet', 'id_objet', 'id_secteur', 'id_parent', 'media', 'recherche', 'mots', 'pays', 'code_pays', 'region', 'departement', 'ville', 'code_postal', 'adresse']);
		foreach ($keys as $key) {
			if (isset($env[$key])) {
				$contexte[$key] = is_array($env[$key]) ? $env[$key] : trim($env[$key]);
			}
		}
	}
	return $contexte;
}


/**
 * Transforme un paramètre d'entrée en tableau
 * s'il n'en est pas déjà un.
 *
 * Permet d'utiliser dans l'appel au modèle de carte gis
 * depuis un texte d'article des paramètres tabulaires,
 * tel que des identifiants de documents de tracés kml,
 * tel que `<carte_gis|kml=10,11,12>`
 *
 * @example `#ENV{kml}|gis_param_to_array`
 *
 * @param string|int|array $param
 *     Le paramètre à transformer en tableau
 * @param string $sep
 *     Le séparateur utilisé
 * @return array
**/
function gis_param_to_array($param, $sep = ',') {
	if (is_array($param)) {
		return $param;
	}
	// enlever les espaces et exploser
	$tab = explode($sep, trim((string)$param));
	// enlever les champs vides, les espaces sur chaques champs.
	return array_map('trim', array_filter($tab));
}

/**
 * Transformer le tableau de kml en tableau d'urls :
 *   si numerique c'est un id de document
 *   si chaine c'est une url qu'on rapatrie en local
 * @param array $kml
 * @return array
 */
function gis_kml_to_urls($kml) {
	if ($kml and count($kml)) {
		include_spip('inc/filtres_mini');
		include_spip('inc/distant');
		foreach ($kml as $k => $v) {
			if (is_numeric($v)) {
				$kml[$k] = url_absolue(generer_objet_url($v, 'document'));
			} else {
				$kml[$k] = _DIR_RACINE . copie_locale($kml[$k], 'modif');
			}
		}
	}
	return $kml;
}

/**
 * Retourne les propriétés JSON de l'icône d'un point
 *
 * @param string $img
 *     Balise HTML `<img ... />` ou chemin de l'image (qui peut être une URL distante).
 * @return string
 *     Les propriétés de l'icône
**/
function gis_icon_properties($img = '') {
	$props = $icon = '';

	if ($img) {
		if (largeur($img) >= 44) {
			$icon = extraire_attribut(filtrer('image_graver', filtrer('image_recadre', filtrer('image_passe_partout', $img, 32, 32), 32, 32, 'center', 'transparent')), 'src');
		} else {
			$icon = extraire_attribut($img, 'src') ?: $img;
		}
	} else {
		$icon = find_in_path('images/marker_defaut.png');
	}

	if ($icon) {
		$props .= ",\n\t\t\t\"icon\": " . json_encode(url_absolue($icon), JSON_THROW_ON_ERROR) . ',';
		[$h, $w] = taille_image($icon);
		$props .= "\n\t\t\t\"icon_size\": " . json_encode([$w,$h], JSON_THROW_ON_ERROR) . ',';
		/**
		 * Si l'icone est carrée, on considère que c'est soit un point soit un carré qui pointe un lieu et non une "goutte"
		 * On centre donc au milieu de l'icone
		 */
		if ($w == $h) {
			$props .= "\n\t\t\t\"icon_anchor\": " . json_encode([$w / 2, $h / 2], JSON_THROW_ON_ERROR) . ',';
			$props .= "\n\t\t\t\"popup_anchor\": " . json_encode([0,0]);
		} else {
			$props .= "\n\t\t\t\"icon_anchor\": " . json_encode([$w / 2, $h], JSON_THROW_ON_ERROR) . ',';
			$props .= "\n\t\t\t\"popup_anchor\": " . json_encode([1, -round($h / 1.2, 2)], JSON_THROW_ON_ERROR);
		}
	}

	if ($shadow = find_in_path('images/marker_defaut_shadow.png')) {
		$props .= ",\n\t\t\t\"shadow\": " . json_encode(url_absolue($shadow), JSON_THROW_ON_ERROR);
		[$h, $w] = taille_image($shadow);
		$props .= ",\n\t\t\t\"shadow_size\": " . json_encode([$w,$h], JSON_THROW_ON_ERROR);
	}

	return $props;
}


if (!defined('_TAILLE_MAX_GIS_STATIC')) {
	define('_TAILLE_MAX_GIS_STATIC', 1024);
}

/**
 * Retourne la balise img d'une carte statique
 *
 * @param int $id_gis
 *     ID du point à afficher
 * @param int $width
 *     Largeur de l'image
 * @param int $height
 *     Hauteur de l'image
 * @param string|boolean $maptype
 *     Le nom de la couche à utiliser en fond de carte
 * @param int $zoom
 *     Le zoom de la carte
 * @param string $markers
 *     Les informations des markers à afficher sous la forme suivante  lat;lon;url|lat;lon;url
 * @param float $lat
 *     La latitude du centre de la carte
 * @param float $lon
 *     La longitude du centre de la carte
 * @return string
 *     Le code HTML de l'image de la carte
**/
function gis_static_map($id_gis, $width, $height, $maptype = false, $zoom = null, $markers = null, $lat = 0, $lon = 0) {

	$markers_ = [];
	$gis = [];

	if ($id_gis) {
		$gis = sql_fetsel('lat,lon,zoom', 'spip_gis', 'id_gis=' . intval($id_gis));
	}

	$zoom ??= $gis['zoom'];

	$lat = $gis['lat'] ?? $lat;
	$lon = $gis['lon'] ?? $lon;

	if (intval($id_gis) and !$markers) {
		$markers_[] = ['lat' => (float) $lat, 'lon' => (float) $lon];
	} else {
		$markers = explode('|', $markers);
		foreach ($markers as $marker) {
			[$markerLat, $markerLon, $markerUrl] = explode(';', $marker);
			$markers_[] = ['lat' => (float) $markerLat, 'lon' => (float) $markerLon, 'url' => $markerUrl];
		}
	}

	if ($width > _TAILLE_MAX_GIS_STATIC) {
		$width = _TAILLE_MAX_GIS_STATIC;
	}
	if ($height > _TAILLE_MAX_GIS_STATIC) {
		$height = _TAILLE_MAX_GIS_STATIC;
	}

	include_spip('inc/staticmap');
	$map = new staticMapGis((float) $lat, (float) $lon, (int) $zoom, $width, $height, $maptype, $markers_);
	$balise_img = charger_filtre('balise_img');
	return $balise_img($map->showMap());
}

Youez - 2016 - github.com/yon3zu
LinuXploit