Mostrar/Ocultar
Mostrar/Ocultar Foros
Mostrar/Ocultar Google +1
Pag. de Facebook
Mostrar/Ocultar Menú principal
Mostrar/Ocultar Publicidad

 Calculo de distancias en Google Earth - Esfera y Elipsoide Compartir


Foro de Programación para Google Earth y Maps  Foro de Programación para Google Earth y Maps:  Foro sobre temas de programación con las API de Google Earth, Google Maps, KML, Aplicaciones Moviles

Ir a página 1, 2  Siguiente
Foros de Google Earth Ayuda y Soporte TecnicoForo de Programación para Google Earth y Maps
SubForos: KML - Google Maps - Html - Kmz - Java - Javascript - Php - Programacion - Excel
Compartir enlaces Compartir enlaces

 
 
Enlace:    Corto  Largo
Copia el texto de uno de los cajones para compartir el enlace
Página 1 de 2 - Tema con 17 Mensajes y 30679 Lecturas
Último Mensaje Publicado:
Autor Mensaje
Morta
Morta
Veterano
Veterano

Registrado: Oct 09, 2008
Mensajes: 64

Envio Publicado: Vie, 25-03-2011 13:47  Asunto: Calculo de distancias en Google Earth - Esfera y Elipsoide Compartir Responder citando

Hola
Estoy tratando de dibujar un circulo alrededor de un punto siguiendo las instrucciones de esta página
code.google.com/intl/e... tries.html y mas concretamente basándome en este ejemplo
earth-api-samples.goog... metry.html
(en la página earth-api-samples.goog... 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/grou... 5e5639d8f9?#93c44c5e5639d8f9 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>
Volver arriba
Ver perfil de usuario
Compartir:
_polifemo
_polifemo
SuperExpert
SuperExpert

Registrado: Nov 27, 2009
Mensajes: 436

Envio Publicado: Vie, 25-03-2011 13:50  Asunto: Re: Dibujo de circulos en Google Earth Compartir Responder citando

Hombre Morta, cuanto tiempo. Bienvenido de nuevo.

A ver si este finde podemos sacar algo.
Volver arriba
Ver perfil de usuario
Compartir:
Morta
Morta
Veterano
Veterano

Registrado: Oct 09, 2008
Mensajes: 64

Envio Publicado: Sab, 26-03-2011 0:50  Asunto: Re: Dibujo de circulos en Google Earth Compartir 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.goog... 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>
Volver arriba
Ver perfil de usuario
Compartir:
Morta
Morta
Veterano
Veterano

Registrado: Oct 09, 2008
Mensajes: 64

Envio Publicado: Lun, 28-03-2011 12:01  Asunto: Re: Dibujo de circulos en Google Earth Compartir Responder citando

Hola Polifemo
Creo que ya lo he resuelto basándome en este post bbs.keyhole.com/ubb/ub... 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/wiki/... _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>
Volver arriba
Ver perfil de usuario
Compartir:
_polifemo
_polifemo
SuperExpert
SuperExpert

Registrado: Nov 27, 2009
Mensajes: 436

Envio Publicado: Lun, 28-03-2011 13:09  Asunto: Re: Dibujo de circulos en Google Earth Compartir 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.
Volver arriba
Ver perfil de usuario
Compartir:
Morta
Morta
Veterano
Veterano

Registrado: Oct 09, 2008
Mensajes: 64

Envio Publicado: Lun, 28-03-2011 23:31  Asunto: Re: Dibujo de circulos en Google Earth Compartir Responder citando

Hola Polifemo
Si, ya se, pero está copy-pasteado de la página code.google.com/intl/e... 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/wiki/... Haversine. Por cierto que en esa página hay un enlace superinteresante donde desarrollan la fórmula para 9 lenguajes www.codecodex.com/wiki... 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
Volver arriba
Ver perfil de usuario
Compartir:
_polifemo
_polifemo
SuperExpert
SuperExpert

Registrado: Nov 27, 2009
Mensajes: 436

Envio Publicado: Mie, 30-03-2011 8:16  Asunto: Re: Dibujo de circulos en Google Earth Compartir 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 lenguajes www.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.
Volver arriba
Ver perfil de usuario
Compartir:
Morta
Morta
Veterano
Veterano

Registrado: Oct 09, 2008
Mensajes: 64

Envio Publicado: Mie, 30-03-2011 11:19  Asunto: Re: Dibujo de circulos en Google Earth Compartir 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ágina www.codecodex.com/wiki...on_a_Globe partan del supuesto de que la tierra es esférica. ¿Puedes aclararlo, por favor?

Un saludo
Volver arriba
Ver perfil de usuario
Compartir:
_polifemo
_polifemo
SuperExpert
SuperExpert

Registrado: Nov 27, 2009
Mensajes: 436

Envio Publicado: Mie, 30-03-2011 11:54  Asunto: Re: Dibujo de circulos en Google Earth Compartir 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ágina 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.
Volver arriba
Ver perfil de usuario
Compartir:
Morta
Morta
Veterano
Veterano

Registrado: Oct 09, 2008
Mensajes: 64

Envio Publicado: Jue, 31-03-2011 17:58  Asunto: Re: Dibujo de circulos en Google Earth Compartir 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
Volver arriba
Ver perfil de usuario
Compartir:
 
Ultimo Mensaje - Publicado: 12-Abr-2011 12:50 pm
Google_Master
Google_Master
Administrador
Administrador

Registrado: Jun 01, 2006
Mensajes: 14619

Ultimo Mensaje Publicado: Mar, 12-04-2011 12:50  Asunto: Re: Calculo de distancias en Google Earth - Esfera y Elipsoi Compartir Responder citando

Lo siento, Morta

Lo movi yo, pero me olvide de avisarte. Avergonzado

_________________
Cada vez que sacio una curiosidad, me nacen diez mas...
Volver arriba
Ver perfil de usuario
Compartir:
Mostrar mensajes de anteriores:   
Foros de Google Earth > Ayuda y Soporte Tecnico > Foro de Programación para Google Earth y Maps
 Responder al tema   Versión Imprimible Ir a página 1, 2  Siguiente
Todas las horas son GMT + 1 Hora
Página 1 de 2 - Tema con 17 Mensajes y 30679 Lecturas - Última modificación: 12/04/2011




RSS: Foro de Programación para Google Earth y Maps RSS
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

Últimas búsquedas por posts: Google Earth - Api Google - Api Google Earth - Xls - Mapa - Tejidosurbanos Kml
Últimas búsquedas por topics: Foto - Capas Superpuestas - INFOWINDOW - Crear Ruta Con Kml - Codigo Google Earth - Xls Kmz

SubForos: KML - Google Maps - Html - Kmz - Java - Javascript - Php - Programacion - Excel

Este es el lugar de los amigos de Google Earth: la Comunidad de Google Earth en Español. La propiedad de nuestro portal es completamente independiente de Google y sus marcas. Todos los logos y gráficos de este sitio son propiedad de nuestra web o de nuestros usuarios. Las opiniones son de los usuarios y nosotros no tenemos porque compartirlas, rebatirlas o apoyarlas.
Aviso Legal - Privacidad - Google Earth en: Pag. de Google + Pag. de Facebook - Web amiga: LosViajeros.com