2017-10-18 24 views
0

病院の名前から緯度/経度情報を返すために、AccessDBアプリケーションで新しい機能を使用しています。次の機能は、私が名前&アドレスを提供するときに必要なものを提供します。私は(予期しない)、私は有効な病院の名前を提供しても、関数は書式設定された住所を返すことに気づいた。私は私のデータベースにアドレス情報をバックフィルするためにこれを悪用できると思います。GeoLocation - 構文解析済み/フォーマット済みアドレス?

Geocode.sRetAddress = .selectSingleNode("//formatted_address").Textは "ほとんど"一貫性があり、区切り文字として "、"を使用して住所/市/州/ ZIP情報を取得するために簡単に解析されます。私の複雑さは、フォーマットされたアドレス文字列に "Floor Number"が含まれるまれなケースです。私の解析ルーチンは失敗します。

私が見つかりました。このルーチン(ない鉱山):

Option Explicit 
Option Compare Database 

'Public Type containing the geocoding of the postal address 
Public Type tGeocodeResult 
    dLatitude As Double 
    dLongitude As Double 
    sRetAddress As String 
    sAccuracy As String 
    sStatus As String 
End Type 

'--------------------------------------------------------------------------------------- 
' Procedure : Geocode with Google Geocoding API v3 
' Version : 1.01 
' DateTime : 03/03/2011 
' Author : Philben 
' Purpose : converting addresses into geographic coordinates 
' Parameter : No mandatory. string format or NULL 
' Reference : http://code.google.com/intl/fr-FR/apis/maps/documentation/geocoding/index.html 
' Remark : Query limit of 2,500 geolocation requests per day 
'   : A good accuracy is different of a good geocoding !!! 
'   : Minimum delay between two queries : >= 200 ms 
'--------------------------------------------------------------------------------------- 
Public Function Geocode(Optional ByVal vAddress As Variant = Null, _ 
         Optional ByVal vTown As Variant = Null, _ 
         Optional ByVal vPostCode As Variant = Null, _ 
         Optional ByVal vRegion As Variant = Null, _ 
         Optional ByVal sCountry As String = "UNITED STATES+") As tGeocodeResult 
    On Error GoTo catch 
    Dim oXmlDoc As Object 
    Dim sUrl As String, sFormatAddress As String 
    If Not IsNull(vAddress) Then vAddress = Replace(vAddress, ",", " ") 
    sFormatAddress = (vAddress + ",") & _ 
        (vTown + ",") & _ 
        (vRegion + ",") & _ 
        (vPostCode + ",") & _ 
        sCountry 
    'To create the URL 
    sUrl = "http://maps.googleapis.com/maps/api/geocode/xml?address=" & sFormatAddress & "&sensor=false" 
    ''XMLDOM to get the XML response 
    Set oXmlDoc = CreateObject("Microsoft.XMLDOM") 
    With oXmlDoc 
     .Async = False 
     If .Load(sUrl) And Not .selectSingleNode("GeocodeResponse/status") Is Nothing Then 
     'Status code 
     Geocode.sStatus = .selectSingleNode("GeocodeResponse/status").Text 
     'If a result is returned 
     If Not .selectSingleNode("GeocodeResponse/result") Is Nothing Then 
      'formatted_address 
      Geocode.sRetAddress = .selectSingleNode("//formatted_address").Text 
      'Accuracy 
      Geocode.sAccuracy = .selectSingleNode("//location_type").Text 
      'Latitude and longitude 
      Geocode.dLatitude = Val(.selectSingleNode("//location/lat").Text) 
      Geocode.dLongitude = Val(.selectSingleNode("//location/lng").Text) 
     End If 
     End If 
    End With 
    Set oXmlDoc = Nothing 
    Exit Function 
catch: 
    Set oXmlDoc = Nothing 
    Err.Raise Err.Number, , Err.Description 
End Function 

例の結果(Geocode.sRetAddress - フォーマットされたアドレス):

良い:100 Sレイモンドアベニュー、アルハンブラ、CA 91801、USA
良い:3040、ソルトクリークのLn、アーリントンハイツ、IL 60005、USA
悪い:4階、2450アシュビーアベニュー、バークレー、CA 94705、USA

質問

どれ手がかり書式設定されたアドレスの「床」コンポーネントの場合は除外され、あるいは明示的にJUST所望の成分を返すことができますか?

おかげで、

マーク・ペルティエ

PSは>私は現在、文字列に「」の数をカウントし、条件付きで解析タスクを処理しています。しかし、一般的なアプローチとして、私はまだ遭遇していない他の例外がある可能性があります。

+0

コンマの数を数える(またはコンマで分割してから連結する)のは、合理的な方法です。それがうまくいかない状況を示すことができない場合、私たちのためにそれを説明するのは難しいです。 –

+0

