28

Google Places API を使用して、javascript を使用して住所をオートコンプリートしています

入力ボックスにユニット番号と住所の番地を入力すると、提案ドロップダウンに結果が表示されますが、アクション「place_changed」イベントのリスナーに住所を選択すると、タイプが「サブプレミス」の address_component の住所がありません'formatted_addressプロパティにもユニット番号はありません.ただし、「番地」、「都市」、「国」などの他の詳細は含まれています

例: 「1403/648 Bourke Street」と入力し、国をオーストラリアに制限するとします。ドロップダウンに 5 つの結果が表示され、最初の結果は「1403/648 Bourke street, Melbourne,Australia」ですが、このオプションを選択すると、place_change イベント リスナーに表示されるのは「648 Bourke street, Melbourne, Australia」だけです。

この問題は断続的ですが、一部のユニット アドレスでは機能しますが、他のユニット アドレスでは失敗します。

4

5 に答える 5

12

私には、Google が住所が本物であることを検証しているように思えます (彼らが場所のデータベースを最後に更新したときは、少なくとも本物でした - 政府の記録によると思います)。問題は、新しい「サブプレミス」アドレスが作成されるたびにサブディビジョンが発生し、これらのルックアップがより頻繁に壊れているように見えることです。オートコンプリートの提案として「無効な」アドレスを許可しているのに、結果を制限しているのは奇妙です。

以下のシドニーの住所を検索すると、「サブプレミス」と「番地」が返されます。

"9/321 Pitt Street, Sydney, New South Wales, Australia"

以下のメルボルンの住所は、「ルート」と同じくらい正確です

「2/321 ピット ストリート、ブランズウィック、ビクトリア、オーストラリア」

最大の問題は、結果が返信のどこにもユニットまたは番地を返さないことです。

次の JS をハックして、ユーザーが入力したアドレスと返された結果を比較しました。「数字」が欠落している場合は、追加されます。コードに合わせて、必要に応じてカスタマイズできます。

if (addressType == 'route') {
    var regex = RegExp('^(.*)'+GPLACESSTREET.split(' ',1)[0]), // get all the user entered values before a match with the first word from the Google result
        result = regex.exec(INPUTFEILD.value);

    if ( Array.isArray(result) ) {
        FULLSTREETADDRESS = result[1]+''+GPLACESSTREET; // add the street name to the user-entered unit & street number
    }
}
于 2015-02-06T03:56:59.270 に答える
3

ユニット番号を収集してストリート番号の前に追加したかっただけなので、私の解決策は次のとおりです。

const place = this.AutoComplete.getPlace();
if (isNullOrUndefined(place)) return;

const parts = place.address_components;
const getAddressPart = part => {
  const found = parts.find(p => p.types.indexOf(part) > -1);
  if (found) {
    return found.long_name;
  }

  return null;
};

const address = this.Input.current.value; // input[text] value
let streetNumber = getAddressPart("street_number");

// Regex Match associated
if (streetNumber) {
  const regex = RegExp(`[^\\s,]*(${streetNumber})[^\\s,]*`);
  const foundStreetNumber = regex.exec(address);
  streetNumber = foundStreetNumber[0];
}

const Address = {
  FullAddress: address,
  StreetNumber: streetNumber,
  Street: getAddressPart("route"),
  Suburb: getAddressPart("sublocality"),
  City: getAddressPart("locality"),
  Country: getAddressPart("country"),
  PostCode: getAddressPart("postal_code")
};

これにより、Google Places API からの番地データが改善され、次のような住所に対応します。

4/33 Mokoia Rd、バーケンヘッド、オークランド 0626、ニュージーランド

Proletarska ulica 3/25, Kidričevo, Slovenia (住所の最初に番地がない場合があります)。

また、番地がない場合は何もしません。番地がない場合も値は同じです。

于 2019-05-10T11:32:03.123 に答える
1

@MountainAsh のコードからのわずかな変更:

if (addressType == 'route') {
  var regex = RegExp('^(.*?)'+GPLACESSTREET.split(' ',1)[0]), // get all the user entered values before a match with the first word from the Google result
  result = regex.exec(INPUTFEILD.value);

  if ( Array.isArray(result) ) {
    FULLSTREETADDRESS = result[1]+''+GPLACESSTREET; // add the street name to the user-entered unit & street number
  }
}

追加の? これにより、通りの名前が同じ郊外の名前で始まる場合 (例: 123 Clayton Rd, Clayton) をカバーするために、貪欲でない検索が行われます

于 2017-09-06T04:56:56.467 に答える