Geocoder icon indicating copy to clipboard operation
Geocoder copied to clipboard

sublocality allways null

Open mrelliot69 opened this issue 1 year ago • 8 comments

When retriving addresses the sublocality value is allways null, even tho that the admistrative levels are filled corretly, any reason for this? Any fix ?

mrelliot69 avatar May 19 '23 21:05 mrelliot69

Could you give us more details about your issue ? What provider are you using ? What address ? Is there some error message ?

jbelien avatar May 20 '23 06:05 jbelien

Yes ofc, so the issue is that when i retrieve the subLocality, using the method getSublocality, or even by using the dumper GeoArray this property always comes null. The adminLevels are filled, but the sublocality for some reason never gets assigned a value. I don't get an error message, the error is the sublocality property don't come with data. Provider : Mapbox (but I tested several, and i got the same problem) Regarding the address, same as the provider using any PT address is null

Currently using this setup:

$geocoder = new ProviderAggregator();
$chain = new Chain([
  //new Nominatim\Nominatim($httpClient, 'https://nominatim.openstreetmap.org', 'Geocoder test'),
  new Mapbox($httpClient, $key),
  new Geocoder\Provider\ArcGISOnline\ArcGISOnline($httpClient),
  //new \Geocoder\Provider\GoogleMaps\GoogleMaps($client, 'France'),
  //new \Geocoder\Provider\BingMaps\BingMaps($client, '<API_KEY>'),
]);

$geocoder->registerProvider($chain);
// search by user typed data
$result = $geocoder->geocodeQuery(GeocodeQuery::create($query));
$dumper = new GeoArray();
foreach ($result as $item) { 
  $arraydump = $dumper->dump($item);
}

mrelliot69 avatar May 20 '23 07:05 mrelliot69

Which of the two providers was used? What is the input (address), what the output (full data structure)?

mtmail avatar May 20 '23 08:05 mtmail

Note @mrelliot69 I took the liberty to improve the formatting of the code in your comment to make it more readable.

Indeed, Mapbox provider does not return any sub-locality property (check Mapbox.php).

The available properties will depend on both the provider and the 3rd party API. If the 3rd party API returns the sub-locality (for instance) but the provider doesn't "fetch" it, we can easily add it ; on the other hand, if the 3rd party API doesn't return a sub-locality, there is not much we can do.

In your use case, does the 3rd party API returns a sub-locality ? Could you show us the response you get from the API ?

jbelien avatar May 20 '23 08:05 jbelien

Which of the two providers was used? What is the input (address), what the output (full data structure)?

Its the first one (mapbox)

mrelliot69 avatar May 20 '23 16:05 mrelliot69

Note @mrelliot69 I took the liberty to improve the formatting of the code in your comment to make it more readable.

Indeed, Mapbox provider does not return any sub-locality property (check Mapbox.php).

The available properties will depend on both the provider and the 3rd party API. If the 3rd party API returns the sub-locality (for instance) but the provider doesn't "fetch" it, we can easily add it ; on the other hand, if the 3rd party API doesn't return a sub-locality, there is not much we can do.

In your use case, does the 3rd party API returns a sub-locality ? Could you show us the response you get from the API ?

yeah ofc, im attaching on this reply a response, so you can see it

Geocoder\Provider\Mapbox\Model\MapboxAddress Object
(
    [id:Geocoder\Provider\Mapbox\Model\MapboxAddress:private] => address.8706368440886428
    [streetNumber:Geocoder\Provider\Mapbox\Model\MapboxAddress:private] => 
    [streetName:Geocoder\Provider\Mapbox\Model\MapboxAddress:private] => Avenida Da República
    [resultType:Geocoder\Provider\Mapbox\Model\MapboxAddress:private] => Array
        (
            [0] => address
        )

    [formattedAddress:Geocoder\Provider\Mapbox\Model\MapboxAddress:private] => Avenida Da República, 2685-181 Portela, Lisbon, Portugal
    [neighborhood:Geocoder\Provider\Mapbox\Model\MapboxAddress:private] => 
    [coordinates:Geocoder\Model\Address:private] => Geocoder\Model\Coordinates Object
        (
            [latitude:Geocoder\Model\Coordinates:private] => 38.7818878
            [longitude:Geocoder\Model\Coordinates:private] => -9.115792
        )

    [bounds:Geocoder\Model\Address:private] => 
    [subLocality:Geocoder\Model\Address:private] => 
    [locality:Geocoder\Model\Address:private] => Portela
    [postalCode:Geocoder\Model\Address:private] => 2685-181
    [adminLevels:Geocoder\Model\Address:private] => Geocoder\Model\AdminLevelCollection Object
        (
            [adminLevels:Geocoder\Model\AdminLevelCollection:private] => Array
                (
                    [1] => Geocoder\Model\AdminLevel Object
                        (
                            [level:Geocoder\Model\AdminLevel:private] => 1
                            [name:Geocoder\Model\AdminLevel:private] => Portela
                            [code:Geocoder\Model\AdminLevel:private] => 
                        )

                    [2] => Geocoder\Model\AdminLevel Object
                        (
                            [level:Geocoder\Model\AdminLevel:private] => 2
                            [name:Geocoder\Model\AdminLevel:private] => Lisbon
                            [code:Geocoder\Model\AdminLevel:private] => 11
                        )

                )

        )

    [country:Geocoder\Model\Address:private] => Geocoder\Model\Country Object
        (
            [name:Geocoder\Model\Country:private] => Portugal
            [code:Geocoder\Model\Country:private] => PT
        )

    [timezone:Geocoder\Model\Address:private] => 
    [providedBy:Geocoder\Model\Address:private] => mapbox
    [streetNumber:Geocoder\Model\Address:private] => 
    [streetName:Geocoder\Model\Address:private] => 
)

As you can see the admin level 2 its lisbon so that in theory its also the sublocality and the admin level 2 the locality

mrelliot69 avatar May 20 '23 16:05 mrelliot69

You might be right but according to Mapbox response I don't think we can always assume that Admin Level 1 is the sub-locality.

Check the code here and you'll see that locality is already correctly set (and that Admin Level 2 is region).

Could you show us a response from Mapbox API (the raw response, not the MapboxAddress object) to double check ? Thanks.

jbelien avatar May 20 '23 20:05 jbelien

According to Mapbox documentation there is indeed no sub-locality provided.

jbelien avatar May 20 '23 20:05 jbelien