Mostrar/Ocultar

 Calculo de distancias en Google Earth - Esfera y Elipsoide 🗺️


Foro de Programación de Google Earth y Maps Foro de Programación de Google Earth y Maps: Programación con las APIs de Google: Google Earth, Google Maps, KML, Aplicaciones Moviles
SubForos: Java - Kmz - Google Maps - Herramientas - Html - Javascript - Excel - Php - Programacion
Página 1 de 1 - Tema con 17 Mensajes y 43831 Lecturas
Último Mensaje:
Autor Mensaje

Morta
Veterano

Veterano
Registrado:
09-10-2008
Mensajes: 64

Votos: 0 👍
Responder citando
Hola
Estoy tratando de dibujar un circulo alrededor de un punto siguiendo las instrucciones de esta página
code.google.com/ ...tries.html y mas concretamente basándome en este ejemplo
earth-api-samples.googlecode.com/ ...metry.html
(en la página earth-api-samples.googlecode.com/ ...index.html también hay un ejemplo)

El caso es que me ocurre una cosa curiosa. Si dibujo el circulo en las coordenadas 0,0 (como hacen en los ejemplos), aparece un circulo perfecto pero cuando las coordenadas se van aproximando hacia el norte o el sur, el circulo se va conviertiendo en un ovalo.
¿Alguien sabe por qué ocurre esto? y mejor aún ¿alguien sabe como solucionarlo?

Buscando por ahí he encontrado esto groups.google.com/ ...5e5639d8f9 y citan esta página donde al parecer han resuelto el tema www.barnabu.co.uk/geapi/polyplot/ pero no soy capaz de aplicar esa solución en mi página.

Aquí copio el código de mi ejemplo donde dibujo una serie de circulos partiendo desde las coordenadas 0,0 hacia el norte y hacia el sur. Si salvas la pagina como .html y la abres con el navegador podrás ver el resultado.

A ver si alguien puede ayudarme con esto.
Muchas gracias y un saludo

------












Var ge = null;
Google.load("earth", "1");

Function init() {
Google.earth.createInstance("map3d", initCallback, failureCallback);
}

Function initCallback(instance) {
ge = instance;
ge.getWindow().setVisibility(true);
ge.getNavigationControl().setVisibility(ge.VISIBILITY_SHOW);
CreateMultiGeometry();

}

Function failureCallback(errorCode) {
}

//DIBUJAMOS UN CIRCULO QUE DELIMITA LOS 50 KM ALREDEDOR DEL PUNTO
function createMultiGeometry() {
function makeCircle(radius, x, y) {
var center = ge.getView().copyAsLookAt(ge.ALTITUDE_RELATIVE_TO_GROUND);
var ring = ge.createLinearRing('');
var steps = 150;
var pi2 = Math.PI * 2;
for (var i = 0; i < steps; i++) {
var lat = center.getLatitude() + x + radius * Math.cos(i / steps * pi2);
var lng = center.getLongitude()+ y + radius * Math.sin(i / steps * pi2);
ring.getCoordinates().pushLatLngAlt(lat, lng, 0);
}
return ring;
}

var multGeoPlacemark = ge.createPlacemark('');
multGeoPlacemark.setGeometry(ge.createMultiGeometry(''));
multGeoPlacemark.setStyleSelector(ge.createStyle(''));
var lineStyle = multGeoPlacemark.getStyleSelector().getLineStyle();
lineStyle.setWidth(3);
lineStyle.getColor().set('ff0000FF');
var geoms = multGeoPlacemark.getGeometry().getGeometries();

//DIBUJAMOS LOS CIRCULOS
geoms.appendChild(makeCircle(5,-100,1));
geoms.appendChild(makeCircle(5,-90,0));
geoms.appendChild(makeCircle(5,-80,0));
geoms.appendChild(makeCircle(5,-70,0));
geoms.appendChild(makeCircle(5,-60,0));
geoms.appendChild(makeCircle(5,-50,0));
geoms.appendChild(makeCircle(5,-40,0));
geoms.appendChild(makeCircle(5,-30,0));
geoms.appendChild(makeCircle(5,-20,0));
geoms.appendChild(makeCircle(5,-10,0));
geoms.appendChild(makeCircle(5,0,0)); //ESTA ES LA COORDENADA 0,0
geoms.appendChild(makeCircle(5,10,0));
geoms.appendChild(makeCircle(5,20,0));
geoms.appendChild(makeCircle(5,30,0));
geoms.appendChild(makeCircle(5,40,0));
geoms.appendChild(makeCircle(5,50,0));
geoms.appendChild(makeCircle(5,60,0));
geoms.appendChild(makeCircle(5,70,0));
geoms.appendChild(makeCircle(5,80,0));
geoms.appendChild(makeCircle(5,90,0));

Ge.getFeatures().appendChild(multGeoPlacemark);
}







