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