2009-09-02 14 views

Respuesta

8

Hay una gran cantidad de información en Internet sobre el cálculo de la distancia entre dos emparejamientos de latitud y longitud. Estamos usando esos cálculos en nuestro sitio web público y no son triviales para comprender/discutir (por lo que no intentaré cubrirlos aquí). Dicho esto, son fáciles de implementar.

Una vez que tiene una función que devuelve distancia, debe poder calcular el ancho y la altura del mapa en términos de distancia entre las esquinas.

Luego puede calcular la distancia horizontal y vertical de su punto desde la esquina superior izquierda.

Ahora descubres qué proporción del ancho del mapa está representado por la distancia entre el lado izquierdo y tu punto, aplica esa relación al ancho del píxel y tienes el número de píxeles entre el lado izquierdo y el punto. Repita para el eje y.

(Píxeles desde el lado izquierdo) = (anchura total en píxeles) * ((distancia de codificación geográfica entre la izquierda y su punto de)/(distancia de codificación geográfica entre el lado izquierdo y el lado derecho))

(píxeles desde la parte superior) = (altura total en píxeles) * ((distancia del código geográfico entre la parte superior y la inferior)/(distancia del código geográfico entre la parte superior e inferior))

EDITAR: Al investigar esto más a fondo, notará que algunas soluciones presentarán resultados más precisos que otros debido al hecho de que estás aproximando la distancia entre dos puntos en una superficie esférica y mapeando eso en una superficie plana. La precisión disminuye a medida que aumenta la distancia. El mejor consejo para usted es probarlo primero y ver si satisface sus necesidades.

+0

Mapas proyectar nuestra 3D a una Superficie 2D.Como no puedes envolver perfectamente un cuadrado en una esfera, existen diferentes métodos de proyección para obtener un resultado aproximadamente correcto. Las distancias en un mapa dado no son lineales, por lo que su fórmula es solo una aproximación. –

+0

Las aproximaciones funcionan para la mayoría de las distancias. Pero debería aclarar eso en el post. – Mayo

+0

Sí, cuanto más se acerque su mapa, más preciso será el resultado. Debería ver casi cero diferencia para un mapa a nivel de ciudad, pero será notable para un mapa de nivel estatal o más grande. –

5

Hay muchos esquemas de proyección de mapas diferentes. Debería saber cuál (es) usa (n) su (s) mapa (s).

Para obtener más información sobre los algoritmos de proyección de mapas y el mapeo hacia adelante/hacia atrás, consulte this link. Proporciona las fórmulas para varias proyecciones comunes.

+0

No necesito mucha precisión, así que tal vez la solución a continuación sea suficiente. Si no es así, ¿cómo sería la transformación? ¿Cuáles son esos esquemas de Projectino? Hasta ahora he visto: UTM Mercator transversal Mercator Longitud/Latitud – Jorge

+0

BTW. También he codificado las fórmulas para convertir entre Lat/Lon y UTM. ¿Está convirtiendo de Lat/Lon a UTM y aplicando la solución por debajo de la forma correcta (al menos para las proyecciones UTM)? – Jorge

+0

¿Tus mapas están usando Mercator? Necesita saber en qué están codificados los mapas antes de poder elegir la proyección correcta. Una vez que tenga las distancias geocodificadas correctas, la fórmula de mmayo le proporciona el píxel correcto en el mapa. –

9

Si se utiliza el Equidistant Cylindrical Projection type map, esto es lo que hay que hacer:

  1. Encuentra la latitud y longitud de su ubicación de aprendizaje aquí:
    http://lifehacker.com/267361/how-to-find-latitude-and-longitude
  2. de entrada que la información en las siguientes fórmulas:
    x = (ancho total de la imagen en px) * (180 + latitud)/360
    y = (altura total de la imagen en px) * (90 - longitud)/180

    nota: al usar la longitud de latitud negativa, asegúrese de sumar o restar el número negativo, es decir,+ (- 92) o - (- 35) que en realidad sería -92 y +35

  3. Ahora tiene su X e Y para trazar sobre su imagen

    Más información se puede encontrar sobre esta fórmula y la tipo de mapa aquí:
    http://www.progonos.com/furuti/MapProj/Dither/CartHow/HowER_W12/howER_W12.html#DeductionEquirectangular
+0

¿Puede decirme cómo calcular de nuevo de X, Y a Lat lon? – colin

17

Esto es lo que funcionó para mí, sin ni siquiera ancho.

