Android:我在做客户端或服务器端的地理编码吗?

时间:2014-04-20 05:31:44

标签: android google-maps google-geocoder

所以在我的应用程序中,我正在使用谷歌地图apis,我正在使用地理编码根据用户的当前位置确定地址。我使用的是Geocoder Android Class,但我发现它确实非常有效。这不可靠。所以我使用了我在这里看到的帖子来创建我自己的Geocoder。问题是,我现在不知道我是使用服务器端还是客户端地理编码。这有点重要,因为一个有限制而另一个没有。我的所有代码都在Android中。

这是一些代码,这是在我的“MyGeocoder”类中:

public List<Address> getFromLocation(double latitude, double longitude,
        int maxResults) throws IOException, LimitExceededException {
    if (latitude < -90.0 || latitude > 90.0) {
        throw new IllegalArgumentException("latitude == " + latitude);
    }
    if (longitude < -180.0 || longitude > 180.0) {
        throw new IllegalArgumentException("longitude == " + longitude);
    }

    if (isLimitExceeded(context)) {
        throw new LimitExceededException();
    }

    final List<Address> results = new ArrayList<Address>();

    final StringBuilder url = new StringBuilder(
            "http://maps.googleapis.com/maps/api/geocode/json?sensor=true&latlng=");
    url.append(latitude);
    url.append(',');
    url.append(longitude);
    url.append("&language=");
    url.append(Locale.getDefault().getLanguage());

    HttpClient httpclient = new DefaultHttpClient();
    HttpPost httppost = new HttpPost(url.toString());

    try {
        HttpResponse response = httpclient.execute(httppost);
        String jsonResult = inputStreamToString(
                response.getEntity().getContent()).toString();

        Gson gson = new Gson();
        MyGeocodeResponse geocodeResponse = gson.fromJson(jsonResult, MyGeocodeResponse.class);
        final Address current = new Address(Locale.getDefault());
        if(geocodeResponse.getStatus().equals(STATUS_OK)) {
            MyGeocode locGeocode= geocodeResponse.getResults().get(0);
            String streetAddress = "";
            for(MyAddressComponent component : locGeocode.getAddress_components()) {
                for(String type : component.getTypes()) {
                    if(type.equals("locality")) {
                        current.setLocality(component.getLong_name());
                    }

                    if(type.equals("administrative_area_level_1")) {
                        current.setAdminArea(component.getLong_name());
                    }

                    if(type.equals("street_number")) {
                        if(streetAddress.length() != 0) {
                            current.setAddressLine(0, component.getLong_name() + " " + streetAddress);
                        } else {
                            streetAddress = component.getLong_name();
                        }
                    }

                    if(type.equals("route")) {
                        if(streetAddress.length() != 0) {
                            current.setAddressLine(0, streetAddress + " " + component.getShort_name());
                        } else {
                            streetAddress = component.getShort_name();
                        }
                    }
                }
            }   
            current.setLatitude(latitude);
            current.setLongitude(longitude);
            results.add(current);
        }


        Log.i("TEST", "Got it");

    } catch (ClientProtocolException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }

    return results;
}

修改 我想还有一个问题是,如果这是服务器端地理编码,那么这个代码每天只能运行2500次,或者每个应用程序用户每天运行2500次?如果它是第一个选项,我仍然可以,但如果它是第二个选项,我不会看到任何想要拥有中途大用户群的应用程序如何使用服务器端地理编码而不会达到该限制。

1 个答案:

答案 0 :(得分:1)

  

我现在不知道我是否使用服务器端或客户端地理编码

在查看您的代码之后编写了http://maps.googleapis.com/maps/api/geocode/json?sensor=true&latlng=,因此它是服务器端反向地理编码,因为您通过进行额外的外部http调用来调用地理编码API。

  

如果这是服务器端地理编码,那么此代码每天只能运行2,500次,或者每个应用用户每天运行2,500次?

每个IP地址2,500个请求限制(基本上每天提到2500个请求),是的,这个代码每天只为您的所有用户运行2500次。你应该记住的一件事是你正在进行http调用geocoder api所以从服务器或客户端拨打电话的位置并不重要。

你应该看一下他们提到的谷歌link&#34;何时使用客户端地理编码&#34;和&#34;何时使用服务器端地理编码&#34;。