Autore Topic: Coordinate in UTM  (Letto 1577 volte)

Offline systemgvp

  • Nuovo arrivato
  • *
  • Post: 49
  • Respect: +1
    • Mostra profilo
  • Dispositivo Android:
    Ideos
  • Play Store ID:
    systemgvp
  • Sistema operativo:
    Windows 7
Coordinate in UTM
« il: 23 Maggio 2012, 09:24:18 CEST »
0
Salve,

vorrei sapere se è possibile ottenere le coordinate nel sistema UTM anzicchè in WGS84

Offline Nicola_D

  • Utente storico
  • *****
  • Post: 2479
  • SBAGLIATO!
  • Respect: +323
    • Github
    • Google+
    • nicoladorigatti
    • Mostra profilo
  • Dispositivo Android:
    Nexus 6p, Nexus 4, Nexus S, Nexus 7(2012)
  • Sistema operativo:
    Windows 7
R: Coordinate in UTM
« Risposta #1 il: 24 Maggio 2012, 10:42:40 CEST »
0
Devi riproiettare le coordinate,dubito riesca a farlo android... cerca online servizi di riproiezione.
Io uso un servizio esri, ma il server è a pagamento, e costa anche parecchio....

Inviato dal mio Nexus S con Tapatalk 2
IMPORTANTE:NON RISPONDO A PROBLEMI VIA MESSAGGIO PRIVATO
LOGCAT: Non sai cos'è? -> Android Debug Bridge | Android Developers
               Dov'è in Eclipse? -> Window -> Open Prospective -> DDMS e guarda in basso!
[Obbligatorio] Logcat, questo sconosciuto! (Gruppo AndDev.it LOGTFO) - Android Developers Italia

Offline iceweasel

  • Moderatore globale
  • Utente senior
  • *****
  • Post: 878
  • Respect: +147
    • Mostra profilo
  • Dispositivo Android:
    LGE P990 - Google Nexus 5
  • Sistema operativo:
    Linux Debian Sid
Re:Coordinate in UTM
« Risposta #2 il: 24 Maggio 2012, 12:24:40 CEST »
0
Android da specifiche la CPU deve avere la FPU, quindi i calcoli in float point riesce a farli tranquillamente, mi sembra strano di utilizzare un servizio esterno per eseguire un calcolo di conversione tra proiezioni, la formula non mi sembra impossibile (basta cercala con Google):

http://www.uwgb.edu/dutchs/UsefulData/UTMFormulas.HTM

Non ho mai fatto in Java questo calcolo, come alternativa esiste una libreria C PROJ.4 molto utilizzata:

http://trac.osgeo.org/proj

non so' se c'è un porting nativo per Android o una equivalente scritta in Java compatibile con Android.
adb logcat | tee /tmp/logcat | grep TAG

Offline Nicola_D

  • Utente storico
  • *****
  • Post: 2479
  • SBAGLIATO!
  • Respect: +323
    • Github
    • Google+
    • nicoladorigatti
    • Mostra profilo
  • Dispositivo Android:
    Nexus 6p, Nexus 4, Nexus S, Nexus 7(2012)
  • Sistema operativo:
    Windows 7
Re:Coordinate in UTM
« Risposta #3 il: 24 Maggio 2012, 21:10:54 CEST »
0
Android da specifiche la CPU deve avere la FPU, quindi i calcoli in float point riesce a farli tranquillamente, mi sembra strano di utilizzare un servizio esterno per eseguire un calcolo di conversione tra proiezioni, la formula non mi sembra impossibile (basta cercala con Google):

http://www.uwgb.edu/dutchs/UsefulData/UTMFormulas.HTM

Non ho mai fatto in Java questo calcolo, come alternativa esiste una libreria C PROJ.4 molto utilizzata:

http://trac.osgeo.org/proj

non so' se c'è un porting nativo per Android o una equivalente scritta in Java compatibile con Android.
io il servizio non lo uso con android ma da webapp che usa comunque servizi esri... :D
IMPORTANTE:NON RISPONDO A PROBLEMI VIA MESSAGGIO PRIVATO
LOGCAT: Non sai cos'è? -> Android Debug Bridge | Android Developers
               Dov'è in Eclipse? -> Window -> Open Prospective -> DDMS e guarda in basso!
[Obbligatorio] Logcat, questo sconosciuto! (Gruppo AndDev.it LOGTFO) - Android Developers Italia

Offline fieraf

  • Utente junior
  • **
  • Post: 88
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Galaxy s 2
  • Sistema operativo:
    windows 7
Re:Coordinate in UTM
« Risposta #4 il: 25 Maggio 2012, 16:32:32 CEST »
0
ciao.
io l'ho fatto in vb.net passare da lon/lat a UTM.
ti passo il codice e lo adatti per android.,non ricordo la pagina web dove lo trovai.

