/// <inheritdoc />
        public IObservable<GeocoderResult> Search(string name, BoundingBox area)
        {
            var sb = new StringBuilder(128);
            sb.Append(_searchPath);
            if (area != null)
            {
                sb.Append(Uri.EscapeDataString(String.Format(CultureInfo.InvariantCulture,
                    "viewbox={0:f4},{1:f4},{2:f4},{3:f4}&",
                    area.MinPoint.Longitude,
                    area.MinPoint.Latitude,
                    area.MaxPoint.Longitude,
                    area.MaxPoint.Latitude)));
            }
            sb.AppendFormat("q={0}&format=json", Uri.EscapeDataString(name));

            return ObservableWWW.Get(sb.ToString())
                .Take(1)
                .SelectMany(r => (
                    from JSONNode json in JSON.Parse(r).AsArray
                    select ParseGeocoderResult(json)));
        }
        private GeocoderResult ParseGeocoderResult(JSONNode resultNode)
        {
            BoundingBox bbox = null;
            string[] bboxArray = resultNode["boundingbox"].Value.Split(',');
            if (bboxArray.Length == 4)
            {
                bbox = new BoundingBox(ParseGeoCoordinate(bboxArray[0], bboxArray[2]),
                    ParseGeoCoordinate(bboxArray[1], bboxArray[3]));
            }

            return new GeocoderResult()
            {
                PlaceId = long.Parse(resultNode["place_id"].Value),
                OsmId = long.Parse(resultNode["osm_id"].Value),
                OsmType = resultNode["osm_type"].Value,
                DisplayName = resultNode["display_name"].Value,
                Class = resultNode["class"].Value,
                Type = resultNode["type"].Value,
                Coordinate = ParseGeoCoordinate(resultNode["lat"].Value, resultNode["lon"].Value),
                BoundginBox = bbox,
            };
        }
 /// <summary> Downloads SRTM for given bounding box. </summary>
 /// <param name="boundingBox"></param>
 /// <returns>Streams</returns>
 public IObservable<byte[]> Download(BoundingBox boundingBox)
 {
     return Observable.Throw<byte[]>(new NotImplementedException());
 }
        /// <summary> Checks whether bounding boxes are intersects </summary>
        public bool Intersects(BoundingBox bbox)
        {
            var minX = Math.Max(MinPoint.Latitude, bbox.MinPoint.Latitude);
            var minY = Math.Max(MinPoint.Longitude, bbox.MinPoint.Longitude);
            var maxX = Math.Min(MaxPoint.Latitude, bbox.MaxPoint.Latitude);
            var maxY = Math.Min(MaxPoint.Longitude, bbox.MaxPoint.Longitude);

            return minX <= maxX && minY <= maxY;
        }