ジオコーディングの利点とアドレスデータの構造化



開発者がアドレスデータをクリーンアップする簡単な方法
アドレス情報は、世界中の企業のためのデータの最も一般的に収集された形式の一つです.また、簡単に収集し、不正確なまたは不完全な形式で格納できるデータです.
通り名はスペルミスされるかもしれません.郵便番号は、アドレスが入力されたときに除外することができます.複数のお客様は同じ名前を持つことができます.これらはアドレス情報に現れるデータ品質の誤りの一部です.
幸いなことに、開発者のための複雑なデータ品質ツールを購入したり、データ工学の博士号を取得せずに、アドレスデータをクリーンアップするための簡単な方法があります.その解決策はTomTomオンライン検索APIです.そして、それはアドレスデータをきれいにすることができる構造化ジオコーディング呼び出しを提供します.また、正確な緯度と経度情報をより正確な精度を提供するために未フォーマットの生データの場所を取ることができます提供します.
この記事では、アドレス確認とデータクリーンアップのためのTomtomオンライン検索APIから始める方法について説明します.Geocodingの利点を議論し、適切にアドレスデータをフォーマットし、TomTomから構造化されたジオコーディングAPI呼び出しを活用したサンプルアドレスクリーンアッププログラムを実行します.

ジオコーディングの利点とアドレスデータの構造化
上述のように、要求されたデータの妥当性を問題にするために、オンラインフォームを介してデータを要求することは、一般的ではない.これは、顧客からのアドレスデータの要求においても同様である.ミススペル、不正な資本化と行方不明の分野は明らかな問題を引き起こす可能性があります.会社がアドレスデータを提供したすべての顧客に郵送を行うためにこのデータベースから読み込んでいる状況を想像してください.この会社はメールを正しい目的地に行くことを望みます、しかし、アドレスのリストを見るとき、アドレスは配送失敗に終わる可能性があるスペルミスを持っているかもしれません.適切にアドレスデータを構造化することは、この問題の重要な修正を提供するでしょう.
TomTomからのオンライン検索製品の使用によって、組織は構造化されたGeocoding API呼び出しに提供されたアドレスデータを通過することができます、そして、彼らが検索を絞り込むのに十分な関連アドレスデータを受け取ったならば、彼らはどんな問題なしででも彼らを郵送するのを許す実際の(適切にフォーマットされた)アドレスを受け取ることができます.また、アドレスがジオコーディングされ、彼らは能力を緯度と経度のデータベースに関連付けられたアドレスと一緒に格納する必要があります.
Geocodingは、地理的レベルで顧客基盤を分析する組織の能力から、今日の時代と年齢の多くが否定できないいくつかの利点を提供します.単にページのアドレスデータの行を凝視する代わりに、彼らは代わりに彼らの市場に価値ある洞察を提供するかもしれない場所の地図を見ることができます.多分、彼らのビジネスは他のものより特定の都市のいくつかの部分でより成功しています、そして、マッピングデータは彼らがどこで彼らの努力に集中するかについて発見するのを援助することができます.または、多分、彼らは都市の1つの部分で市場を追い詰めました、しかし、市場が未開拓のままである重要な類似点がある近所があります.Geocodingは、これらのケースの両方で顧客データを分析するのを助けることを助けることができます.

Tomtomオンライン検索API
Tomtomから構造化ジオコーディングを利用するための第一歩は、Tomtomのオンライン検索APIで設定することです.訪問TomTom For Developers ウェブサイトと登録は、新しいアプリケーションを追加するオプションを選択できるダッシュボードにもたらすでしょう.アプリケーション名を提供し、オンライン検索製品を選択すると、オンライン検索APIで使用するためのAPIキーを提供します.
APIキーを受け取った後、ジオコーディングアドレスをクリーンアップするための構造化ジオコーディングメソッドにアクセスできるアプリケーションを開発する準備が整いました.TomTomからオンライン検索製品を活用するアプリケーションの開発を通しての貴重なリソースはhere .