Codice (Java): [Seleziona]
variabili:
        smag = 6378137.0
        smin = 6356752.3142
        ec = 0.81819191
        ec1 = 0.082094438
        ec1q = 0.006739497
        rc = 6399593.626
        amp = 0.0033528107

'la seguente linea trasfomra la lat in formato correto ,dove gpsvalue è la lat come la da il gps
 lat = FormatNumber((CInt(gpsvalue(2).Substring(0, 2)) + CDbl(Val(gpsvalue(2).Substring(2, Len(gpsvalue(2)) - 2)) / 60)), 10)

                                latrad = lat * (Math.PI / 180)
                             '
la seguente linea trasfomra la lonin formato correto ,dove gpsvalue è la loncome la da il gps

                                lon = FormatNumber((CInt(gpsvalue(4).Substring(0, 3)) + CDbl(Val(gpsvalue(4).Substring(3, Len(gpsvalue(4)) - 3)) / 60)), 10)
                    'lon = 2.247422222

                                lonrad = lon * (Math.PI / 180)
                                If gpsvalue(5) = "E" Then '
emisfero est,ovest da stringa nmea
                                    zonaUTM = Int((lon / 6) + 31)
                                Else
                                    zonaUTM = Int((-lon / 6) + 31)
                                End If
                                mercentrale = (((zonaUTM * 6) - 183) * Math.PI) / 180
                                deltafi = lonrad - mercentrale

                                p1 = Math.Cos(latrad) * Math.Sin(deltafi)
                                p2 = 0.5 * Math.Log((1 + p1) / (1 - p1))
                                p3 = Math.Atan(Math.Tan(latrad) / Math.Cos(deltafi)) - latrad
                                p4 = (rc / Math.Sqrt(1 + (ec1q * Math.Pow(Math.Cos(latrad), 2)))) * 0.9996
                                p5 = (ec1q / 2) * Math.Pow(p2, 2) * Math.Pow(Math.Cos(latrad), 2)
                                p6 = Math.Sin(2 * latrad)
                                p7 = p6 * Math.Pow(Math.Cos(latrad), 2)
                                p8 = latrad + (p6 / 2)
                                p9 = ((3 * p8) + p7) / 4
                                p10 = ((5 * p9) + (p7 * Math.Pow(Math.Cos(latrad), 2))) / 3
                                p11 = (3 / 4) * ec1q
                                p12 = (5 / 3) * Math.Pow(p11, 2)
                                p13 = (35 / 27) * Math.Pow(p11, 3)
                                p14 = 0.9996 * rc * (latrad - (p11 * p8) + (p12 * p9) - (p13 * p10))
                                'If gpsvalue(5) = "E" Then
                                xUTM = FormatNumber(p2 * p4 * (1 + (p5 / 3)) + 500000, 4)
                                '
Else
                                'xUTM = FormatNumber(p2 * p4 * (1 + (p5 / 3)) + 500000, 4)
                                '
 End If
                                If gpsvalue(3) = "N" Then 'emisfero nord,sud da stringa nmea
                                    yUTM = FormatNumber(p3 * p4 * (1 + p5) + p14, 4)
                                Else
                                    yUTM = FormatNumber(p3 * p4 * (1 + p5) + p14 + 10000000, 4)
                                End If
                                appxUTM = xUTM.ToString.Replace(",", ".")
                                appyUTM = yUTM.ToString.Replace(",", ".")

spero ti possa aiutare.
se lo converti, lo posti che cosí sará disponibile anche agli altri?
io devo fare una app,e non ho il tempo per riscriverlo e sono nuovo di android

saluti

Offline systemgvp

  • Nuovo arrivato
  • *
  • Post: 49
  • Respect: +1
    • Mostra profilo
  • Dispositivo Android:
    Ideos
  • Play Store ID:
    systemgvp
  • Sistema operativo:
    Windows 7
Re:Coordinate in UTM
« Risposta #5 il: 29 Maggio 2012, 14:21:02 CEST »
0
in effetti anchio credo che si possa fare benissimo dato che alcune app del market ti danno la possibilità di avere le coordinate come vuoi.

in questi giorni vedo di elaborare il tuo codice di cui ti solo grato,e se l'app riesce lo posto.

Offline systemgvp

  • Nuovo arrivato
  • *
  • Post: 49
  • Respect: +1
    • Mostra profilo
  • Dispositivo Android:
    Ideos
  • Play Store ID:
    systemgvp
  • Sistema operativo:
    Windows 7
Re:Coordinate in UTM
« Risposta #6 il: 08 Giugno 2012, 23:53:48 CEST »
+1
ho convertito il progetto creando una funzione per la conversione, posto il codice completo per tutti coloro cha abbiano la mia stessa necessità di conversione.

Codice (Java): [Seleziona]
package wgs84UTM.java;