Ir arriba Morta Compartir:

_polifemo
SuperExpert

SuperExpert
Registrado:
27-11-2009
Mensajes: 436

Votos: 0 👍
Responder citando
Hombre Morta, cuanto tiempo. Bienvenido de nuevo.

A ver si este finde podemos sacar algo.
Ir arriba _polifemo Compartir:

Morta
Veterano

Veterano
Registrado:
09-10-2008
Mensajes: 64

Votos: 0 👍
Responder citando
Hola Poligemo ¿que tal?
Hacía bastante que no programaba en GE y llevo tiempo detras de solucionar este tema pero no doy con ello. He encontrado otro ejemplo que parece que lo consigue también earth-api-samples.googlecode.com/ ...index.html

He probado de otra forma (algunas de las cosas sobran pero como estoy intentando que funcione no las he quitado todavía)
Esto mas o menos hace lo que yo quiero pero el problema que tengo es que quisiera que el circulo fuesen 50 km alrededor del punto y lo mas que consigo aproximarme (y realmente no se si está bien) es un radio de 82 km y no se como cambiarlo
Este es el código, que está basado en el de www.barnabu.co.uk/geapi/polyplot/


Un saludo y muchas gracias
------

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>PolyPlot - draw and compute areas of polygons on Google Earth</title>
<meta http-equiv="content-type" content="text/html; charset=utf-8" />
<meta name="description" content="Ployplot, draw and calculate the area of regular polygons on the surface of the globe. Using the Google Earth Plugin" />
<meta name="author" content="James Stafford" />

<script src="http://www.google.com/jsapi?key=ABQIAAAArCZgeQ8ddm8YbeJQqqHN5BTYrZjdppbykE52CdH9dtH9wJ0VsBQSgm6ZbaTJsaMARyyYkz_JttmHMQ"></script>


<script type="text/javascript">
Var pi = Math.PI;
Function Polygon(lat,lon,lata,lona,sides) {
var me = this;
me.numsides = 120;
me.cent = new PM(lat,lon,'centre','ffff0000');
me.rad = new PM(lata,lona,'outer','ffff0000');
me.setBearDist();

var lineStringPlacemark = ge.createPlacemark('');
me.lineString = ge.createLineString('');
lineStringPlacemark.setGeometry(me.lineString);
me.lineString.setTessellate(true);
me.drawPolygon();
ge.getFeatures().appendChild(lineStringPlacemark);
lineStringPlacemark.setStyleSelector(ge.createStyle(''));
me.lineStyle = lineStringPlacemark.getStyleSelector().getLineStyle();
}


Polygon.prototype.setBearDist = function() {
this.bear = bearing(this.cent.lat,this.cent.lon, this.rad.lat, this.rad.lon);
this.dist = distance(this.cent.lat,this.cent.lon, this.rad.lat, this.rad.lon);
document.getElementById('rad').innerHTML = this.dist.toPrecision(6).toString()+' km';
document.getElementById('bear').innerHTML = this.bear.toDeg().toPrecision(5).toString()+' deg';
}

