Back to project page ImproveMyCity-Mobile.
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.
/** 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; } }