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: KML - Google Maps - Html - Kmz - Java - Javascript - Excel - Php - Programacion
P√°gina 1 de 1 - Tema con 17 Mensajes y 36434 Lecturas
√öltimo Mensaje Publicado:
Autor Mensaje
Morta
Avatar de Morta
Veterano

Veterano
Registrado:
Oct 09, 2008
Mensajes: 64

Votos: 0 ūüĎć
Enlaces Asunto:

Calculo de distancias en Google Earth - Esfera y Elipsoide

  
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 tambien 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.

Aqui 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

------

<html>
<head>
<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=iso-8859-1">
<META HTTP-EQUIV="CHARSET" CONTENT="ISO-8859-1">
<META HTTP-EQUIV="EXPIRES" CONTENT="NEVER">
<META HTTP-EQUIV="Pragma" CONTENT="no-cache">
<META HTTP-EQUIV="Cache-Control" CONTENT="no-cache">
<META HTTP-EQUIV="CONTENT-LANGUAGE" CONTENT="Spanish">
<META HTTP-EQUIV="VW96.OBJECT TYPE" CONTENT="Document">
<script src="http://www.google.com/jsapi?key=ABQIAAAArCZgeQ8ddm8YbeJQqqHN5BTYrZjdppbykE52CdH9dtH9wJ0VsBQSgm6ZbaTJsaMARyyYkz_JttmHMQ"></script>
<script type="text/javascript">
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);
}
</script>
</head>
<body onload='init()' id='body'>
<div id='map3d_container' style='border: 5px solid silver; height: 550px;'>
<div id='map3d' style='height: 100%;'></div>
</div>
</body>
</html>
Ir arriba Hola. Estoy tratando de dibujar un circulo alrededor de un punto siguiendo las instrucciones de esta p√°gina. y mas concretamente bas√°ndome en este... Morta Compartir:
_polifemo
Avatar de _polifemo
SuperExpert

SuperExpert
Registrado:
Nov 27, 2009
Mensajes: 436

Votos: 0 ūüĎć
Enlaces Asunto:

Re: Dibujo de circulos en Google Earth

  
Responder citando
Hombre Morta, cuanto tiempo. Bienvenido de nuevo.

A ver si este finde podemos sacar algo.
Ir arriba Hombre Morta, cuanto tiempo. Bienvenido de nuevo. A ver si este finde podemos sacar algo. _polifemo Compartir:
Morta
Avatar de Morta
Veterano

Veterano
Registrado:
Oct 09, 2008
Mensajes: 64

Votos: 0 ūüĎć
Enlaces Asunto:

Re: Dibujo de circulos en Google Earth

  
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 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... Morta Compartir:
Morta
Avatar de Morta
Veterano

Veterano
Registrado:
Oct 09, 2008
Mensajes: 64

Votos: 0 ūüĎć
Enlaces Asunto:

Re: Dibujo de circulos en Google Earth

  
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


<!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>Generar un circulo de radio en km en Google Earth</title>
<meta http-equiv="content-type" content="text/html; charset=utf-8" />
<script src="http://www.google.com/jsapi?key=ABQIAAAArCZgeQ8ddm8YbeJQqqHN5BTYrZjdppbykE52CdH9dtH9wJ0VsBQSgm6ZbaTJsaMARyyYkz_JttmHMQ"></script>
<script type="text/javascript">
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 <= 360; i++) { //si variamos el valor inicial de i y/o los grados, obtendremos diversas figuras ademas del circulo
radial = i * pi / 180;
lat_rad = Math.asin(Math.sin(lat1)*Math.cos(d_radio) + Math.cos(lat1)*Math.sin(d_radio)*Math.cos(radial));
dlon_rad = Math.atan2(Math.sin(radial)*Math.sin(d_radio)*Math.cos(lat1),Math.cos(d_radio)-Math.sin(lat1)*Math.sin(lat_rad));
lon_rad = parseFloat((lon1+dlon_rad + pi), 2*pi) - pi;
//convierte de radianes a grados
lon_rad=lon_rad * 180 / pi;
lat_rad=lat_rad * 180 / pi;
ring.getCoordinates().pushLatLngAlt(lat_rad, lon_rad, 0);
}
return ring;
}

var multGeoPlacemark = ge.createPlacemark('');
multGeoPlacemark.setGeometry(ge.createMultiGeometry(''));
multGeoPlacemark.setStyleSelector(ge.createStyle(''));
var lineStyle = multGeoPlacemark.getStyleSelector().getLineStyle();
lineStyle.setWidth(3); //ancho de linea
lineStyle.getColor().set('ff0000FF'); //color de linea
var geoms = multGeoPlacemark.getGeometry().getGeometries();
geoms.appendChild(dibujar_circulo());
ge.getFeatures().appendChild(multGeoPlacemark);
}
</script>
</head>
<body onload='init()' id='body'>
<div id='map3d_container' style='border: 5px solid silver; height: 550px;'>
<div id='map3d' style='height: 100%;'></div>
</div>
</body>
Ir arriba Hola Polifemo. Creo que ya lo he resuelto basándome en este post. En él, el autor facilita un código en PHP que utiliza en un página suya que, por... Morta Compartir:
_polifemo
Avatar de _polifemo
SuperExpert

