/// <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 )
{
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;
}
}