簡単なJava実装
それで、Tomtom Online検索から構造化ジオコーディングAPI呼び出しを利用するサンプルプログラムを見ましょう.このAPI呼び出しの機能を実証するために、私はCSV入力ファイルが我々のフォーマットされていないアドレスデータベースとして機能する単純なJava実装を開発しました、そして、CSV出力ファイルは我々のフォーマットされたアドレスデータベースとして働きます.入力ファイルから、各行、行ごとに読み取り、構造化ジオコーディング要求の一部として入力を提供します.入力ファイルの各アドレスにはスペルミス、行方不明のフィールドが含まれます.または、両方とも.いいえ、緯度と経度の入力ファイル内の任意のアドレスに格納されます.
以下は、FormatAddressからスクリーンショットが表示されます.ジャバ.クラス変数は、CSVフィールドセパレータ(カンマ区切り)、新しいラインセパレータ(出力ファイルに書き込む際に使用する)、出力ファイルの書式設定用のヘッダー、およびパスを持つ入力ファイル名および出力ファイル名のAPIキーに設定されます.簡単にするために、私はクラスのメインメソッドの右側のサンプルプログラムの機能を記述しており、IDEからプログラムを実行することができます.
最初の方法は、出力ファイルを作成して開き、出力ファイルの最初の行にヘッダを書き込むことです.最初の行の最後に改行文字を追加したら、フォーマットされたアドレスデータベースをシミュレートすることができます.次のステップは、最初の行で読み込んで、コンマ区切り文字に分割する文字列配列をインスタンス化することです.これは、各位置が入力ファイルの行からフィールドを保持する配列を生成します.その後、unformattedaddressのコンストラクタに文字列配列を渡します.Javaを使用して、未フォーマットのフィールドをJavaオブジェクトの属性に整理し、HTTP GETリクエスト(API API)に渡すことができます.
  public class FormatAddresses {
  private static final String API_KEY = "YOUR-API-KEY-GOES-HERE";
  private static final String SEPARATOR = ",";
  private static final String NEW_LINE_SEPARATOR = "\n";
  private static final String HEADERS = "streetNumber, streetName, municipality, countryTertiarySubdivision, countrySecondarySubdivision, countrySubdivision, postalCode";
  private static final String INPUT_FILENAME = "C:/documents/Addresses.csv";
  private static final String OUTPUT_FILENAME = "C:/documents/FormattedAddresses.csv"
  public static void main(String[] args) {
    BufferedReader br = null;
    String line = "";
    try {
      FileWriter fileWriter = new FileWriter(OUTPUT_FILENAME);
      fileWriter.append(HEADERS);
      fileWriter.append(NEW_LINE_SEPARATOR);
      br = new BufferedReader(new FileReader(INPUT_FILENAME));
      while ((line = br.readLine()) != null) {
        String[] unformattedAddressArray = line.split(SEPARATOR);
        UnformattedAddress unformattedAddress = new UnformattedAddress(unformattedAddressArray);
        URL url = new URL("https://api.tomtom.com/search/2/structuredGeocode.JSON"
                  + "?key=" + URLEncoder.encode(API_KEY, "UTF-8")
                  + "&countryCode=" + URLEncoder.encode("US", "UTF-8")
                  + "&streetNumber=" + URLEncoder.encode(unformattedAddress.getStreetNumber(), "UTF-8")
                  + "streetName=" + URLEncoder.encode(unformattedAddress.getStreetName(), "UTF-8")
                  + "&municipality=" + URLEncoder.encode(unformattedAddress.getMunicipality(), "UTF-8")
                  + "&countrySecondarySubdivision=" + URLEncoder.encode(unformattedAddress.getCountrySecondarySubdivision(), "UTF-8")
                  + "&countrySubdivision=" + URLEncoder.encode(unformnattedAddress.getCountrySubdivision(), "UTF-8")
                  + "&postalCode=" + URLEncoder.encode(unformattedAddress.getPostalCode(), "UTF-8"));
        HttpURLConnection conn = (HttpURLConnection)url.openConnection();
        InputStream in = new BufferedInputStream(conn.getInputStream());
        String output = readStream(in);
        JSONObject jsonObject = (JSONObject) new JSONParser().parse(output.toString());
        JSONArray results = (JSONArray) jsonObject.get("results");
        for(JSONObject result : results) {
          JSONObject address = (JSONObject)result.get("address");
          JSONObject position = (JSONObject)result.get("position");
          FormattedAddress formattedAddress = new FormattedAddress(address, position);
          writeFormattedAddress(formattedAddress, fileWriter);
        }
        fileWriter.flush();
        fileWriter.close();
      } catch (FileNotFoundException e) {
        e.printStackTrace();
      } catch (IOException e) {
        e.printStackTrace();
      } catch (Parseexception e) {
        e.printStackTrace();
      } finally {
        br.close();
      }
    }
  }
  /** remainder of class omitted */
}

