Giter Club home page Giter Club logo

geocoding's Introduction

TYPO3 Extension: Geocoding

Provides services for querying Google Maps GeoCoding API v3 in your own extensions.

  • Extension Key: geocoding
  • Author: Benjamin Mack, b13 GmbH, 2012-2024
  • Licensed under: GPLv2+
  • Requires TYPO3 11+ and PHP 8.1 (see older versions of EXT:geocoding for support for previous TYPO3 versions)
  • All code can be found and developed on github: https://github.com/b13/geocoding/

Introduction

This extension provides an abstract way to get geo coordinates of addresses around the world. "Geocoding" let you fetch information about an address and stores it in the DB, by using the TYPO3 Caching Framework.

Installation

Use composer req b13/geocoding or install it via TYPO3's Extension Manager from the TYPO3 Extension Repository using the extension key geocoding.

Configuration

Fetch a Google API key (https://code.google.com/apis/console) and add it to the extension configuration info in the Extension Manager. For more information see here: https://developers.google.com/maps/documentation/geocoding/?hl=en

How to use

Inject the class in your TYPO3 extension. In the rare case, that you cannot use dependency injection, GeneralUtility::makeInstance() works as well.

GeoService

The extension provides the GeoService, a PHP service class to fetch latitude and longitude for a specific address string.

GeoService->calculateCoordinatesForAllRecordsInTable

If you need to query user input, a JavaScript API is probably the best way to do so. However, it can be done via PHP as well, by calling GeoService->getCoordinatesForAddress($street, $zip, $city, $country)

$coordinates = $this->geoServiceObject->getCoordinatesForAddress('Breitscheidstr. 65', 70176, 'Stuttgart', 'Germany');

The method also caches the result of the query.

GeoService->calculateCoordinatesForAllRecordsInTable

The method GeoService->calculateCoordinatesForAllRecordsInTable($tableName, $latitudeField, $longitudeField, $streetField, $zipField, $cityField, $countryField, $addWhereClause) allows you to bulk-encode latitude and longitude fields for existing addresses. The call can easily be built inside a Scheduler Task (see example below).

This way you can fetch the information about an address of a DB record (e.g. tt_address) and store the data in the database table, given that you add two new fields latitude and longitude to that target table in your extension (no TCA information required for that).

Example: Using GeoService as a Scheduler Task for tt_address

Put this into EXT:my_extension/Classes/Task/GeocodingTask.php:

<?php
namespace MyVendor\MyExtension\Task;

/**
 * Class to be called by the scheduler to
 * find geocoding coordinates for all tt_address records
 */
class GeocodingTask extends \TYPO3\CMS\Scheduler\Task\AbstractTask
{
    /**
     * Function executed from the Scheduler.
     */
    public function execute()
    {
        /** @var \B13\Geocoding\Service\GeoService $geocodingService */
        $geocodingService = \TYPO3\CMS\Core\Utility\GeneralUtility::makeInstance(\B13\Geocoding\Service\GeoService::class);
        $geocodingService->calculateCoordinatesForAllRecordsInTable(
            'tt_address',
            'latitude',
            'longitude',
            'address',
            'zip',
            'city',
            'country'
        );
        return true;
    }
}

And also register this class within ext_localconf.php of your extension:

$GLOBALS['TYPO3_CONF_VARS']['SC_OPTIONS']['scheduler']['tasks'][\MyVendor\MyExtension\Task\GeocodingTask::class] = [
    'extension'        => 'myextension',
    'title'            => 'Geocoding of address records',
    'description'      => 'Check all tt_address records for geocoding information and write them into the fields'
];

RadiusService

The other main service class is used for the calculating distances between two coordinates (RadiusService->getDistance(), and querying records from a DB table with latitude and longitude (works perfectly in conjunction with calculateCoordinatesForAllRecordsInTable()) given a certain radius and base coordinates.

Thanks / Contributions

Thanks go to

  • The crew at b13, making use of these features
  • Jesus Christ, who saved my life.

2013-07-05, Benni.

geocoding's People

Contributors

bmack avatar davidsteeb avatar ervaude avatar rintisch avatar smichaelsen avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

geocoding's Issues

Check for empty `$addressPart` can fail

Is neither city nor zip is entered the check if (empty($addressPart)) fails because a white space makes $addressPart being not empty.

foreach ([$street, $zip . ' ' . $city, $country] as $addressPart) {
if (empty($addressPart)) {
continue;
}
$addressParts[] = trim($addressPart);
}
$address = ltrim(implode(',', $addressParts), ',');

Would be a solution to check with strlen(trim($addressPart)) <= 0 instead.

Background:
Otherwise this can lead to two consecutive commas. As a result the request leads sometimes to ZERO_RESULTS.

Is the solution okay? Shall I make a PR?

Add error message for Google Maps API request

It would be nice to have an error message if something is wrong with the API key.

Had for example the following problem:

{
   "error_message" : "This API key is not authorized to use this service or API.",
   "results" : [],
   "status" : "REQUEST_DENIED"
}

Will create a PR.

typing error in GeoService.php

GeoService.php, near line 230:
$cacheManager = GeneralUtility::makeInstance('TYPO3\CMS\Core\Cache\CacheMananger');

should be:
$cacheManager = GeneralUtility::makeInstance('TYPO3\CMS\Core\Cache\CacheManager');

Add support for TYPO3 v8 DBAL

TYPO3 v8 has switched to Doctrine DBAL, this should be supported to ensure compatibility with TYPO3 v9 which will drop the old DB layer.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.