Polygon.prototype.setRad = function() {
var latlon = destination(this.cent.lat,this.cent.lon, this.dist,this.bear);
this.rad.setLoc (latlon[0],latlon[1]);
}

Polygon.prototype.colour = function(col) {
this.lineStyle.getColor().set(col);
}


Polygon.prototype.drawPolygon = function() { // Draw our Polygon
var latlon;
this.lineString.getCoordinates().clear();
for (i=0; i <=this.numsides; i++) {
latlon = destination(this.cent.lat,this.cent.lon,this.dist,this.bear+i*2*pi/this.numsides);
this.lineString.getCoordinates().pushLatLngAlt(latlon[0],latlon[1],0);
}
this.areaCircum();
}

Function PM(lat,lon,name,colour) { // Create Placemark
var me = this;
me.active = false;
me.name = name;
me.placemark = ge.createPlacemark('');
ge.getFeatures().appendChild(me.placemark);
me.point = ge.createPoint('');
me.placemark.setStyleSelector(ge.createStyle(''));
var IconStyle = me.placemark.getStyleSelector().getIconStyle();
IconStyle.getColor().set(colour);
IconStyle.getHotSpot().setXUnits(ge.UNITS_FRACTION);
IconStyle.getHotSpot().setYUnits(ge.UNITS_FRACTION);
IconStyle.getHotSpot().setX(0.5);
IconStyle.getHotSpot().setY(0.5);
me.setLoc(lat,lon);
}

PM.prototype.setLoc = function(lat,lon) { // set location of placemark.
this.lat = lat.toRad();
this.lon = lon.toRad();
this.point.setLatLng(lat,lon.fixLon());
document.getElementById(this.name).innerHTML = lat.toPrecision(7).toString()+' , '+lon.toPrecision(7).toString();
}

Polygon.prototype.movePMLoc = function(kmlEvent) {
if (!this.rad.active && !this.cent.active) {
this.colour('ffff0000');
}
else {
kmlEvent.preventDefault();
this.colour('ffff0000');
if (this.rad.active) {
this.rad.setLoc (kmlEvent.getLatitude(),kmlEvent.getLongitude());
this.setBearDist();
this.drawPolygon();
}
else { // only pick up centre placemark if vertex placemark not selected
this.cent.setLoc (kmlEvent.getLatitude(),kmlEvent.getLongitude());
this.setRad();
this.drawPolygon();
}
}
}

Polygon.prototype.completelyNewLoc = function(kmlEvent) {

if(kmlEvent.getAltKey()){
this.cent.active = false;
this.rad.active = true;
this.cent.setLoc(kmlEvent.getLatitude(),kmlEvent.getLongitude());
this.rad.setLoc(kmlEvent.getLatitude(),kmlEvent.getLongitude());
this.colour('ffff0000');
}
}


PM.prototype.draw = function() {
this.active = true;
}

PM.prototype.undraw = function() {
this.active = false;
}

Polygon.prototype.areaCircum = function() { // compute area and circumference of Polygon

var area = 0;
var circum = 0;
var latlon;
if (this.numsides == 25){ // area of spherical circle = 2*pi*R^2*(1-cos(radius))
area = 2*pi*6371*6371*(1-Math.cos(this.dist/6371));
circum = 2*pi*6371*(Math.sin(this.dist/6371));
}
else if(this.numsides != 2){ // Spherical Polygon of n sides, theta is sum of internal angles: area = (theta-(n-2)*pi)*R^2
var latlon = destinationr(0,0,this.dist,pi);
var latlon2 = destinationr(0,0,this.dist,pi-2*pi/this.numsides);
var ang = 2*bearing(latlon[0],latlon[1],latlon2[0],latlon2[1]);
area = ((this.numsides*ang)-(this.numsides-2)*pi)*6371*6371;
circum = this.numsides*distance(latlon[0],latlon[1],latlon2[0],latlon2[1]);
}
}

