2010年12月28日火曜日

formatedAddressの細部取得

/// <summary>
/// 住所を表します。
/// </summary>
class Address
{
    /// <summary>
    /// JavaScript によって、Goole Map の Geocoder から取得した住所情報から Address インスタンスを生成します。
    /// Address クラスのインスタンスは、このメソッドだけが生成可能です。
    /// </summary>
    /// <param name="address">Geocoder から取得した住所文字列。</param>
    /// <returns></returns>
    public static Address FromGeocoderAddress( string address )
    {
        if( String.IsNullOrEmpty( address ) ) { return null; }
 
        // 整形済みの住所は常に存在している必要がある
        var formatedAddress = Address.GetAdressValue( address, Address.TagFormatedAddress );
        if( String.IsNullOrEmpty( formatedAddress ) ) { return null; }
 
        return new Address()
        {
            FormatedAddress = formatedAddress,
            Country         = Address.GetAdressValue( address, Address.TagCountry ),
            ProvinceState   = Address.GetAdressValue( address, Address.TagProvinceState ),
            City            = Address.GetAddressValueCity( address )
        };
    }
 
    /// <summary>
    /// JavaScript によって、Goole Map の Geocoder から取得した住所情報から、一つの住所区分を取得します。
    /// 住所情報となる文字列は、"country:日本;administrative_area_level_1:東京都; ...etc" という形式となります。
    /// </summary>
    /// <param name="address">Geocoder から取得した住所情報の文字列。</param>
    /// <param name="tag">取得する値の種別を示すタグ名。</param>
    /// <returns>取得した住所区分。</returns>
    private static string GetAdressValue( string address, string tag )
    {
        return Address.GetAdressValue( address, tag, true );
    }
 
    /// <summary>
    /// JavaScript によって、Goole Map の Geocoder から取得した住所情報から、一つの住所区分を取得します。
    /// 住所情報となる文字列は、"country:日本;administrative_area_level_1:東京都; ...etc" という形式となります。
    /// </summary>
    /// <param name="address">Geocoder から取得した住所情報の文字列。</param>
    /// <param name="tag">取得する値の種別を示すタグ名。</param>
    /// <param name="isLastIndexOf">tag を先頭から検索する場合は true、末尾からの場合は false。</param>
    /// <returns>取得した住所区分。</returns>
    private static string GetAdressValue( string address, string tag, bool isIndexOf )
    {
        int index = ( isIndexOf ? address.IndexOf( tag ) : address.LastIndexOf( tag ) );
        if( index == -1 ) { return null; }
 
        int begin = index + tag.Length;
        index = address.IndexOf( ";", begin );
        if( index == -1 ) { return null; }
 
        int length = index - begin;
        return address.Substring( begin, length );
    }
 
    /// <summary>
    /// 都市情報を取得します。
    /// </summary>
    /// <param name="address">Geocoder から取得した住所情報の文字列。</param>
    /// <returns></returns>
    private static string GetAddressValueCity( string address )
    {
        // 例えば住所の都市部分が A 市 B 町 6-2 の場合、{ "2", "6", "B 町", "A 市" } のように格納されていて、
        // "A 市" が TagCity、それ以降が全て TagSubCity になるので、TagCity と最後に登場する TagSubCity で取得する。
        //
        var city = String.Format( "{0}{1}", Address.GetAdressValue( address, Address.TagCity ), Address.GetAdressValue( address, Address.TagSubCity, false ) );
        if( String.IsNullOrEmpty( city ) )
        {
            city = String.Format( "{0}{1}", Address.GetAdressValue( address, Address.TagProvinceState2 ), Address.GetAdressValue( address, Address.TagProvinceState3 ) );
        }
 
        return city;
    }
}

0 件のコメント:

コメントを投稿