import android.app.Activity;
import android.media.AudioManager;
import android.media.ToneGenerator;
import android.os.Bundle;
import android.view.View;
import android.widget.EditText;
import android.widget.TextView;

public class WGS84UTM extends Activity {
   

        private EditText lat, lon;
        private TextView lat_UTM_TXT, lon_UTM_TXT, zona_UTM_TXT;
       
        //per il suono
        private android.media.ToneGenerator tono;
       
        private double lat_UTM,lon_UTM,zonaUTM;
       
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
       
        lat = (EditText) findViewById(R.id.lat_TXT);
        lon = (EditText) findViewById(R.id.lon_TXT);
        lat_UTM_TXT = (TextView) findViewById(R.id.lat_UTM_TXT);
        lon_UTM_TXT = (TextView) findViewById(R.id.lon_UTM_TXT);
        zona_UTM_TXT = (TextView) findViewById(R.id.zona_UTM_TXT);
       
      //tipo di suono = AudioManager.* , volume = 100
           tono = new ToneGenerator(AudioManager.STREAM_ALARM, 30);

    }
   
    public void da_WGS84_a_UTM(double latitudine, double longitudine, String orientamentoX, String orientamentoY)
    {
        //raggio medio sqrt(smag*smin)
        double rc   = 6399593.626;
        //eccentricità
        double ec1q = 0.006739497; //ec*ec/(1-ec*ec)
        //fattore di scala
        double ko   = 0.9996;
        //coordinate in gradi centesimali
        double lat_G =  latitudine;
        double lon_G =  longitudine;
        //conversione in radianti
        double lat_Gr = lat_G * (Math.PI / 180);
        double lon_Gr = lon_G * (Math.PI / 180);
        //calcolo zona UTM
        if (orientamentoX.equals("E")) { zonaUTM = (int)((lon_G / 6) + 31); }
        else { zonaUTM = (int)((-lon_G / 6) + 31); }
        //coefficienti per il calcolo delle coordinate
        double mercentrale = (((zonaUTM * 6) - 183) * Math.PI) / 180;
        double deltafi = lon_Gr - mercentrale;
        double p1 = Math.cos(lat_Gr) * Math.sin(deltafi);
        double p2 = 0.5 * Math.log((1 + p1) / (1 - p1));
        double p3 = Math.atan(Math.tan(lat_Gr) / Math.cos(deltafi)) - lat_Gr;
        double p4 = (rc / Math.sqrt(1 + (ec1q * Math.pow(Math.cos(lat_Gr),2)))) * ko;
        double p5 = (ec1q / 2) * Math.pow(p2,2) * Math.pow(Math.cos(lat_Gr),2);
        double p6 = Math.sin(2 * lat_Gr);
        double p7 = p6 * Math.pow(Math.cos(lat_Gr),2);
        double p8 = lat_Gr + (p6 / 2);
        double p9 = ((3 * p8) + p7) / 4;
        double p10 = ((5 * p9) + (p7 * Math.pow(Math.cos(lat_Gr),2))) / 3;
        double p11 = ec1q * 3 / 4;
        double p12 = Math.pow(p11,2) * 5 / 3;
        double p13 = Math.pow(p11, 3) * 35 / 27;
        double p14 = ko * rc * (lat_Gr - (p11 * p8) + (p12 * p9) - (p13 * p10));      
        //longitudine in UTM [metri]
        lon_UTM = p2 * p4 * (1 + (p5 / 3)) + 500000;
        //If gpsvalue(5) = "E" Then
        //lon_UTM = FormatNumber(p2 * p4 * (1 + (p5 / 3)) + 500000, 4)
        // Else xUTM = FormatNumber(p2 * p4 * (1 + (p5 / 3)) + 500000, 4)
        //latitudine
        if (orientamentoY.equals("N")) { lat_UTM = p3 * p4 * (1 + p5) + p14; }
        else { lat_UTM = p3 * p4 * (1 + p5) + p14 + 10000000; }
    }
   
    public void conversione_OnClick(View button)
    {
        //coordinate in gradi centesimali
        double lat_G =  Double.valueOf(lat.getText().toString());
        double lon_G =  Double.valueOf(lon.getText().toString());
        //orientamento
        String orientamentoX = "E";
        String orientamentoY = "N";
       
        //converte le coordinate
        da_WGS84_a_UTM(lat_G,lon_G,orientamentoX,orientamentoY);

        //mostra i dati
        lat_UTM_TXT.setText("Lat : "+String.valueOf(lat_UTM));
        lon_UTM_TXT.setText("Lon : "+String.valueOf(lon_UTM));
        zona_UTM_TXT.setText("Zona : "+String.valueOf(zonaUTM));
       
        tono.startTone(ToneGenerator.TONE_CDMA_KEYPAD_VOLUME_KEY_LITE);
    }
}