Number.prototype.toRad = function() { // convert degrees to radians
return this * pi / 180;
}

Number.prototype.toDeg = function() { // convert radians to degrees
return this * 180 / pi;
}


Number.prototype.fixLon = function() { // keep longitude in range -180 to 180
lon = this;
while (lon < -180) {lon +=360;}
while (lon > 180) {lon -=360;}
return parseFloat(lon);

}


Function distance (lata,lona,latb,lonb) { // great circle distance (km)
return Math.acos(Math.sin(lata)*Math.sin(latb)+Math.cos(lata)*Math.cos(latb)*Math.cos(lonb-lona))*6371;
}

Function bearing(lata,lona,latb,lonb) { // initial great circle bearing (rad)
return Math.atan2(Math.sin(lonb-lona)*Math.cos(latb), Math.cos(lata)*Math.sin(latb)-Math.sin(lata)*Math.cos(latb)*Math.cos(lonb-lona))
}

Function destination(lata,lona,dist,brng) { // destination along great circle. returns values in degrees
var latb = Math.asin(Math.sin(lata)*Math.cos(dist/6371) + Math.cos(lata)*Math.sin(dist/6371)*Math.cos(brng));
var lonb = lona+Math.atan2(Math.sin(brng)*Math.sin(dist/6371)*Math.cos(lata), Math.cos(dist/6371)-Math.sin(lata)*Math.sin(latb));
return [180*latb/pi, 180*lonb/pi]

}

Function destinationr(lata,lona,dist,brng) { // destination along great circle. returns value in radians
var latb = Math.asin(Math.sin(lata)*Math.cos(dist/6371) + Math.cos(lata)*Math.sin(dist/6371)*Math.cos(brng));
var lonb = lona+Math.atan2(Math.sin(brng)*Math.sin(dist/6371)*Math.cos(lata), Math.cos(dist/6371)-Math.sin(lata)*Math.sin(latb));
return [latb, lonb]

}

</script>

<script type="text/javascript">
Google.load("earth", "1", {'other_params': 'sensor=false' });
Var ge = null;
Var pm = null;

Function init() {
google.earth.createInstance("map3d", initCB, failureCB);
}

Function initCB(object) {
ge = object;

ge.getWindow().setVisibility(true);
ge.getOptions().setStatusBarVisibility(true);
var navControl = ge.getNavigationControl();
navControl.setVisibility(ge.VISIBILITY_SHOW);




var dist=5;
var R = 6371;
var d = parseFloat(dist)/R; // d = angular distance covered on earth's surface
var lat1 = 42.32331619631114;
var lon1 = 2.598912324753657;
lat1 = lat1.toRad();
lon1 = lon1.toRad();


var bear=1;
bear = bear.toRad();
var lat2 = lat1 + d*Math.cos(bear);
var dLat = lat2-lat1;
var dPhi = Math.log(Math.tan(lat2/2+Math.PI/4)/Math.tan(lat1/2+Math.PI/4));
var q = (!isNaN(dLat/dPhi)) ? dLat/dPhi : Math.cos(lat1); // E-W line gives dPhi=0
var dLon = d*Math.sin(bear)/q;
// check for some daft bugger going past the pole
if (Math.abs(lat2) > Math.PI/2) lat2 = lat2>0 ? Math.PI-lat2 : -(Math.PI-lat2);
lon2 = (lon1+dLon+3*Math.PI)%(2*Math.PI) - Math.PI;
/*
La segunda coordenada se obtiene restando el valor obtenido
En el codigo anterior a las coordenadas originales.
NO SE SI ES CORRECTO ESTO
*/
Pm = new Polygon(42.32331619631114,2.598912324753657,42.32331619631114-lat2,2.598912324753657-lon2,document.getElementById('polygonselect').value);



// Creamos la vista para que salga centrado

Var lookAt = ge.createLookAt('');
LookAt.setLatitude(42.32331619631114);
LookAt.setLongitude(2.598912324753657);
LookAt.setRange(400000.0);
Ge.getView().setAbstractView(lookAt);

}