我々が未フォーマットのアドレスオブジェクトをインスタンス化したら、リクエストのために使用するURLを作成できます.APIコールのドキュメントで見ることができるように、構造化されたジオコーディング呼び出しを実行するために必要ないくつかのパラメータがあります.
必要なものは以下のURLを含んでいます.

  • ベースURL:API.トムトム関連キーワード検索

  • バージョン番号: 2

  • 応答形式:私はこの特定の例のためにJSONを選びました.JSONp、JSおよびXMLも有効なオプションです.

  • 国コード:私の例では、私は国コードのために我々を利用しています.

  • APIキー:あなたがTomTom開発者ダッシュボードを通してあなたのアプリケーションを加えたとき、あなたに提供されるAPIキーを挿入することができます.
  • 以下の例で指定したオプションパラメータです.

  • 住所番号:入力ファイルに指定された場合、アドレスの通り番号がAPIリクエストに追加されます.そうでなければ、空の文字列を呼び出しに渡します.
  • 名前

  • 市町村:提供されるならば、都市または町.

  • 国第二の細別:郡、提供されるならば.

  • 国細分:アドレスがある状態.

  • 郵便番号:ZIPコードを提供する場合.
  • 上記のコードに示すように、リクエストのURLは上記のパラメータを使用して構築されます.(レバレッジされる追加のリクエストパラメータの詳細については、ドキュメントを参照ください.
    次のステップはHTTPリクエストを送信し、JSONレスポンスをパースし、フォーマットされたアドレスオブジェクトを構築することでした.次に、出力ファイル(シミュレートされたクリーンデータベース)に書き込みを行うことができます.以下のコードを見てください.
    例えば、入力ファイルの最初の行から取り出した入力を以下に示します.

  • ストリートナンバー:4

  • 道路名:Yawkey

  • 地方自治体:ボストン

  • 郵便番号:2215
  • これはもちろん、フェンウェイパークのアドレスです.しかし、それは不完全です.入力からこれらのフィールドを適切なパラメータのリクエストに提供した後、以下のJSONレスポンスに遭遇します.
      {   
       "summary":{   
          "query":"4 02215 yawkey boston", 
          "queryType":"NON_NEAR", 
          "queryTime":42, 
          "numResults":1, 
          "offset":0, 
          "totalResults":1, 
          "fuzzyLevel":1, 
          "geoBias":{   
             "lat":42.34528579930702, 
             "lon":-71.10655 
          } 
       }, 
       "results":[   
          {   
             "type":"Point Address", 
             "id":"US/PAD/p0/2532244", 
             "score":11.1, 
             "dist":670.4458521397014, 
             "address":{   
                "streetNumber":"4", 
                "streetName":"Yawkey Way, Jersey St", 
                "municipalitySubdivision":"Boston, Fenway", 
                "municipality":"Boston, Boston University, Kenmore", 
                "countrySecondarySubdivision":"Suffolk", 
                "countryTertiarySubdivision":"Boston", 
                "countrySubdivision":"MA", 
                "postalCode":"02215", 
                "extendedPostalCode":"022159103", 
                "countryCode":"US", 
                "country":"United States Of America", 
                "countryCodeISO3":"USA", 
                "freeformAddress":"4 Yawkey Way, Boston, MA 02215", 
                "countrySubdivisionName":"Massachusetts" 
             }, 
             "position":{   
                "lat":42.34679, 
                "lon":-71.09865 
             }, 
             "viewport":{   
                "topLeftPoint":{   
                   "lat":42.34769, 
                   "lon":-71.09987 
                }, 
                "btmRightPoint":{   
                   "lat":42.34589, 
                   "lon":-71.09743 
                } 
             }, 
             "entryPoints":[   
                {   
                   "type":"main", 
                   "position":{   
                      "lat":42.34671, 
                      "lon":-71.09889 
                   } 
                } 
             ] 
          } 
       ] 
    } 
    
    私が特定のフィールドを私の出力「データベース」に保存することに興味があるという事実のために、私は結果配列でルートレベルに位置する位置とアドレスだけを検索します.ご覧のように、Fenway公園のジオコーディングデータ(緯度と経度)に加えて、完全なアドレスデータだけでなく、フリーフォームのアドレスフィールドを提供しています.私は単にこのアドレスと位置データを私の出力ファイルに書き、入力ファイルの次のレコードに移動します.geocoding領域に興味があるかもしれないもう一つのフィールドは、各々の結果のために提供されるエントリポイント配列です.主な通路の正確な位置は与えられます.そして、それはこのデータを検索することによって達成することを望んでいるものに従い非常に貴重でありえました.

    結論
    フォーマットされていないアドレスデータは一般的な課題です.TOMTOMオンライン検索のGeocodingリクエスト機能は、アドレスデータをクリーニングし、ジオコーディングされた場所のデータベースを構築するための簡単に使用できるソリューションを提供しています
    この記事はもともと開発者に登場しました.トムトムブログ.原作者はScott Fitzpatrick .