public static capex.map.PhysicalAddress forString(string str)
        {
            var v = new capex.map.PhysicalAddress();

            v.fromString(str);
            return(v);
        }
        public virtual bool queryAddress(double latitude, double longitude, capex.map.GeoCoderAddressListener listener)
        {
            if (listener == null)
            {
                return(false);
            }
            if (client == null)
            {
                listener.onQueryAddressErrorReceived(cape.Error.forCode("noWebClientInstance"));
                return(false);
            }
            var list = listener;

            client.query("GET", host + apiKey + "&latlng=" + cape.String.forDouble(latitude) + "," + cape.String.forDouble(longitude), null, null, (string statusCode, cape.KeyValueList <string, string> headers, byte[] body) => {
                var data = cape.JSONParser.parse(body) as cape.DynamicMap;
                if (data == null)
                {
                    list.onQueryAddressErrorReceived(cape.Error.forCode("invalidResponseFromGoogleMapsAPI"));
                    return;
                }
                var results = data.getDynamicVector("results");
                if (results == null || results.getSize() < 1)
                {
                    list.onQueryAddressErrorReceived(cape.Error.forCode("noResultFound"));
                    return;
                }
                var array = results.toVector();
                if (array != null)
                {
                    var n = 0;
                    var m = array.Count;
                    for (n = 0; n < m; n++)
                    {
                        var result = array[n] as cape.DynamicMap;
                        if (result != null)
                        {
                            if (result == null)
                            {
                                continue;
                            }
                            var addressComponents = result.getDynamicVector("address_components");
                            if (addressComponents == null || addressComponents.getSize() < 1)
                            {
                                list.onQueryAddressErrorReceived(cape.Error.forCode("noaddressComponentsFound"));
                                return;
                            }
                            var v      = new capex.map.PhysicalAddress();
                            var array2 = addressComponents.toVector();
                            if (array2 != null)
                            {
                                var n2 = 0;
                                var m2 = array2.Count;
                                for (n2 = 0; n2 < m2; n2++)
                                {
                                    var addressComponent = array2[n2] as cape.DynamicMap;
                                    if (addressComponent != null)
                                    {
                                        if (addressComponent == null)
                                        {
                                            continue;
                                        }
                                        var types = addressComponent.getDynamicVector("types");
                                        if (types == null || types.getSize() < 1)
                                        {
                                            continue;
                                        }
                                        var array3 = types.toVector();
                                        if (array3 != null)
                                        {
                                            var n3 = 0;
                                            var m3 = array3.Count;
                                            for (n3 = 0; n3 < m3; n3++)
                                            {
                                                var type = array3[n3] as string;
                                                if (type != null)
                                                {
                                                    if (object.Equals(type, null))
                                                    {
                                                        continue;
                                                    }
                                                    if (cape.String.equals("street_number", type))
                                                    {
                                                        v.setStreetAddressDetail(addressComponent.getString("long_name"));
                                                        break;
                                                    }
                                                    if (cape.String.equals("route", type))
                                                    {
                                                        v.setStreetAddress(addressComponent.getString("long_name"));
                                                        break;
                                                    }
                                                    if (cape.String.equals("locality", type))
                                                    {
                                                        v.setLocality(addressComponent.getString("long_name"));
                                                        break;
                                                    }
                                                    if (cape.String.equals("sublocality", type))
                                                    {
                                                        v.setSubLocality(addressComponent.getString("long_name"));
                                                        break;
                                                    }
                                                    if (cape.String.equals("administrative_area_level_2", type))
                                                    {
                                                        v.setSubAdministrativeArea(addressComponent.getString("long_name"));
                                                        break;
                                                    }
                                                    if (cape.String.equals("administrative_area_level_1", type))
                                                    {
                                                        v.setAdministrativeArea(addressComponent.getString("long_name"));
                                                        break;
                                                    }
                                                    if (cape.String.equals("country", type))
                                                    {
                                                        v.setCountry(addressComponent.getString("long_name"));
                                                        v.setCountryCode(addressComponent.getString("short_name"));
                                                        break;
                                                    }
                                                    if (cape.String.equals("postal_code", type))
                                                    {
                                                        v.setPostalCode(addressComponent.getString("long_name"));
                                                        break;
                                                    }
                                                }
                                            }
                                        }
                                    }
                                }
                            }
                            v.setCompleteAddress(result.getString("formatted_address"));
                            var geometry = result.getDynamicMap("geometry");
                            if (geometry == null)
                            {
                                continue;
                            }
                            var location = geometry.getDynamicMap("location");
                            if (location == null)
                            {
                                continue;
                            }
                            v.setLatitude(location.getDouble("lat"));
                            v.setLongitude(location.getDouble("lng"));
                            list.onQueryAddressCompleted(v);
                            return;
                        }
                    }
                }
                list.onQueryAddressErrorReceived(cape.Error.forCode("invalidResult"));
            });
            return(true);
        }