这是使用谷歌地图进行反向地理编码的最佳做法

时间:2017-01-12 11:15:42

标签: ios objective-c xcode google-maps reverse-geocoding

我想知道哪种是使用Google地图进行反向地理编码的最佳做法。我认为基于 lat lng 的API响应应该更快更准确,以获取格式化的地址。

我知道这两种类型的方法,在此我想知道哪种方法可以更好。

[[GMSGeocoder geocoder] reverseGeocodeCoordinate:CLLocationCoordinate2DMake([strForLatitude floatValue], [strForLongitude floatValue]) completionHandler:
 ^(GMSReverseGeocodeResponse *response, NSError *error){
     ALog(@"Address: %@ ", response.firstResult);
 }];

OR

NSError *error = nil;
NSString *lookupString = [NSString stringWithFormat:@"http://maps.googleapis.com/maps/api/geocode/json?latlng=%f,%f&sensor=false",latitude,longitude];
lookupString = [lookupString stringByReplacingOccurrencesOfString:@" " withString:@"+"];
NSData *jsonResponse = [NSData dataWithContentsOfURL:[NSURL URLWithString:lookupString]];
NSDictionary *jsonDict = [NSJSONSerialization JSONObjectWithData:jsonResponse options:kNilOptions error:&error];
NSLog(@"%@",jsonDict);
NSArray* jsonResults = [jsonDict objectForKey:@"results"];

谢谢!

3 个答案:

答案 0 :(得分:2)

第一个更好,因为它通过API密钥使用谷歌库

第二个不好,因为API在时间限制内点击的次数越多,获得响应的机会就越小,因为如果你持续点击那个api谷歌将会阻止你的ip一段时间

将来谷歌可能会阻止无密钥api支持

答案 1 :(得分:1)

使用GMSGeocoder是最好的,因为如果Google更改了其他方法中使用的网址或响应格式,那么您的代码将无法正常运行

所以我的建议是使用Google SDK及其Geocoder的官方方法

答案 2 :(得分:1)

在我的一个项目中,我使用了第一种方法:

public class MainActivity extends AppCompatActivity implements Spinner.OnItemSelectedListener {
        private Spinner spinner;
        private ArrayList<String> trips;
        private JSONArray result;

        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            trips= new ArrayList<String>();
            this.spinner = (Spinner) findViewById(R.id.spinner);
            spinner.setOnItemSelectedListener(this);
            loadtrip();
        }
        public void loadtrip() {
            trips = new ArrayList<>();

            HashMap<String,String> params=new HashMap<String,String>();
            {
                params.put("systemId", "12");
                params.put("customerId", "3513");
                params.put("userId", "124");
                params.put("tripType", "Open");
            }
            JsonObjectRequest stringRequest = new JsonObjectRequest(Request.Method.POST,config.DATA_URL,  new JSONObject(params),
                    new Response.Listener<JSONObject>() {
                        public void onResponse(JSONObject response) {
                            try {
                                result = response.optJSONArray("trips");
                                for(int i = 0; i < result.length(); i++){
                                    trips.add(String.valueOf(result.getInt(i)));
                                }
                            } catch (JSONException e) {
                                e.printStackTrace();
                            }

                            spinner.setAdapter(new ArrayAdapter<String>(MainActivity.this, android.R.layout.simple_spinner_dropdown_item,trips));
                        }
                    },
                    new Response.ErrorListener() {
                        @Override
                        public void onErrorResponse(VolleyError error) {
                        }
                    }) ;
            RequestQueue requestQueue = Volley.newRequestQueue(this);
            requestQueue.add(stringRequest);

        }
        public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
            String item = parent.getItemAtPosition(position).toString();
            Toast.makeText(parent.getContext(), "Selected: " + item, Toast.LENGTH_LONG).show();
        }
        public void onNothingSelected(AdapterView<?> parent) {


        }
    }