geocoder-php / geocoder-php/Geocoder

GeocodeQuery WithBounds not strictly used across providers that support it

Open
#1,266 0 comments 0 reactions 0 assignees View on GitHub

Nobody has claimed this yet.

Dominant language
PHP
Stars
4k
Forks
525
Avg merge
8m
Merged PRs (30d)
1

Description

The WithBounds logic needs to be added to providers, as the method is a base method in the query.

E.g. in Nominatims provider we see:

        $viewbox = $query->getData('viewbox');
        if (!is_null($viewbox) && is_array($viewbox) && 4 === count($viewbox)) {
            $url .= '&'.http_build_query([
                'viewbox' => implode(',', $viewbox),
            ], '', '&', PHP_QUERY_RFC3986);

            $bounded = $query->getData('bounded');
            if (!is_null($bounded) && true === $bounded) {
                $url .= '&'.http_build_query([
                    'bounded' => 1,
                ], '', '&', PHP_QUERY_RFC3986);
            }
        }

The above should instead or in-addition accept $query->getBounds(), because otherwise it forces us to write code like:


        // Bounds of EU/UK where our customers are
        $euBounds = new Bounds(34.857764, -30.428009, 75.400203, 41.642303);

        $geocodeQuery = GeocodeQuery::create($query)
            ->withBounds($euBounds)
            // For Nominatim
            ->withData('viewbox', $euBounds->toArray());

Pelias Providers and those that extend it don't support it at all -even though Pelias does:
https://github.com/pelias/documentation/blob/master/search.md#search-within-a-rectangular-region

    /**
     * @param array<string, mixed> $query_data additional query data (API key for instance)
     *
     * @throws \Geocoder\Exception\Exception
     */
    protected function getGeocodeQueryUrl(GeocodeQuery $query, array $query_data = []): string
    {
        $address = $query->getText();

        // This API doesn't handle IPs
        if (filter_var($address, FILTER_VALIDATE_IP)) {
            throw new UnsupportedOperation(sprintf('The %s provider does not support IP addresses, only street addresses.', $this->getName()));
        }

        $data = [
            'text' => $address,
            'size' => $query->getLimit(),
            'layers' => null !== $query->getData('layers') ? implode(',', $query->getData('layers')) : null,
            'boundary.country' => null !== $query->getData('boundary.country') ? implode(',', $query->getData('boundary.country')) : null,
        ];

        return sprintf('%s/search?%s', $this->root, http_build_query(array_merge($data, $query_data)));
    }

Contributor guide

Open the contributing guide

First steps

  1. Read the whole issue, then the project's contributing guide.
  2. Comment on the issue to say you are picking it up — it saves two people doing the same work.
  3. Fork the repository and make your change on a branch.
  4. Open a pull request that references the issue number.

Research direction

Start by inspecting the Nominatim provider's existing viewbox and bounded handling, then trace the Pelias providers through getGeocodeQueryUrl. Compare how GeocodeQuery exposes getBounds() with each provider's supported request parameters. Done means providers that support rectangular bounds consistently use the query bounds without requiring duplicated provider-specific data.

Written by the indexing model from the issue text.

Assessment

Tech stack
php
Domain
api, backend
Issue type
Feature
Difficulty
4/5
Estimated time
3-5 days
Activity status
Stale
Clarity
Mostly clear
Newbie friendliness
35/100

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.