有効なリンクを提供することは可能ですか? – SIM

+0

Shahin、ここにリンクがあります:https://access-programmers.co.uk/forums/showthread.php?t=206247 –

答えて

0

私はXPathで初心者のビットんだけど、私はこの解決することができると思う:

の代わりに:

'formatted_address 
    Geocode.sRetAddress = .selectSingleNode("//formatted_address").Text 

用途:

'Build an address: 
Geocode.sRetAddress = oXMLDoc.selectSingleNode("descendant::address_component[type='street_number']/short_name").text 
Geocode.sRetAddress = Geocode.sRetAddress & " " oXMLDoc.selectSingleNode("descendant::address_component[type='route']/short_name").text 
Geocode.sRetAddress = Geocode.sRetAddress & ", " oXMLDoc.selectSingleNode("descendant::address_component[type='locality']/short_name").text 
Geocode.sRetAddress = Geocode.sRetAddress & ", " oXMLDoc.selectSingleNode("descendant::address_component[type='administrative_area_level_1']/short_name").text 
Geocode.sRetAddress = Geocode.sRetAddress & " " oXMLDoc.selectSingleNode("descendant::address_component[type='postal_code']/short_name").text 
Geocode.sRetAddress = Geocode.sRetAddress & ", " oXMLDoc.selectSingleNode("descendant::address_component[type='country']/short_name").text 

手動にしますGoogle MapsジオコードAPIによって提供されるコンポーネントに基づいて住所を作成します。

都市や州のようなものを構文解析している場合、XML文書で利用できるだけなので、やっかいなことです。あなたは、XMLから直接読む方が良いです。

0

あなたの特定の状況がただの病院に合わせられているように見えますので、ここに記載されている問題のすべてを考慮する必要はありません。しかし、他の誰かが "フロア"以上のものを含むアドレスを解析しようとしている場合には、これを残しておきます。それでもなお、 "ルート"だけを見つけるアルゴリズムを検討することができます。

私は "ルート"の物理アドレスを特定する必要があった同様のプロジェクトで作業しましたが、目に見えるよりも複雑なことがあります。そんなに多くの落とし穴があります。私はフル・ルール・エンジンを構築する必要がなくなりました。考えられるすべての組み合わせを予測し、それを考慮する。

-2 MAIN ST 4階 -2 MAIN ST 3階 -2 MAIN STユニット3 -4th床2 MAIN ST -Apt 3 2メインストリート -Apt 3 22のRTE 7 -2 MAIN ST 1階 ...もっと多く

通常、2番のメインストリートとして書かれている住所のセクションを特定しようとしていますが、数字、通りの名前、通りを表す接尾辞があります/道路/ドライブ、等ここでは、ベースだけの一般的なアルゴリズムです。あなたは拡大する必要があります。

任意のカンマがある場合は、個別に

あなたがかなりを持っている必要があります「ストリート」のアドレス要素

検索インデックス内のすべての句読点を削除し、評価するために、別の要素に文字列を分割

Road、Rd、St、Boulevard、Blvd、Blv、Way、Avenue、Ave、Kill、Drive、Dr、Lane、Ln、Path、Highway、Hwy、BiWay、高速道路Bwy。 Circle、Cir、Crossing、Xing、Route、Rte、Rural Route、RR もっと多くのことを考えることができると確信しています。

これらのうち最も右側のインスタンスを見つけて、数値から(正確には、連続する数値セットの先頭のインデックス)見つけるまで、そのインデックスから逆方向に作業します。 - 数字が通りの名前の一部ではないことを確認してください(つまり、 "3rd Street")。つまり、数値の前に "rd"または "th"または "nd"が付いていないことを確認するか、 - 数値が見つかったら、必要なものが得られます。数値と "街"の間のすべてを把握してください。以下のように注意する

他のもの: - 「ストリート」のためと「聖」は同じですの略「2セントフランシスセント」 のように - 「ドクター」のためと「ドライブ」の略称が同じです。 "3 Dr Jones Dr" - "Route"と "Highways"には、 "2 Route 5"のように数値が続きます - 「ストリート/ドライブ」の多くの化身の略語は、たいていは通りの名前に埋もれています。 "3 Caveman Arrival St"には "ave"と "rr"と "st"が含まれています - 数字の部分は「Three Main Street」のように単語としても書けるかもしれません。

望ましくないセクション希望のセクションの代わりに住所の多くを使用する場合は、同様に、潜在的な状況の過多を説明する必要があります:

アパート、アパート、スイート、フロア、F1、ユニット、#、フラット、ボックス、POBox、PO、建物、Bldg、Bld、Dorm、Room、Rm

最終的には、多くのシナリオ/例外と多くの「ケース」が必要になるでしょう。正規表現を使用してそれらを識別することも考えられます。がんばろう!

関連する問題