Android Open Source - ImproveMyCity-Mobile G E O






From Project

Back to project page ImproveMyCity-Mobile.

License

The source code is released under:

GNU General Public License

If you think the Android project ImproveMyCity-Mobile listed in this page is inappropriate, such as containing malicious code/tools or violating the copyright, please email info at java2s dot com, thanks.

Java Source Code

/** GEO */
package com.mk4droid.IMC_Utils;
/*from  w  w w  . jav  a2 s  . c om*/
import java.io.InputStream;
import java.util.List;
import java.util.Locale;

import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

import android.content.Context;
import android.content.res.Resources;
import android.graphics.Color;
import android.location.Address;
import android.location.Geocoder;
import android.os.AsyncTask;
import android.util.Log;
import android.widget.Toast;

import com.google.android.gms.maps.GoogleMap;
import com.google.android.gms.maps.model.LatLng;
import com.google.android.gms.maps.model.Polygon;
import com.google.android.gms.maps.model.PolygonOptions;
import com.mk4droid.IMC_Activities.Fragment_NewIssueB;
import com.mk4droid.IMC_Store.Constants_API;
import com.mk4droid.IMCity_PackDemo.R;

/**
 * Reverse geocoding: (Latitude, Longitude) -> X MyStreet, MyCountry
 * 
 * @copyright   Copyright (C) 2012 - 2013 Information Technology Institute ITI-CERTH. All rights reserved.
 * @license     GNU Affero General Public License version 3 or later; see LICENSE.txt
 * @author      Dimitrios Ververidis for the Multimedia Group (http://mklab.iti.gr). 
 *
 */
public class GEO {

  //===========  ConvertGeoPointToAddress ============================
  /**
   * Major method using the java class object of google api. 
   * If not success, then try to get with REST from google http api.
   *  
   * @param pt    Longitude and latitude information
   * @param ctx   current activity context
   * @return
   */
  static PolygonOptions options;

  public static String ConvertGeoPointToAddress(LatLng pt, Context ctx){

    Address maddress = null;
    try {
      Geocoder geocoder = new Geocoder(ctx, Locale.getDefault());
      List<Address> list = geocoder.getFromLocation(pt.latitude, pt.longitude, 1);
      if (list != null && list.size() > 0) {
        maddress = list.get(0);
      }
    } catch (Exception e) {
      Log.e(Constants_API.TAG, "Gecoder falied: I will try with REST");
      new RevGEO_Try2_Asynch(pt.latitude, pt.longitude).execute();
    }

    String Address_STR = "";

    if (maddress!=null){
      for (int i=0; i< maddress.getMaxAddressLineIndex(); i++)
        Address_STR += maddress.getAddressLine(i) + ", ";

      Address_STR += maddress.getCountryName();
    }

    return Address_STR; 
  }


  /**
   * 
   * Reverse geocoding with rest
   * 
   * @param lat
   * @param lng
   * @return
   */
  private static class RevGEO_Try2_Asynch extends AsyncTask<String, String, String>{

    double lat;
    double lng;

    public RevGEO_Try2_Asynch(double lat_in, double lng_in){
      lat = lat_in;
      lng = lng_in;
    }

    @Override
    public String doInBackground(String... params) {

      RestCaller rc = new RestCaller();  
      String response =  rc.now(  //"http://maps.googleapis.com/maps/api/geocode/json?"latlng=40.567,22.99&sensor=false,
          "http://maps.googleapis.com/maps/api/geocode/json", 
          "GET",  
          new String[]{
              "latlng",""+lat+","+lng,
              "sensor","false"}, "UTF-8","RevGEO_Try2");

      if (response == null)
        response = "";
      

      return response;
    }


    /* (non-Javadoc)
     * @see android.os.AsyncTask#onPostExecute(java.lang.Object)
     */
    @Override
    protected void onPostExecute(String response) {

      try {
        JSONObject jo = new JSONObject(response  );
        JSONArray ja = new JSONArray(jo.getString("results"));
        JSONObject jo1 = new JSONObject( ja.get(0).toString());
        String out = jo1.get("formatted_address").toString();

        if (Fragment_NewIssueB.etAddress!=null)
          Fragment_NewIssueB.etAddress.setText(out);

      } catch (JSONException e) {
        if (Fragment_NewIssueB.ctx != null && Fragment_NewIssueB.resources!=null && Fragment_NewIssueB.etAddress!=null){
          Toast.makeText(Fragment_NewIssueB.ctx, 
              Fragment_NewIssueB.resources.getString(R.string.WriteAddress), 
              Toast.LENGTH_LONG).show();

          Fragment_NewIssueB.etAddress.setText("");
        }
      }

      super.onPostExecute(response);
    }
  }

  /**
   * Draw polygon borders on the map defining the municipality
   * 
   * @param mgmap
   * @param resources
   */
  public static Polygon MakeBorders (GoogleMap mgmap, Resources res) {  

    String str = "";
    // parse from raw.polygoncoords.txt
    try {
      InputStream in_s = res.openRawResource(R.raw.polygoncoords);
      byte[] b = new byte[in_s.available()];
      in_s.read(b);
      str =  new String(b) ;
    } catch (Exception e) {
      Log.e("Error","can't read polygon.");
    }

    Polygon mPoly = null;

    if (options == null){
      if (str.length() > 0){
        String[] points = str.split(" ");
        options = new PolygonOptions();
        for (int i=0; i<points.length; i=i+2)
          options.add(new LatLng(Double.parseDouble(points[i+1]), Double.parseDouble(points[i]) ));
      }  
    } 

    if (mgmap != null)
      mPoly = mgmap.addPolygon(options
          .strokeWidth(4)
          .strokeColor(Color.BLACK)
          .fillColor(Color.argb(10, 0, 100, 0)));

    return mPoly;
  }


