2009-09-02 11 views

risposta

8

C'è un sacco di informazioni su Internet relative al calcolo della distanza tra due abbinamenti di latitudine e longitudine. Stiamo usando quei calcoli sul nostro sito web pubblico e non sono banali da capire/discutere (quindi non cercheremo di coprire qui). Detto questo, sono facili da implementare.

Una volta che avete una funzione che restituisce la distanza, si dovrebbe essere in grado di caculate la larghezza e l'altezza della mappa in termini di distanza tra gli angoli.

Quindi è possibile calcolare la distanza orizzontale e verticale del punto dall'angolo in alto a sinistra.

Ora si scopre quale rapporto tra la larghezza della mappa è rappresentata dalla distanza tra il lato sinistro e il punto, si applica quel rapporto alla larghezza del pixel e si ha il numero di pixel tra il lato sinistro e il punto. Ripeti per l'asse y.

(pixel dal lato sinistro) = (larghezza totale in pixel) * ((distanza geocode tra sinistra e il punto)/(distanza geocode tra lato sinistro e sul lato destro))

(pixel dall'alto) = (altezza totale in pixel) * ((distanza geocodice tra cima e il punto)/(distanza geocodice tra cima e fondo))

MODIFICA: Mentre lo approfondisci, noterai che alcune soluzioni presenteranno risultati più accurati di altri a causa del fatto che si sta approssimando distanza tra due punti su una superficie sferica e la mappatura che su una superficie piana. L'accuratezza diminuisce all'aumentare della distanza. Il miglior consiglio per voi è quello di provare prima e vedere se soddisfa le vostre esigenze.

+0

mappe proiettare la nostra 3D su un Superficie 2D.Poiché non è possibile avvolgere perfettamente un quadrato su una sfera, esistono diversi metodi di proiezione per ottenere un risultato approssimativamente corretto. Le distanze su una data mappa non sono lineari, quindi la tua formula è solo un'approssimazione. –

+0

I ravvicinamenti funzionano per la maggior parte delle distanze. Ma dovrei chiarirlo nel post. – Mayo

+0

Sì, più ingrandita la tua mappa, più preciso è il risultato. Dovresti vedere una differenza quasi nullo per una mappa a livello di città, ma sarà evidente per una mappa a livello di stato o più grande. –

5

Esistono diversi schemi di proiezione di mappe. Dovresti sapere quali sono usati dalle tue mappe.

Per ulteriori informazioni sugli algoritmi di proiezione delle mappe e sulla mappatura avanti/indietro, verificare . Fornisce le formule per un numero di proiezioni comuni.

+0

Non ho bisogno di molta precisione, quindi forse la soluzione qui sotto è sufficiente. Se non lo è, come sarebbe la trasformazione? Quali sono questi schemi di progetto? Finora ho visto: UTM Mercatore trasversale Mercator Longitudine/Latitudine – Jorge

+0

BTW. Ho anche codificato le formule per la conversione tra Lat/Lon e UTM. La conversione da Lat/Lon a UTM e l'applicazione della soluzione sono nel modo giusto (almeno per le proiezioni UTM)? – Jorge

+0

Le tue mappe utilizzano Mercator? Hai bisogno di sapere in cosa sono codificate le mappe prima di poter scegliere la proiezione giusta. Una volta che hai le distanze geocodificate a destra, la formula di mmayo ti dà il pixel corretto sulla mappa. –

9

Se si utilizza il Equidistant Cylindrical Projection type map, ecco cosa dovete fare:

  1. trovare la latitudine e la longitudine della posizione tutorial qui:
    http://lifehacker.com/267361/how-to-find-latitude-and-longitude
  2. di ingresso che le informazioni nelle seguenti formule:
    x = (larghezza totale dell'immagine in px) * (180 + latitudine)/360
    y = (altezza totale dell'immagine in px) * (90 - longitudine)/180

    nota: quando si utilizza la latitudine negativa della latitudine, assicurarsi di aggiungere o sottrarre il numero negativo, ad es.+ (- 92) o - (- 35), che sarebbe in realtà -92 e +35

  3. Ora avete la vostra X e Y per tracciare sulla vostra immagine

    Maggiori informazioni possono essere trovate su questa formula e la tipo di mappa qui:
    http://www.progonos.com/furuti/MapProj/Dither/CartHow/HowER_W12/howER_W12.html#DeductionEquirectangular
+0

Puoi dirmi come calcolare da X, Y a Lat lon? – colin

17

Ecco cosa ha funzionato per me, senza nemmeno bs.

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

Le coordinate lat, lon mi sono state fornite dai dispositivi Android. Quindi dovrebbero essere nello stesso standard utilizzato da tutti i prodotti Google Earth/Map.

+0

ora come visualizzare x, y. significa quale metodo dovrebbe essere usato per xey per visualizzarlo – sns

+0

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

+1

Mi rendo conto che questa è una vecchia domanda, ma non ho trovato risposte che parlino di avere un offset e una scala della mappa. Inoltre, questo MAP_WIDTH/HEIGHT è in gradi (es. Delta di longitudine e latitudine) o i valori dei pixel? Dove dovrebbe avvenire il ridimensionamento? – OzBarry

7

Questo è abbastanza semplice e semplice .. lasciatemi spiegare come è possibile.

Latitudine e longitudine sono linee immaginarie disegnate sulla terra in modo da poter individuare con precisione qualsiasi posizione nel mondo. semplicemente, sono le coordinate X e Y di un aereo. La latitudine è una linea verticale che va da nord a sud con i suoi 90 gradi al polo nord e -90 gradi al polo sud.

Longitudine d'altra parte è una linea orizzontale che corre da est a sud con -180 gradi a ovest e 180 gradi a est.

è possibile convertire la latLng in pixel coord come presupponendo che la larghezza del contenitore html sia la larghezza del mondo e lo stesso vale per l'altezza.

Formula - Longitudine - pixel

(givenLng*widthOfContainerElement)/360 

dove 360 ​​è la longitudine totale in gradi

Formula -Latitude - pixel

(givenLat*heightOfContainerElement)/180 

dove 180 è il totale l atitude in grado

//Height is calculated from the bottom 

è possibile trovare un'implementazione di lavoro di questa formula qui, sul mio sito (usa JavaScript solo)

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

fatemi sapere se avete ancora bisogno di qualsiasi chiarimenti.

+0

Ho aggiunto la descrizione richiesta qui –

0

Basta fare questo (per Mercator proiezione cartografica):

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) 
    } 
} 

mio progetto semplice per l'aggiunta di coordinate su 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>

Problemi correlati