Commit 97da8f59fef89b8edd185a0f68325f166a52bc1f
1 parent
f4763544
Exists in
master
and in
7 other branches
Correção no cálculo de distâncias. O algoritimo de cálculo foi substituido pelo …
…existente em http://www.movable-type.co.uk/scripts/latlong.html
Showing
6 changed files
with
63 additions
and
96 deletions
Show diff stats
classesjs/classe_calculo.js
| ... | ... | @@ -293,49 +293,36 @@ i3GEO.calculo = { |
| 293 | 293 | Function: distancia |
| 294 | 294 | |
| 295 | 295 | Calcula a distância entre dois pontos. |
| 296 | - | |
| 297 | - Baseado no site http://www.wcrl.ars.usda.gov/cec/java/lat-long.htm | |
| 298 | 296 | |
| 297 | + Baseado no site http://www.movable-type.co.uk/scripts/latlong.html (indicado por louriques@yahoo.com.br) | |
| 298 | + | |
| 299 | + Em versões anteriores utilizava-se o cálculo proposto em http://www.wcrl.ars.usda.gov/cec/java/lat-long.htm | |
| 300 | + | |
| 299 | 301 | Parameters: |
| 300 | 302 | |
| 301 | - lga {Numeric} - x inicial. | |
| 303 | + lon1 {Numeric} - x inicial. | |
| 302 | 304 | |
| 303 | - lta {Numeric} - y inicial | |
| 305 | + lat1 {Numeric} - y inicial | |
| 304 | 306 | |
| 305 | - lgb {Numeric} - x final | |
| 307 | + lon2 {Numeric} - x final | |
| 306 | 308 | |
| 307 | - ltb {Numeric} - y final | |
| 309 | + lat2 {Numeric} - y final | |
| 308 | 310 | |
| 309 | 311 | Return: |
| 310 | 312 | |
| 311 | 313 | Type: |
| 312 | 314 | {Numeric} |
| 313 | 315 | */ |
| 314 | - distancia: function(lga,lta,lgb,ltb){ | |
| 315 | - try{ | |
| 316 | - var er = 6366.707; | |
| 317 | - var radlat1 = Math.PI * lta/180; | |
| 318 | - var radlat2 = Math.PI * ltb/180; | |
| 319 | - var radlong1 = Math.PI * lga/180; | |
| 320 | - var radlong2 = Math.PI * lgb/180; | |
| 321 | - if (lta > 0) {radlat1=Math.PI/2-radlat1;} | |
| 322 | - if (lta < 0) {radlat1=Math.PI/2+radlat1;} | |
| 323 | - if (lga < 0) {radlong1=Math.PI*2-radlong1;} | |
| 324 | - if (ltb > 0) {radlat2=Math.PI/2-radlat2;} | |
| 325 | - if (ltb < 0) {radlat2=Math.PI/2+radlat2;} | |
| 326 | - if (lgb < 0) {radlong2=Math.PI*2-radlong2;} | |
| 327 | - var x1 = er * Math.cos(radlong1)*Math.sin(radlat1); | |
| 328 | - var y1 = er * Math.sin(radlong1)*Math.sin(radlat1); | |
| 329 | - var z1 = er * Math.cos(radlat1); | |
| 330 | - var x2 = er * Math.cos(radlong2)*Math.sin(radlat2); | |
| 331 | - var y2 = er * Math.sin(radlong2)*Math.sin(radlat2); | |
| 332 | - var z2 = er * Math.cos(radlat2); | |
| 333 | - var d = Math.sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2)+(z1-z2)*(z1-z2)); | |
| 334 | - //side, side, side, law of cosines and arccos | |
| 335 | - var theta = Math.acos((er*er+er*er-d*d)/(2*er*er)); | |
| 336 | - return theta*er; | |
| 337 | - } | |
| 338 | - catch(e){return (0);} | |
| 316 | + distancia: function(lon1,lat1,lon2,lat2){ | |
| 317 | + var R = 6371; // km | |
| 318 | + var dLat = ((lat2-lat1))* Math.PI / 180; | |
| 319 | + var dLon = ((lon2-lon1)) * Math.PI / 180; | |
| 320 | + var a = Math.sin(dLat/2) * Math.sin(dLat/2) + | |
| 321 | + Math.cos(lat1 * Math.PI / 180) * Math.cos(lat2 * Math.PI / 180) * | |
| 322 | + Math.sin(dLon/2) * Math.sin(dLon/2); | |
| 323 | + var c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1-a)); | |
| 324 | + var d = R * c; | |
| 325 | + return d; | |
| 339 | 326 | }, |
| 340 | 327 | /* |
| 341 | 328 | Function: rect2ext | ... | ... |
classesjs/compactados/classe_calculo_compacto.js
| 1 | -if(typeof(i3GEO)=='undefined'){i3GEO=new Array()}i3GEO.calculo={dms2dd:function(cd,cm,cs){try{var sinal='positivo';if(cd<0){cd=cd*-1;sinal='negativo'}spm=cs/3600;mpg=cm/60;var dd=(cd*1)+(mpg*1)+(spm*1);if(sinal=='negativo'){dd=dd*-1}return(dd)}catch(e){return(0)}},dd2tela:function(vx,vy,docmapa,ext,cellsize){try{if(i3GEO.interface.ATUAL=="googlemaps"){var pos=i3GEO.util.pegaPosicaoObjeto($i(i3GEO.interface.IDCORPO));var latlng=new GLatLng(vy,vx);var xyn=i3GeoMap.fromLatLngToContainerPixel(latlng);var xy=new Array();return[(xyn.x)+pos[0],(xyn.y)+pos[1]]}if(arguments.length==3){var ext=i3GEO.parametros.mapexten;var cellsize=i3GEO.parametros.pixelsize}if(arguments.length==4){var cellsize=i3GEO.parametros.pixelsize}if(!docmapa){var docmapa=window.document}var dc=docmapa;var pos=i3GEO.util.pegaPosicaoObjeto(dc);var imgext=ext;var imgext=imgext.split(" ");vx=(vx*1)-(imgext[0]*1);vy=(vy*-1)+(imgext[3]*1);c=cellsize*1;return[(vx/c)+pos[0],(vy/c)+pos[1]]}catch(e){return(new Array())}},dd2dms:function(x,y){var m=0;var s=0;var dx=parseInt(x);if(dx>0){var restod=x-dx}if(dx<0){restod=(x*-1)-(dx*-1)}dx=dx;if(restod!=0){var mm=restod*60;var m=parseInt(restod*60);var restos=mm-m;var mx=m;if(restos!=0){var s=restos*60;var s=(s+"_").substring(0,5);var sx=s}else{s="00.00"}}else{var mx="00";var sx="00.00"}if(m.length==2){m="0"+m+""}if(s*1<10){s="0"+s}var xv=dx+" "+mx+" "+sx;var m=0;var s=0;var dy=parseInt(y);if(dy>0){var restod=y-dy}if(dy<0){var restod=(y*-1)-(dy*-1)}dy=dy;if(restod!=0){var mm=restod*60;var m=parseInt(restod*60);var restos=mm-m;var my=m;if(restos!=0){var s=restos*60;s=(s+"_").substring(0,5);var sy=s}else{var s="00.00"}}else{var my="00";var sy="00.00"}if(m.length==2){m="0"+m}if(s*1<10){s="0"+s}var yv=dy+" "+my+" "+sy;var res=new Array();res[0]=xv;res[1]=yv;return res},tela2dd:function(xfign,yfign,g_celula,imgext){try{if(navm){xfign=xfign-2.2;yfign=yfign-2.7}else{xfign=xfign-0.12;yfign=yfign-1.05}var nx=g_celula*xfign;var ny=g_celula*yfign;var amext=imgext.split(" ");var longdd=(amext[0]*1)+nx;var latdd=(amext[3]*1)-ny;var res=new Array();res[0]=longdd;res[1]=latdd;return(res)}catch(e){return(0)}},area:function(pontos,pixel){try{if(pontos.xpt.length>2){var $array_length=pontos.xpt.length;pontos.xtela.push(pontos.xtela[0]);pontos.ytela.push(pontos.ytela[0]);pontos.xtela.push(pontos.xtela[0]);pontos.ytela.push(pontos.ytela[1]);var $polygon_area=0;for(var $i=0;$i<=$array_length;$i++){$polygon_area+=((pontos.xtela[$i]*pontos.ytela[$i+1])-(pontos.ytela[$i]*pontos.xtela[$i+1]))}$polygon_area=Math.abs($polygon_area)/2}else{$polygon_area="Sao necessarios pelo menos tres pontos para o calculo"}return $polygon_area*pixel}catch(e){return(0)}},distancia:function(lga,lta,lgb,ltb){try{var er=6366.707;var radlat1=Math.PI*lta/180;var radlat2=Math.PI*ltb/180;var radlong1=Math.PI*lga/180;var radlong2=Math.PI*lgb/180;if(lta>0){radlat1=Math.PI/2-radlat1}if(lta<0){radlat1=Math.PI/2+radlat1}if(lga<0){radlong1=Math.PI*2-radlong1}if(ltb>0){radlat2=Math.PI/2-radlat2}if(ltb<0){radlat2=Math.PI/2+radlat2}if(lgb<0){radlong2=Math.PI*2-radlong2}var x1=er*Math.cos(radlong1)*Math.sin(radlat1);var y1=er*Math.sin(radlong1)*Math.sin(radlat1);var z1=er*Math.cos(radlat1);var x2=er*Math.cos(radlong2)*Math.sin(radlat2);var y2=er*Math.sin(radlong2)*Math.sin(radlat2);var z2=er*Math.cos(radlat2);var d=Math.sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2)+(z1-z2)*(z1-z2));var theta=Math.acos((er*er+er*er-d*d)/(2*er*er));return theta*er}catch(e){return(0)}},rect2ext:function(idrect,mapext,pixel){eval('pix = parseInt(document.getElementById("'+idrect+'").style.'+g_tipoleft+")");eval('piy = parseInt(document.getElementById("'+idrect+'").style.'+g_tipotop+")");if($i(idrect)){var bx=$i(idrect);var bxs=bx.style}else{alert("Box nao encontrado");return}var pos=i3GEO.util.pegaPosicaoObjeto($i("img"));var xfig0=parseInt(bxs.width)-pos[0];var yfig0=parseInt(bxs.height)-pos[1];var xfig=pix+(parseInt(bxs.width))-pos[0];var yfig=piy+(parseInt(bxs.height))-pos[1];var amext=mapext.split(" ");var dx=((amext[0]*-1)-(amext[2]*-1))/-1;var dy=((amext[1]*1)-(amext[3]*1))/-1;if(dy<0)dy=dy*-1;var nx=pixel*xfig;var ny=pixel*yfig;var x1=(amext[0]*1)+nx;var y1=(amext[3]*1)-ny;var xfig=pix-pos[0];var yfig=piy-pos[1];if(dy<0)dy=dy*-1;var nx=pixel*xfig;var ny=pixel*yfig;var x2=(amext[0]*1)+nx;var y2=(amext[3]*1)-ny;var v=x2+" "+y2+" "+x1+" "+y1;var res=new Array(v,x1,y1,x2,y2);return(res)},ext2rect:function(idrect,mapext,boxext,pixel,documento){var rectbox=boxext.split(" ");var rectmap=mapext.split(" ");var xyMin=i3GEO.calculo.dd2tela(rectbox[0],rectbox[1],documento,boxext,pixel);var xyMax=i3GEO.calculo.dd2tela(rectbox[2],rectbox[3],documento,boxext,pixel);var w=xyMax[0]-xyMin[0];var h=xyMin[1]-xyMax[1];var tl=i3GEO.calculo.dd2tela(rectbox[0],rectbox[3],documento,mapext,pixel);var pos=i3GEO.util.pegaPosicaoObjeto(documento);var t=tl[1]-pos[1];var l=tl[0]-pos[0];var d="block";if($i(idrect)){var box=$i(idrect);box.style.width=w;box.style.height=h;box.style.top=t+"px";box.style.left=l+"px";box.style.display=d}return new Array(w,h,xyMax[1],xyMin[0])}}; | |
| 2 | 1 | \ No newline at end of file |
| 2 | +if(typeof(i3GEO)=='undefined'){i3GEO=new Array()}i3GEO.calculo={dms2dd:function(cd,cm,cs){try{var sinal='positivo';if(cd<0){cd=cd*-1;sinal='negativo'}spm=cs/3600;mpg=cm/60;var dd=(cd*1)+(mpg*1)+(spm*1);if(sinal=='negativo'){dd=dd*-1}return(dd)}catch(e){return(0)}},dd2tela:function(vx,vy,docmapa,ext,cellsize){try{if(i3GEO.interface.ATUAL=="googlemaps"){var pos=i3GEO.util.pegaPosicaoObjeto($i(i3GEO.interface.IDCORPO));var latlng=new GLatLng(vy,vx);var xyn=i3GeoMap.fromLatLngToContainerPixel(latlng);var xy=new Array();return[(xyn.x)+pos[0],(xyn.y)+pos[1]]}if(arguments.length==3){var ext=i3GEO.parametros.mapexten;var cellsize=i3GEO.parametros.pixelsize}if(arguments.length==4){var cellsize=i3GEO.parametros.pixelsize}if(!docmapa){var docmapa=window.document}var dc=docmapa;var pos=i3GEO.util.pegaPosicaoObjeto(dc);var imgext=ext;var imgext=imgext.split(" ");vx=(vx*1)-(imgext[0]*1);vy=(vy*-1)+(imgext[3]*1);c=cellsize*1;return[(vx/c)+pos[0],(vy/c)+pos[1]]}catch(e){return(new Array())}},dd2dms:function(x,y){var m=0;var s=0;var dx=parseInt(x);if(dx>0){var restod=x-dx}if(dx<0){restod=(x*-1)-(dx*-1)}dx=dx;if(restod!=0){var mm=restod*60;var m=parseInt(restod*60);var restos=mm-m;var mx=m;if(restos!=0){var s=restos*60;var s=(s+"_").substring(0,5);var sx=s}else{s="00.00"}}else{var mx="00";var sx="00.00"}if(m.length==2){m="0"+m+""}if(s*1<10){s="0"+s}var xv=dx+" "+mx+" "+sx;var m=0;var s=0;var dy=parseInt(y);if(dy>0){var restod=y-dy}if(dy<0){var restod=(y*-1)-(dy*-1)}dy=dy;if(restod!=0){var mm=restod*60;var m=parseInt(restod*60);var restos=mm-m;var my=m;if(restos!=0){var s=restos*60;s=(s+"_").substring(0,5);var sy=s}else{var s="00.00"}}else{var my="00";var sy="00.00"}if(m.length==2){m="0"+m}if(s*1<10){s="0"+s}var yv=dy+" "+my+" "+sy;var res=new Array();res[0]=xv;res[1]=yv;return res},tela2dd:function(xfign,yfign,g_celula,imgext){try{if(navm){xfign=xfign-2.2;yfign=yfign-2.7}else{xfign=xfign-0.12;yfign=yfign-1.05}var nx=g_celula*xfign;var ny=g_celula*yfign;var amext=imgext.split(" ");var longdd=(amext[0]*1)+nx;var latdd=(amext[3]*1)-ny;var res=new Array();res[0]=longdd;res[1]=latdd;return(res)}catch(e){return(0)}},area:function(pontos,pixel){try{if(pontos.xpt.length>2){var $array_length=pontos.xpt.length;pontos.xtela.push(pontos.xtela[0]);pontos.ytela.push(pontos.ytela[0]);pontos.xtela.push(pontos.xtela[0]);pontos.ytela.push(pontos.ytela[1]);var $polygon_area=0;for(var $i=0;$i<=$array_length;$i++){$polygon_area+=((pontos.xtela[$i]*pontos.ytela[$i+1])-(pontos.ytela[$i]*pontos.xtela[$i+1]))}$polygon_area=Math.abs($polygon_area)/2}else{$polygon_area="Sao necessarios pelo menos tres pontos para o calculo"}return $polygon_area*pixel}catch(e){return(0)}},distancia:function(lon1,lat1,lon2,lat2){var R=6371;var dLat=((lat2-lat1))*Math.PI/180;var dLon=((lon2-lon1))*Math.PI/180;var a=Math.sin(dLat/2)*Math.sin(dLat/2)+Math.cos(lat1*Math.PI/180)*Math.cos(lat2*Math.PI/180)*Math.sin(dLon/2)*Math.sin(dLon/2);var c=2*Math.atan2(Math.sqrt(a),Math.sqrt(1-a));var d=R*c;return d},rect2ext:function(idrect,mapext,pixel){eval('pix = parseInt(document.getElementById("'+idrect+'").style.'+g_tipoleft+")");eval('piy = parseInt(document.getElementById("'+idrect+'").style.'+g_tipotop+")");if($i(idrect)){var bx=$i(idrect);var bxs=bx.style}else{alert("Box nao encontrado");return}var pos=i3GEO.util.pegaPosicaoObjeto($i("img"));var xfig0=parseInt(bxs.width)-pos[0];var yfig0=parseInt(bxs.height)-pos[1];var xfig=pix+(parseInt(bxs.width))-pos[0];var yfig=piy+(parseInt(bxs.height))-pos[1];var amext=mapext.split(" ");var dx=((amext[0]*-1)-(amext[2]*-1))/-1;var dy=((amext[1]*1)-(amext[3]*1))/-1;if(dy<0)dy=dy*-1;var nx=pixel*xfig;var ny=pixel*yfig;var x1=(amext[0]*1)+nx;var y1=(amext[3]*1)-ny;var xfig=pix-pos[0];var yfig=piy-pos[1];if(dy<0)dy=dy*-1;var nx=pixel*xfig;var ny=pixel*yfig;var x2=(amext[0]*1)+nx;var y2=(amext[3]*1)-ny;var v=x2+" "+y2+" "+x1+" "+y1;var res=new Array(v,x1,y1,x2,y2);return(res)},ext2rect:function(idrect,mapext,boxext,pixel,documento){var rectbox=boxext.split(" ");var rectmap=mapext.split(" ");var xyMin=i3GEO.calculo.dd2tela(rectbox[0],rectbox[1],documento,boxext,pixel);var xyMax=i3GEO.calculo.dd2tela(rectbox[2],rectbox[3],documento,boxext,pixel);var w=xyMax[0]-xyMin[0];var h=xyMin[1]-xyMax[1];var tl=i3GEO.calculo.dd2tela(rectbox[0],rectbox[3],documento,mapext,pixel);var pos=i3GEO.util.pegaPosicaoObjeto(documento);var t=tl[1]-pos[1];var l=tl[0]-pos[0];var d="block";if($i(idrect)){var box=$i(idrect);box.style.width=w;box.style.height=h;box.style.top=t+"px";box.style.left=l+"px";box.style.display=d}return new Array(w,h,xyMax[1],xyMin[0])}}; | |
| 3 | 3 | \ No newline at end of file | ... | ... |
classesjs/i3geo_tudo_compacto.js
| ... | ... | @@ -10249,49 +10249,36 @@ i3GEO.calculo = { |
| 10249 | 10249 | Function: distancia |
| 10250 | 10250 | |
| 10251 | 10251 | Calcula a distância entre dois pontos. |
| 10252 | - | |
| 10253 | - Baseado no site http://www.wcrl.ars.usda.gov/cec/java/lat-long.htm | |
| 10254 | 10252 | |
| 10253 | + Baseado no site http://www.movable-type.co.uk/scripts/latlong.html (indicado por louriques@yahoo.com.br) | |
| 10254 | + | |
| 10255 | + Em versões anteriores utilizava-se o cálculo proposto em http://www.wcrl.ars.usda.gov/cec/java/lat-long.htm | |
| 10256 | + | |
| 10255 | 10257 | Parameters: |
| 10256 | 10258 | |
| 10257 | - lga {Numeric} - x inicial. | |
| 10259 | + lon1 {Numeric} - x inicial. | |
| 10258 | 10260 | |
| 10259 | - lta {Numeric} - y inicial | |
| 10261 | + lat1 {Numeric} - y inicial | |
| 10260 | 10262 | |
| 10261 | - lgb {Numeric} - x final | |
| 10263 | + lon2 {Numeric} - x final | |
| 10262 | 10264 | |
| 10263 | - ltb {Numeric} - y final | |
| 10265 | + lat2 {Numeric} - y final | |
| 10264 | 10266 | |
| 10265 | 10267 | Return: |
| 10266 | 10268 | |
| 10267 | 10269 | Type: |
| 10268 | 10270 | {Numeric} |
| 10269 | 10271 | */ |
| 10270 | - distancia: function(lga,lta,lgb,ltb){ | |
| 10271 | - try{ | |
| 10272 | - var er = 6366.707; | |
| 10273 | - var radlat1 = Math.PI * lta/180; | |
| 10274 | - var radlat2 = Math.PI * ltb/180; | |
| 10275 | - var radlong1 = Math.PI * lga/180; | |
| 10276 | - var radlong2 = Math.PI * lgb/180; | |
| 10277 | - if (lta > 0) {radlat1=Math.PI/2-radlat1;} | |
| 10278 | - if (lta < 0) {radlat1=Math.PI/2+radlat1;} | |
| 10279 | - if (lga < 0) {radlong1=Math.PI*2-radlong1;} | |
| 10280 | - if (ltb > 0) {radlat2=Math.PI/2-radlat2;} | |
| 10281 | - if (ltb < 0) {radlat2=Math.PI/2+radlat2;} | |
| 10282 | - if (lgb < 0) {radlong2=Math.PI*2-radlong2;} | |
| 10283 | - var x1 = er * Math.cos(radlong1)*Math.sin(radlat1); | |
| 10284 | - var y1 = er * Math.sin(radlong1)*Math.sin(radlat1); | |
| 10285 | - var z1 = er * Math.cos(radlat1); | |
| 10286 | - var x2 = er * Math.cos(radlong2)*Math.sin(radlat2); | |
| 10287 | - var y2 = er * Math.sin(radlong2)*Math.sin(radlat2); | |
| 10288 | - var z2 = er * Math.cos(radlat2); | |
| 10289 | - var d = Math.sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2)+(z1-z2)*(z1-z2)); | |
| 10290 | - //side, side, side, law of cosines and arccos | |
| 10291 | - var theta = Math.acos((er*er+er*er-d*d)/(2*er*er)); | |
| 10292 | - return theta*er; | |
| 10293 | - } | |
| 10294 | - catch(e){return (0);} | |
| 10272 | + distancia: function(lon1,lat1,lon2,lat2){ | |
| 10273 | + var R = 6371; // km | |
| 10274 | + var dLat = ((lat2-lat1))* Math.PI / 180; | |
| 10275 | + var dLon = ((lon2-lon1)) * Math.PI / 180; | |
| 10276 | + var a = Math.sin(dLat/2) * Math.sin(dLat/2) + | |
| 10277 | + Math.cos(lat1 * Math.PI / 180) * Math.cos(lat2 * Math.PI / 180) * | |
| 10278 | + Math.sin(dLon/2) * Math.sin(dLon/2); | |
| 10279 | + var c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1-a)); | |
| 10280 | + var d = R * c; | |
| 10281 | + return d; | |
| 10295 | 10282 | }, |
| 10296 | 10283 | /* |
| 10297 | 10284 | Function: rect2ext | ... | ... |
classesjs/i3geo_tudo_compacto.js.php
| ... | ... | @@ -10249,49 +10249,36 @@ i3GEO.calculo = { |
| 10249 | 10249 | Function: distancia |
| 10250 | 10250 | |
| 10251 | 10251 | Calcula a distância entre dois pontos. |
| 10252 | - | |
| 10253 | - Baseado no site http://www.wcrl.ars.usda.gov/cec/java/lat-long.htm | |
| 10254 | 10252 | |
| 10253 | + Baseado no site http://www.movable-type.co.uk/scripts/latlong.html (indicado por louriques@yahoo.com.br) | |
| 10254 | + | |
| 10255 | + Em versões anteriores utilizava-se o cálculo proposto em http://www.wcrl.ars.usda.gov/cec/java/lat-long.htm | |
| 10256 | + | |
| 10255 | 10257 | Parameters: |
| 10256 | 10258 | |
| 10257 | - lga {Numeric} - x inicial. | |
| 10259 | + lon1 {Numeric} - x inicial. | |
| 10258 | 10260 | |
| 10259 | - lta {Numeric} - y inicial | |
| 10261 | + lat1 {Numeric} - y inicial | |
| 10260 | 10262 | |
| 10261 | - lgb {Numeric} - x final | |
| 10263 | + lon2 {Numeric} - x final | |
| 10262 | 10264 | |
| 10263 | - ltb {Numeric} - y final | |
| 10265 | + lat2 {Numeric} - y final | |
| 10264 | 10266 | |
| 10265 | 10267 | Return: |
| 10266 | 10268 | |
| 10267 | 10269 | Type: |
| 10268 | 10270 | {Numeric} |
| 10269 | 10271 | */ |
| 10270 | - distancia: function(lga,lta,lgb,ltb){ | |
| 10271 | - try{ | |
| 10272 | - var er = 6366.707; | |
| 10273 | - var radlat1 = Math.PI * lta/180; | |
| 10274 | - var radlat2 = Math.PI * ltb/180; | |
| 10275 | - var radlong1 = Math.PI * lga/180; | |
| 10276 | - var radlong2 = Math.PI * lgb/180; | |
| 10277 | - if (lta > 0) {radlat1=Math.PI/2-radlat1;} | |
| 10278 | - if (lta < 0) {radlat1=Math.PI/2+radlat1;} | |
| 10279 | - if (lga < 0) {radlong1=Math.PI*2-radlong1;} | |
| 10280 | - if (ltb > 0) {radlat2=Math.PI/2-radlat2;} | |
| 10281 | - if (ltb < 0) {radlat2=Math.PI/2+radlat2;} | |
| 10282 | - if (lgb < 0) {radlong2=Math.PI*2-radlong2;} | |
| 10283 | - var x1 = er * Math.cos(radlong1)*Math.sin(radlat1); | |
| 10284 | - var y1 = er * Math.sin(radlong1)*Math.sin(radlat1); | |
| 10285 | - var z1 = er * Math.cos(radlat1); | |
| 10286 | - var x2 = er * Math.cos(radlong2)*Math.sin(radlat2); | |
| 10287 | - var y2 = er * Math.sin(radlong2)*Math.sin(radlat2); | |
| 10288 | - var z2 = er * Math.cos(radlat2); | |
| 10289 | - var d = Math.sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2)+(z1-z2)*(z1-z2)); | |
| 10290 | - //side, side, side, law of cosines and arccos | |
| 10291 | - var theta = Math.acos((er*er+er*er-d*d)/(2*er*er)); | |
| 10292 | - return theta*er; | |
| 10293 | - } | |
| 10294 | - catch(e){return (0);} | |
| 10272 | + distancia: function(lon1,lat1,lon2,lat2){ | |
| 10273 | + var R = 6371; // km | |
| 10274 | + var dLat = ((lat2-lat1))* Math.PI / 180; | |
| 10275 | + var dLon = ((lon2-lon1)) * Math.PI / 180; | |
| 10276 | + var a = Math.sin(dLat/2) * Math.sin(dLat/2) + | |
| 10277 | + Math.cos(lat1 * Math.PI / 180) * Math.cos(lat2 * Math.PI / 180) * | |
| 10278 | + Math.sin(dLon/2) * Math.sin(dLon/2); | |
| 10279 | + var c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1-a)); | |
| 10280 | + var d = R * c; | |
| 10281 | + return d; | |
| 10295 | 10282 | }, |
| 10296 | 10283 | /* |
| 10297 | 10284 | Function: rect2ext | ... | ... |
exemplos/calculo1.htm
| ... | ... | @@ -4,16 +4,20 @@ |
| 4 | 4 | <meta http-equiv="Category" content="I3Geo Mapa interativo MMA geoprocessamento sig mobile"> |
| 5 | 5 | <META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=ISO-8859-1"> |
| 6 | 6 | <title>i3Geo - Mapa interativo</title> |
| 7 | -<script type="text/javascript" src="../classesjs/i3geonaocompacto.js"></script> | |
| 7 | +<script type="text/javascript" src="../classesjs/i3geoo.js"></script> | |
| 8 | 8 | <style> |
| 9 | 9 | p{font-size:16px;text-align:left;padding:10px;} |
| 10 | 10 | </style> |
| 11 | 11 | </head> |
| 12 | 12 | <body style="background:white;text-align:left"> |
| 13 | -<p>Cálculos de distância<br> | |
| 13 | +<p>Cálculos de distância em km<br> | |
| 14 | 14 | <script> |
| 15 | 15 | var calc = i3GEO.calculo.distancia(-50,-10,-50,10) |
| 16 | 16 | document.body.innerHTML += "<p>-50,-10,-50,10 = "+calc |
| 17 | +var calc = i3GEO.calculo.distancia(-50,10,-50,-10) | |
| 18 | +document.body.innerHTML += "<p>-50,10,-50,-10 = "+calc | |
| 19 | +var calc = i3GEO.calculo.distancia(-1,53,0,52) | |
| 20 | +document.body.innerHTML += "<p>-1,53,0,52 = "+calc | |
| 17 | 21 | </script> |
| 18 | 22 | </body> |
| 19 | 23 | </html> |
| 20 | 24 | \ No newline at end of file | ... | ... |
exemplos/index.html
| ... | ... | @@ -35,4 +35,6 @@ body,td |
| 35 | 35 | <p>Aplicativos customizados</p> |
| 36 | 36 | <p><a href="aplic1.htm" target="_blank" >Busca rápida</a></p> |
| 37 | 37 | <p><a href="aplic2.htm" target="_blank" >Adiciona uma camada extra via javascript</a></p> |
| 38 | +<p>Cálculos</p> | |
| 39 | +<p><a href="calculo1.htm" target="_blank" >Distâncias</a></p> | |
| 38 | 40 | </body> | ... | ... |