  /** 
   * Check whether a the marker position is inside the municipality borders (polygon)
   * 
   * @poly the polygon borders
   * @lng longitude of marker
   * @lat latitude of marker      
   */
  public static boolean insidePoly(Polygon poly, double lng, double  lat){

    List<LatLng> p = poly.getPoints();

    int polyPoints = poly.getPoints().size();
    int polySides  = polyPoints - 1;

    double[] polyY = new double[polyPoints];
    double[] polyX = new double[polyPoints];

    for (int i = 0; i < polyPoints; i++){
      polyY[i] = p.get(i).latitude;
      polyX[i] = p.get(i).longitude;
    }

    boolean oddTransitions = false;
    for( int i = 0, j = polySides -1; i < polySides; j = i++ ) {
      if( ( polyY[ i ] < lat && polyY[ j ] >= lat ) || ( polyY[ j ] < lat && polyY[ i ] >= lat ) ) {
        if( polyX[ i ] + ( lat - polyY[ i ] ) / ( polyY[ j ] - polyY[ i ] ) * ( polyX[ j ] - polyX[ i ] ) < lng ) {
          oddTransitions = !oddTransitions;          
        }
      }
    }
    return oddTransitions;
  }



    /**
     * Convert the distance to a string of distance plus its units e.g. m or km 
     *     
     * @param distanceData distance (range of data)
     * @return
     */
    public static String DistanceToText(int distanceData){
      String res = "";
      
    if (distanceData >= 10000 && distanceData < Constants_API.initRange )
      res = Float.toString(distanceData/1000) + "km";
        else if (distanceData < 10000)
          res = Integer.toString(distanceData) + "m";
        else if (distanceData == Constants_API.initRange)
          res = "Inf";
        
    return res;
  }
}




Java Source Code List

com.mk4droid.IMC_Activities.Activity_Information_Detailed.java
com.mk4droid.IMC_Activities.Activity_Register.java
com.mk4droid.IMC_Activities.Activity_Setup.java
com.mk4droid.IMC_Activities.Activity_Splash_Login.java
com.mk4droid.IMC_Activities.Activity_Thinking.java
com.mk4droid.IMC_Activities.FActivity_TabHost.java
com.mk4droid.IMC_Activities.Fragment_Comments.java
com.mk4droid.IMC_Activities.Fragment_Filters.java
com.mk4droid.IMC_Activities.Fragment_Issue_Details.java
com.mk4droid.IMC_Activities.Fragment_List.java
com.mk4droid.IMC_Activities.Fragment_Map.java
com.mk4droid.IMC_Activities.Fragment_NewIssueA.java
com.mk4droid.IMC_Activities.Fragment_NewIssueB.java
com.mk4droid.IMC_Activities.package-info.java
com.mk4droid.IMC_Constructors.Category.java
com.mk4droid.IMC_Constructors.Comment.java
com.mk4droid.IMC_Constructors.IssueListItem.java
com.mk4droid.IMC_Constructors.IssuePic.java
com.mk4droid.IMC_Constructors.Issue.java
com.mk4droid.IMC_Constructors.VersionDB.java
com.mk4droid.IMC_Constructors.Vote.java
com.mk4droid.IMC_Constructors.package-info.java
com.mk4droid.IMC_Core.FilterCateg_ExpandableListAdapter.java
com.mk4droid.IMC_Core.ImageView_Zoom.java
com.mk4droid.IMC_Core.InfoWindowAdapterButtoned.java
com.mk4droid.IMC_Core.Issues_ListAdapter.java
com.mk4droid.IMC_Core.Preference_About.java
com.mk4droid.IMC_Core.Preference_AccountOperations.java
com.mk4droid.IMC_Core.Preference_Email.java
com.mk4droid.IMC_Core.Preference_PlainText.java
com.mk4droid.IMC_Core.Preference_Reset.java
com.mk4droid.IMC_Core.Preference_SeekBar.java
com.mk4droid.IMC_Core.SpinnerAdapter_NewIssueCateg.java
com.mk4droid.IMC_Core.package-info.java
com.mk4droid.IMC_Services.DatabaseHandler.java
com.mk4droid.IMC_Services.Download_Data.java
com.mk4droid.IMC_Services.InternetConnCheck.java
com.mk4droid.IMC_Services.Security.java
com.mk4droid.IMC_Services.Service_Data.java
com.mk4droid.IMC_Services.Service_Location.java
com.mk4droid.IMC_Services.Upload_Data.java
com.mk4droid.IMC_Services.package-info.java
com.mk4droid.IMC_Store.Constants_API.java
com.mk4droid.IMC_Store.Phptasks.java
com.mk4droid.IMC_Store.package-info.java
com.mk4droid.IMC_Utils.GEO.java
com.mk4droid.IMC_Utils.My_Crypt_Utils.java
com.mk4droid.IMC_Utils.My_Date_Utils.java
com.mk4droid.IMC_Utils.My_System_Utils.java
com.mk4droid.IMC_Utils.RestCaller.java
com.mk4droid.IMC_Utils.RestClient.java
com.mk4droid.IMC_Utils.package-info.java