int x = (int) ((MAP_WIDTH/360.0) * (180 + lon)); 
int y = (int) ((MAP_HEIGHT/180.0) * (90 - lat)); 

Las coordenadas lat, lon me las dieron los dispositivos Android. Por lo tanto, deberían estar en el mismo estándar utilizado por todos los productos de Google Earth/Map.

+0

ahora cómo mostrar x, y. significa qué método se debe usar para xey para mostrarlo – sns

+0

@NaeemShah canvas.drawCircle (x, y, r, mPaint); –

+1

Me doy cuenta de que esta es una vieja pregunta, pero no he encontrado respuestas que hablen acerca de tener un mapa de desplazamiento y escala. Además, ¿es MAP_WIDTH/HEIGHT en grados (es decir, delta de longitud y latitud) o los valores de píxel? ¿Dónde debería tener lugar la ampliación? – OzBarry

7

Esto es bastante directo y simple ... déjame explicarte cómo es posible.

Latitude y Longitude son líneas imaginarias dibujadas en la tierra para que pueda ubicar con precisión cualquier lugar en el mundo. en pocas palabras, son los coords X e Y de un avión. Latitude es una línea vertical que va de norte a sur con sus 90 grados en el polo norte y -90 grados en el polo sur.

La longitud, por otro lado, es una línea horizontal que corre de este a sur con -180deg al oeste y 180deg al este.

puede convertir el latLng en coordenadas de píxeles suponiendo que el ancho del contenedor html es el ancho del mundo y lo mismo se aplica a la altura.

Formula - Longitud - pixel

(givenLng*widthOfContainerElement)/360 

donde 360 ​​es la longitud total de en grados

Fórmula -latitud - pixel

(givenLat*heightOfContainerElement)/180 

donde 180 es el total l atitude en grado

//Height is calculated from the bottom 

se puede encontrar una aplicación útil de esta fórmula aquí, en mi sitio web (que utiliza JavaScript única)

http://www.learntby.me/javascript/latLngconversion.php

que me haga saber si todavía necesita ningún aclaraciones.

+0

He agregado la divulgación requerida aquí –

0

Sólo hacer esto (por Mercator proyección del mapa):

extension UIView 
{ 
    func addLocation(coordinate: CLLocationCoordinate2D) 
    { 
     // max MKMapPoint values 
     let maxY = Double(267995781) 
     let maxX = Double(268435456) 

     let mapPoint = MKMapPointForCoordinate(coordinate) 

     let normalizatePointX = CGFloat(mapPoint.x/maxX) 
     let normalizatePointY = CGFloat(mapPoint.y/maxY) 

     let pointView = UIView(frame: CGRectMake(0, 0, 5, 5)) 
     pointView.center = CGPointMake(normalizatePointX * frame.width, normalizatePointY * frame.height) 

     pointView.backgroundColor = UIColor.blueColor() 

     addSubview(pointView) 
    } 
} 

Mi proyecto simple para añadir coordenadas en UIView: https://github.com/Glechik/MapCoordinateDrawer

1

<!DOCTYPE html> 
 
<html> 
 
<head> 
 
<style> 
 
#point{font-face:Arial; font-size:18px; color:#FFFF00; width:12px; height:12px;text-shadow: 2px 2px #000000} 
 
#canvas {position: absolute; top: 0px; left: 0px; z-index: -2} 
 
     html, 
 
     body, 
 
     #canvas { 
 
      width: 100%; 
 
      height: 100%; 
 
      overflow: hidden; 
 
      margin: 0 
 
     } 
 
</style> 
 
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.12.2/jquery.min.js"></script> 
 
<script> 
 
$(window).on("load resize",function(e){ 
 

 
var w = $("#canvas").width(); 
 
var h = $("#canvas").height(); 
 
// New York, NY (https://maps.googleapis.com/maps/api/geocode/json?address=New%20York,%20NY) 
 
       var lat = 40.91525559999999; 
 
       var long = -73.70027209999999; 
 

 

 
var x = ((w/360) * (180 + long)) - 9; 
 
var y = ((h/180) * (90 - lat)) - 18; 
 

 
$("#text").text('X:'+x+', Y:'+y); 
 
$("#point").offset({ top: y, left: x }); 
 

 
}); 
 
</script> 
 
</head> 
 
<body> 
 
<div id="text"></div> 
 
<div id="point">▼</div> 
 
<img id="canvas" border="0" src="http://friday.westnet.com/~crywalt/dymaxion_2003/earthmap10k.reduced.jpg"> 
 

 
</body> 
 
</html>

Cuestiones relacionadas