geocoder-php / Geocoder

The most featured Geocoder library written in PHP.
https://geocoder-php.org
MIT License
3.94k stars 517 forks source link

sublocality allways null #1185

Open mrelliot69 opened 1 year ago

mrelliot69 commented 1 year ago

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

jbelien commented 1 year ago

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

mrelliot69 commented 1 year ago

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);
}
mtmail commented 1 year ago

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

jbelien commented 1 year ago

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 ?

mrelliot69 commented 1 year ago

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

Its the first one (mapbox)

mrelliot69 commented 1 year ago

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

jbelien commented 1 year ago

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 commented 1 year ago

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