Function failureCB(object) {
// alert('load failed');
}

</script>
<style type="text/css">
Select.s {font-size: 10px;}
Input.vs {font-size: 8px;}
Input.s {font-size: 9px;}
</style>
</head>
<body onload='init()' id='body'>
<div style='float:left; width:250px; height:550px; overflow:auto'>

<table style='font-size:small'>

<tr><td>Centre: </td><td><span id='centre'></span></td></tr>
<tr><td>Vertex: </td><td><span id='outer'></span></td></tr>
<tr><td>Radius: </td><td><span id='rad'></span></td></tr>
<tr><td>Bearing: </td><td><span id='bear'></span></td></tr>

<script type="text/javascript">pm.drawPolygon();</script>
<tr><td><form id="shape" action='javascript:void(0);'><p>
<select name="polygon" id="polygonselect" onchange='pm.numsides = this.value; pm.drawPolygon()' class="s">
<option value="100" class="vs">Circle</option>
<option value="2" class="vs">Line</option>
<option value="3" class="vs">Triangle</option>
<option value="4" class="vs">Square</option>
<option value="5" class="vs">Pentagon</option>
<option value="6" class="vs">Hexagon</option>
<option value="7" class="vs">Heptagon</option>
<option value="8" class="vs">Octagon</option>
<option value="9" class="vs">Nonagon</option>
<option value="10" class="vs">Decagon</option>
<option value="11" class="vs">Hendecagon</option>
<option value="12" class="vs">Dodecagon</option>
</select></p></form></td><td>

</table>

<hr />
</div>
<div id='map3d_container' style='border: 1px solid silver; height: 550px; margin-left:250px;'>
<div id='map3d' style='height: 100%;'></div>
</div>
</body>
</html>
Ir arriba Morta Compartir:

Morta
Veterano

Veterano
Registrado:
09-10-2008
Mensajes: 64

Votos: 0 👍
Responder citando
Hola Polifemo
Creo que ya lo he resuelto basándome en este post bbs.keyhole.com/ ...d=1#import
En él, el autor facilita un código en PHP que utiliza en un página suya que, por cierto, no funciona dev.bt23.org/keyhole/circlegen/
Solo he tenido que convertirlo a javascript. Creo que está bien y funciona correctamente en cualquier coordenada

Un saludo





Generar un circulo de radio en km en Google Earth



Google.load("earth", "1");
Var ge = null;

Function init() {
google.earth.createInstance("map3d", initCB, failureCB);
}

Function initCB(instance) {
Ge = instance;
Ge.getWindow().setVisibility(true);
Ge.getOptions().setStatusBarVisibility(true);
Ge.getNavigationControl().setVisibility(ge.VISIBILITY_SHOW);

// Creamos la vista para que salga centrado

Var lookAt = ge.createLookAt('');
LookAt.setLatitude(42.32331619631114);
LookAt.setLongitude(2.598912324753657);
LookAt.setRange(400000.0);
Ge.getView().setAbstractView(lookAt);


CreateMultiGeometry();
}
Function failureCB(object) {
alert('Error al generar el circulo');
}
//coordenadas alrededor de las que se dibujará el circulo
Var lat1="42.32331619631114";
Var lon1="2.598912324753657";
Var radio="25000";//radio del circulo en metros
Var pi = Math.PI;
//convertimos los grados a radianes
Lat1 = lat1 * pi / 180;
Lon1 = lon1 * pi / 180;
//convertimos el radio segun el elipsoide de referencia WGS 84 en.wikipedia.org/ ..._the_Earth
Var d_radio = radio/6378137;

