How to get the latitude and longitude of an image in sdcard to my application?

后端 未结 3 994
花落未央
花落未央 2020-12-14 13:04

From my application I can open gallery. Is there any way to get latitude and longitude of any selected image in gallery to my application?

相关标签:
3条回答
  • 2020-12-14 13:41

    You can actually use a "buildin" function:

    ExifInterface exif = new ExifInterface(path);
    float[] latLong = new float[2];
    boolean hasLatLong = exif.getLatLong(latLong)
    if (hasLatLong) {
        System.out.println("Latitude: " + latLong[0]);
        System.out.println("Longitude: " + latLong[1]);
    }
    

    Maybe is something new, but I think is much more convenient than the accepted answer.

    0 讨论(0)
  • 2020-12-14 13:54

    the exif.getLatLong(float[]) is now deprecated, you can use a better method which returns a double[] :

    ExifInterface exifInterface = new ExifInterface(file);
    double[] latlng = exifInterface.getLatLong();
    if (latlng != null) {
        Double currentLatitude = latlng[0];   
        Double currentLongitude = latlng[1];
        Log.d("Debug", "Exif : latitude: " + currentLatitude + ", longitude: " + currentLongitude)  
    }
    

    Happy coding.

    0 讨论(0)
  • 2020-12-14 13:59

    You Should Go with ExifInterface class to read various EXIF metadata from Images:

    Example :

    ExifInterface exif = new ExifInterface(filepath);
    exif.getAttribute(ExifInterface.TAG_GPS_LATITUDE);
    exif.getAttribute(ExifInterface.TAG_GPS_LATITUDE_REF);
    exif.getAttribute(ExifInterface.TAG_GPS_LONGITUDE);
    exif.getAttribute(ExifInterface.TAG_GPS_LONGITUDE_REF);
    

    Edited :

    Now Here you will get lat-long as Below format.

    lat = 30/1,12/1,34/1, long=81/1,22/1,41/1

    To Convert this into Real Values this Blog Helped Me.

    we need to do conversion from degree, minute, second form to GeoPoint form.

    By Below Way you can Do it.

     String LATITUDE = exif.getAttribute(ExifInterface.TAG_GPS_LATITUDE);
     String LATITUDE_REF = exif.getAttribute(ExifInterface.TAG_GPS_LATITUDE_REF);
     String LONGITUDE = exif.getAttribute(ExifInterface.TAG_GPS_LONGITUDE);
     String LONGITUDE_REF = exif.getAttribute(ExifInterface.TAG_GPS_LONGITUDE_REF);
    
     // your Final lat Long Values
     Float Latitude, Longitude;
    
     if((LATITUDE !=null)
       && (LATITUDE_REF !=null)
       && (LONGITUDE != null)
       && (LONGITUDE_REF !=null))
     {
    
      if(LATITUDE_REF.equals("N")){
       Latitude = convertToDegree(LATITUDE);
      }
      else{
       Latitude = 0 - convertToDegree(LATITUDE);
      }
    
      if(LONGITUDE_REF.equals("E")){
       Longitude = convertToDegree(LONGITUDE);
      }
      else{
       Longitude = 0 - convertToDegree(LONGITUDE);
      }
    
     }
    
    private Float convertToDegree(String stringDMS){
     Float result = null;
     String[] DMS = stringDMS.split(",", 3);
    
     String[] stringD = DMS[0].split("/", 2);
        Double D0 = new Double(stringD[0]);
        Double D1 = new Double(stringD[1]);
        Double FloatD = D0/D1;
    
     String[] stringM = DMS[1].split("/", 2);
     Double M0 = new Double(stringM[0]);
     Double M1 = new Double(stringM[1]);
     Double FloatM = M0/M1;
    
     String[] stringS = DMS[2].split("/", 2);
     Double S0 = new Double(stringS[0]);
     Double S1 = new Double(stringS[1]);
     Double FloatS = S0/S1;
    
        result = new Float(FloatD + (FloatM/60) + (FloatS/3600));
    
     return result;
    
    
    };
    
    
    
    @Override
    public String toString() {
     // TODO Auto-generated method stub
     return (String.valueOf(Latitude)
       + ", "
       + String.valueOf(Longitude));
    }
    
    public int getLatitudeE6(){
     return (int)(Latitude*1000000);
    }
    
    public int getLongitudeE6(){
     return (int)(Longitude*1000000);
    }
    
    0 讨论(0)
提交回复
热议问题