SuperExpert
Registrado:
Nov 27, 2009
Mensajes: 436

Votos: 0 ūüĎć
Enlaces Asunto:

Re: Dibujo de circulos en Google Earth

  
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 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... _polifemo Compartir:
Morta
Avatar de Morta
Veterano

Veterano
Registrado:
Oct 09, 2008
Mensajes: 64

Votos: 0 ūüĎć
Enlaces Asunto:

Re: Dibujo de circulos en Google Earth

  
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 Hola Polifemo. Si, ya se, pero está copy-pasteado de la página Si te fijas, donde hablan de la creación de circulos el código está escrito así. El... Morta Compartir:
_polifemo
Avatar de _polifemo
SuperExpert

SuperExpert
Registrado:
Nov 27, 2009
Mensajes: 436

Votos: 0 ūüĎć
Enlaces Asunto:

Re: Dibujo de circulos en Google Earth

  
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 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... _polifemo Compartir:
Morta
Avatar de Morta
Veterano

Veterano
Registrado:
Oct 09, 2008
Mensajes: 64

Votos: 0 ūüĎć
Enlaces Asunto:

Re: Dibujo de circulos en Google Earth

  
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 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... Morta Compartir:
_polifemo
Avatar de _polifemo
SuperExpert

SuperExpert
Registrado:
Nov 27, 2009
Mensajes: 436

Votos: 0 ūüĎć
Enlaces Asunto:

Re: Dibujo de circulos en Google Earth

  
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 Por supuesto que puedo: las formulas de Haversine calculan elementos de triángulos sobre esferas. Pero en realidad la figura geométrica... _polifemo Compartir:
Morta
Avatar de Morta
Veterano

Veterano
Registrado:
Oct 09, 2008
Mensajes: 64

Votos: 0 ūüĎć
Enlaces Asunto:

Re: Dibujo de circulos en Google Earth

  
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 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... Morta Compartir:
Eneka
Avatar de Eneka
Usuario Habitual

Usuario Habitual
Registrado:
Jul 04, 2009
Mensajes: 43
Visitar sitio web del autor
Votos: 0 ūüĎć
Enlaces Asunto:

Re: Coordenadas geodesicas y cartesianas

  
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 Holas. Yo tengo un problema m√°s cachondo, distancia y √°ngulo entre dos coordenadas. Dados dos puntos de coordenadas cualesquiera... Eneka Compartir:
_polifemo
Avatar de _polifemo
SuperExpert

SuperExpert
Registrado:
Nov 27, 2009
Mensajes: 436

Votos: 0 ūüĎć
Enlaces Asunto:

Re: Dibujo de circulos en Google Earth

  
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 Morta encontré un algoritmo que realiza los cálculos sobre el elipsoide: Incluido el código fuente en javascript: que gran invento este de... _polifemo Compartir:
_polifemo
Avatar de _polifemo
SuperExpert

SuperExpert
Registrado:
Nov 27, 2009
Mensajes: 436

Votos: 0 ūüĎć
Enlaces Asunto:

Re: Coordenadas geodesicas y cartesianas

  
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 Eneka, tu respuesta está en la trigonometría esférica: no es precisamente un asunto simple el que pretendes, así que ármate de paciencia. _polifemo Compartir:
Morta
Avatar de Morta
Veterano

Veterano
Registrado:
Oct 09, 2008
Mensajes: 64

Votos: 0 ūüĎć
Enlaces Asunto:

Re: Calculo de distancias en Google Earth - Esfera y Elipsoide

  
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 Hola Polifemo. Supongo que la respuesta que donde dices que ya has encontrado la f√≥rmula se refiere a mi comentario ¬Ņno? Mis conocimientos... Morta Compartir:
_polifemo
Avatar de _polifemo
SuperExpert

SuperExpert
Registrado:
Nov 27, 2009
Mensajes: 436

Votos: 0 ūüĎć
Enlaces Asunto:

Re: Calculo de distancias en Google Earth - Esfera y Elipsoi

  
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 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... _polifemo Compartir:
Morta
Avatar de Morta
Veterano

Veterano
Registrado:
Oct 09, 2008
Mensajes: 64

Votos: 0 ūüĎć
Enlaces Asunto:

Re: Calculo de distancias en Google Earth - Esfera y Elipsoide

  
Responder citando
Ah, vaya.. no vi el mensaje editado
Muchas gracias. Creo que no lo cambiaré porque tampoco buscaba una exactitud precisa.
Ir arriba Ah, vaya.. no vi el mensaje editado. Muchas gracias. Creo que no lo cambiaré porque tampoco buscaba una exactitud precisa. Morta Compartir:
Google_Master
Avatar de Google_Master
Admin

Admin
Registrado:
Jun 01, 2006
Mensajes: 15499
Visitar sitio web del autor Perfil de Twitter Perfil de Facebook
Votos: 0 ūüĎć
Enlaces Asunto:

Re: Calculo de distancias en Google Earth - Esfera y Elipsoi

  
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 Lo siento, Morta. Lo movi yo, pero me olvide de avisarte. Google_Master Compartir:
Mostrar mensajes de anteriores:   
SubForos: KML - Google Maps - Html - Kmz - Java - 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 36434 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