Function createMultiGeometry() {
Function dibujar_circulo() {
Var center = ge.getView().copyAsLookAt(ge.ALTITUDE_RELATIVE_TO_GROUND);
Var ring = ge.createLinearRing('');
//genera las coordenadas
Var radial;
Var lat_rad;
Var dlon_rad;
Var lon_rad;
for (var i = 0; i
Ir arriba Morta Compartir:

_polifemo
SuperExpert

SuperExpert
Registrado:
27-11-2009
Mensajes: 436

Votos: 0 👍
Responder citando
Enhorabuena Morta: la verdad es que aún no había tenido tiempo de ponerme con tu código.

¿Te has fijado que tienes la función dibujar_circulo() dentro de createMultiGeometry()?, ademas al estar return ring; fuera de la primera no se si te dará algún tipo de problema (creo que si pues ring está declarada como variable local y por lo tanto no debería llegar a la segunda función).

Que sepas (a modo de curiosidad) que para el calculo de las distancias aplica trigonometría esférica. Y probablemente la razón por la que en los primeros ejemplos los cículos parecían elipses sería que utilizaban trigonometría plana (o del espacio Euclídeo).

Una cosilla mas para que la tengas presente en un futuro. Las distancias que calculas van a ser bastante aproximadas, pero mantienen un error en tanto que aquí:

Code::
//convertimos el radio segun el elipsoide de referencia WGS 84 en.wikipedia.org/wiki/..._the_Earth
Var d_radio = radio/6378137;

Para calcular la distancia angular tomas el radio ecuatorial (el ideal sería el correspondiente a la latitud de tu trabajo).

Enhorabuena Morta, un trabajo muy meritorio.
Ir arriba _polifemo Compartir:

Morta
Veterano

Veterano
Registrado:
09-10-2008
Mensajes: 64

Votos: 0 👍
Responder citando
Hola Polifemo
Si, ya se, pero está copy-pasteado de la página code.google.com/ ...tries.html Si te fijas, donde hablan de la creación de circulos el código está escrito así. El caso es que funciona Sonriente

Seguramente que el motivo de que aparecieran como óvalos a medida que te alejas del ecuador sea ese que comentas de utilizar trigonometría plana. Para mi un error muy grave por parte de Google ya que ellos deberían de saber mejor que nadie que la tierra no es plana Sonriente

Al parecer, el autor del código en el que me he basado utiliza una aplicación de la fórmula del haversine es.wikipedia.org/ ..._Haversine. Por cierto que en esa página hay un enlace superinteresante donde desarrollan la fórmula para 9 lenguajes www.codecodex.com/ ...on_a_Globe Seguro que a mas de uno le resulta útil.

En cuanto al error que comentas soy consciente de ello pero tampoco buscaba la exactitud milimétrica así que a mi me vale. Seguro que utilizar la latitud correcta en cada caso me complicaría demasiado el código.

Un saludo y muchas gracias
Ir arriba Morta Compartir:

_polifemo
SuperExpert

SuperExpert
Registrado:
27-11-2009
Mensajes: 436

Votos: 0 👍
Responder citando
Morta Escribio:

Para mi un error muy grave por parte de Google ya que ellos deberían de saber mejor que nadie que la tierra no es plana :-)

Bastante, pero me da la impresión que esto ocurre por que muchas funciones traen la herencia de gmaps, (la cual por utilizar la proyección plana de Mercator funciona "visualmente" bien con trigonometría plana)

Morta Escribio:

Por cierto que en esa página hay un enlace superinteresante donde desarrollan la fórmula para 9 lenguajeswww.codecodex.com/wiki...on_a_Globe Seguro que a mas de uno le resulta útil.

Y tanto. Lástima que parta del supuesto de una tierra esférica.

Cada aportación tuya enriquece este foro, y siempre, después de hablar contigo aprendo algo. Así que muchas gracias a tí.

Hasta la próxima.
Ir arriba _polifemo Compartir:

Morta
Veterano

Veterano
Registrado:
09-10-2008
Mensajes: 64

Votos: 0 👍
Responder citando
Hola Polifemo de eso se trata que entre todos podamos conseguir hacer lo que nos apetece hacer. Siempre he pensado que los foros bien usados son una gran ayuda para aprender y saber. Si la gente se enrolla a ayudar y a dar a conocer lo que sabe es bueno para todos. La lástima es que la mayoría de las veces los foros no son usados para eso.

No entiendo lo que comentas de que es una lástima que en la páginahttp://www.codecodex.com/wiki...on_a_Globe partan del supuesto de que la tierra es esférica. ¿Puedes aclararlo, por favor?

Un saludo
Ir arriba Morta Compartir:

_polifemo
SuperExpert

SuperExpert
Registrado:
27-11-2009
Mensajes: 436

Votos: 0 👍
Responder citando
Morta Escribio:

Hola Polifemo de eso se trata que entre todos podamos conseguir hacer lo que nos apetece hacer. Siempre he pensado que los foros bien usados son una gran ayuda para aprender y saber. Si la gente se enrolla a ayudar y a dar a conocer lo que sabe es bueno para todos. La lástima es que la mayoría de las veces los foros no son usados para eso.

Ahí le has dado.

Morta Escribio:

No entiendo lo que comentas de que es una lástima que en la páginahttp://www.codecodex.com/wiki...on_a_Globe partan del supuesto de que la tierra es esférica. ¿Puedes aclararlo, por favor?

Por supuesto que puedo: las "formulas de Haversine" calculan elementos de triángulos sobre esferas. Pero en realidad la figura geométrica (matemáticamente descriptible) que mas se aproxima a la verdadera forma de la tierra es un elipsoide (o una esfera achatada por los polos).

Para muchas aplicaciones (como la tuya) basta con aproximar la forma real de la tierra a una esfera. En cambio existen otro tipo de trabajos, de carácter mas preciso para los que no puedes suponer esa aproximación (como ciertas obras de ingeniería, que exigen que el oleoducto encaje al centímetro; cosa que no ocurre si no se toman los cálculos de acuerdo al verdadero radio en esa latitud) .

Supongo que mas que nada estaba pensando en voz alta al observar que dicho código no me serviría llegado el momento. No sin las oportunas modificaciones.

Un saludo y espero no haberos aburrido.
Ir arriba _polifemo Compartir:

Morta
Veterano

Veterano
Registrado:
09-10-2008
Mensajes: 64

Votos: 0 👍
Responder citando
Ya. Entiendo. Es cierto que la tierra no es exactamente una esfera. Ahora el reto sería entonces modificar el código para que, teniendo en cuenta la latitud y por tanto el radio, dibujara el circulo exacto.

Cuando me jubile y tenga tiempo... Sonriente

Un saludo y muchas gracias

¿No existirá alguna formulita tipo la del haversine para eso? Seguro que si
Ir arriba Morta Compartir:

Eneka
Usuario Habitual

Usuario Habitual
Registrado:
04-07-2009
Mensajes: 43
Visitar sitio web del autor
Votos: 0 👍
Responder citando
Holas

Yo tengo un problema más cachondo, distancia y ángulo entre dos coordenadas

Dados dos puntos de coordenadas cualesquiera

Lat1=-31.6338658159 ;lon1=-64.4140642151;\
|> Estan separados 10.91 metros segun google earth
Lat2=-31.6338775297 ;lon2=-64.4139494791;/

//Radio de la Tierra en metros :6372797.560856

Lat1=-31.6338658159 ;lon1=-64.4140642151;
Lat2=-31.6338775297 ;lon2=-64.4139494791;

Esto lo saqué de una página de intet, y funciona si no te saltas ningún paréntesis. Considerando que la tierra es esférica (aunque no lo sea el error provocado es menor de 0.5 %)

Distancia en metros = (acos(sin(deg2rad(lat1)) * sin(deg2rad(lat2)) +cos(deg2rad(lat1)) * cos(deg2rad(lat2)) *cos(deg2rad(lon1) - deg2rad(lon2))) * 6372797.560856)
Hasta aquí solucionado


Ejemplo
www.urumea3d.eu/ ...puntos.jpg

¿Cual sería el ángulo de estos dos puntos respecto del meridiano?
Le he preguntado a google unas 300 veces, pero no hay manera
Sonriente

Salu2
Nk
Ir arriba Eneka Compartir:

_polifemo
SuperExpert

SuperExpert
Registrado:
27-11-2009
Mensajes: 436

Votos: 0 👍
Responder citando
Morta encontré un algoritmo que realiza los cálculos sobre el elipsoide:

es.wikipedia.org/ ...e_Vincenty

Incluido el código fuente en javascript:

www.movable-type.co.uk/ ...centy.html

Que gran invento este de internet, ¿no? Muy feliz


Última edición por _polifemo el Lun, 11-04-2011 8:32, editado 1 vez
Ir arriba _polifemo Compartir:

_polifemo
SuperExpert

SuperExpert
Registrado:
27-11-2009
Mensajes: 436

Votos: 0 👍
Responder citando
Eneka, tu respuesta está en la trigonometría esférica:

es.wikipedia.org/ ...%C3%A9rica

No es precisamente un asunto simple el que pretendes, así que ármate de paciencia.

:wink:
Ir arriba _polifemo Compartir:

Morta
Veterano

Veterano
Registrado:
09-10-2008
Mensajes: 64

Votos: 0 👍
Responder citando
Hola Polifemo
Supongo que la respuesta que donde dices que ya has encontrado la fórmula es.wikipedia.org/ ...e_Vincenty se refiere a mi comentario ¿no?
Mis conocimientos matemáticos no son muy amplios así que lo que veo casi me parece chino Trist
De cualquier forma, muchas gracias
Ir arriba Morta Compartir:

_polifemo
SuperExpert

SuperExpert
Registrado:
27-11-2009
Mensajes: 436

Votos: 0 👍
Responder citando
Edité el mensaje esta mañana, tienes otro link que lleva al código fuente en javascript.

De todos modos, el código que tenías es mas que suficiente, yo no lo cambiaría.

Era simplemente por dejarlo compartido.
Ir arriba _polifemo Compartir:

Morta
Veterano

Veterano
Registrado:
09-10-2008
Mensajes: 64

Votos: 0 👍
Responder citando
Ah, vaya.. No vi el mensaje editado
Muchas gracias. Creo que no lo cambiaré porque tampoco buscaba una exactitud precisa.
Ir arriba Morta Compartir:

Google_Master
Admin

Admin
Registrado:
01-06-2006
Mensajes: 16225
Visitar sitio web del autor Perfil de Twitter Perfil de Facebook
Votos: 0 👍
Responder citando
Lo siento, Morta

Lo movi yo, pero me olvide de avisarte. Avergonzado

_________________
Cada vez que sacio una curiosidad, me nacen diez...
Ir arriba Google_Master Compartir:
Mostrar mensajes de anteriores:   
SubForos: Java - Kmz - Google Maps - Herramientas - Html - Javascript - Excel - Php - Programacion
 Responder al tema   Versión Imprimible
Todas las horas son GMT + 1 Hora
Página 1 de 1 - Tema con 17 Mensajes y 43831 Lecturas - Última modificación: 12/04/2011




RSS: Foro Programación de Google Earth y Maps RSS - Ultimos Mensajes
Cambiar a:  


Puede publicar nuevos temas en este foro
No puede responder a temas en este foro
No puede editar sus mensajes en este foro
No puede borrar sus mensajes en este foro
No puede votar en encuestas en este foro
No Puedes adjuntar archivos en este foro
Tu puedes descargar archivos en este foro



Mostrar/Ocultar Últimas Fotos del Foro