0

を使用する場合Geo::Coder:Google、住所から緯度/経度へのマッピングは逆に機能します。

ただし、特に緯度/経度を住所に変換する場合、出力は具体的なフィールドに関する即時アクセスには適していません。

私のデバッグログによると:

loc by lat 48.308472 / lon 14.284578 ---\ {#012 address_components [#012 [0] {#012 long_name "Nibelungenbrücke",#012 short_name "B129",#012 types [#012 [0] "route"#012 ]#012 },#012 [1] {#012 long_name "Landstraße",#012 short_name "Landstraße",#012 types [#012 [0] "neighborhood",#012 [1] "political"#012 ]#012 },#012 [2] {#012 long_name "Innenstadt",#012 short_name "Innenstadt",#012 types [#012 [0] "sublocality",#012 [1] "political"#012 ]#012 },#012 [3] {#012 long_name "Linz",#012 short_name "Linz",#012 types [#012 [0] "locality",#012 [1] "political"#012 ]#012 },#012 [4] {#012 long_name "Linz",#012 short_name "Linz",#012 types [#012 [0] "administrative_area_level_2",#012 [1] "political"#012 ]#012 },#012 [5] {#012 long_name "Upper Austria",#012 short_name "OÖ",#012 types [#012 [0] "administrative_area_level_1",#012 [1] "political"#012 ]#012 },#012 [6] {#012 long_name "Austria",#012 short_name "AT",#012 types [#012 [0] "country",#012 [1] "political"#012 ]#012 },#012 [7] {#012 long_name 4020,#012 short_name 4020,#012 types [#012 [0] "postal_code"#012 ]#012 }#012 ],#012 formatted_address "Nibelungenbrücke, 4020 Linz, Austria",#012 geometry {#012 bounds {#012 n

部分文字列サブを使用すると、気が狂いそうになります。現在、コード:

    sub map_latlon_to_loc($$){ my $lat = shift; my $lon = shift;
          $location = $geocoder_google->reverse_geocode(latlng => $lat.','.$lon);
          dbg("loc by lat ".$lat." / lon ".$lon." --- " . p $location);
    }

内の属性にアクセスするのに適した具体的な方法/メソッド/サブはどれ$locationですか?

ところでp、プリンターモジュールを指します

CPANでは何も見られません。これでうまくいきます。USだけで機能するわけではありません。私の実装は、どの国にも対応する必要があります。

4

1 に答える 1

3

Google から返されたデータを表示するために何を使用しているのかはわかりませんが ( と は何dbgですかp?)、それは確かに文字列ではありません。これは、ネストされたハッシュと配列を含む複雑なハッシュです。を使用Data::Dumpして表示すると、内容が明らかになり、アクセスと操作が簡単になります。

このプログラムは、独自のサブルーチンの修正バージョンを使用して、グリニッジの王立天文台の情報をフェッチします。次に、配列long_nameの各行の値を出力します。address_componentsまた、Data::Dump何が返されているかを確認できるように、を使用してデータ構造全体をダンプします。

必要に応じて、Data::Dumperも使用できます。これは Perl 5 のコア モジュールであるため、インストールする必要はありませんが、生成されるテキストのレイアウトは に比べて劣りData::Dumpます。

use strict;
use warnings;

use Geo::Coder::Google;
use Data::Dump;

my $geocoder = Geo::Coder::Google->new(apiver => 3);

my $location = map_latlon_to_loc(51.4768777, 0);

my $address = $location->{address_components};
print $_->{long_name}, "\n" for @$address;
print "\n\n";
dd $location;

sub map_latlon_to_loc {
  my ($lat, $lng) = @_;
  $geocoder->reverse_geocode(latlng => "$lat,$lng");
}

出力

Blackheath Avenue
Greater London
United Kingdom
SE10 8XJ
London


{
  address_components => [
    {
      long_name => "Blackheath Avenue",
      short_name => "Blackheath Ave",
      types => ["route"],
    },
    {
      long_name => "Greater London",
      short_name => "Gt Lon",
      types => ["administrative_area_level_2", "political"],
    },
    {
      long_name => "United Kingdom",
      short_name => "GB",
      types => ["country", "political"],
    },
    {
      long_name => "SE10 8XJ",
      short_name => "SE10 8XJ",
      types => ["postal_code"],
    },
    { long_name => "London", short_name => "London", types => ["postal_town"] },
  ],
  formatted_address => "Blackheath Avenue, London SE10 8XJ, UK",
  geometry => {
    bounds        => {
                       northeast => { lat => 51.4770228, lng => 0.0005404 },
                       southwest => { lat => 51.4762273, lng => -0.0001147 },
                     },
    location      => { lat => 51.4766277, lng => 0.0002212 },
    location_type => "APPROXIMATE",
    viewport      => {
                       northeast => { lat => 51.4779740302915, lng => 0.00156183029150203 },
                       southwest => { lat => 51.4752760697085, lng => -0.00113613029150203 },
                     },
  },
  types => ["route"],
}
于 2013-10-21T14:23:18.530 に答える