GEO-Umkreissuche mit dem Contentfly CMS

Version 1.5.0 ermöglicht mit dem Geo-Plugin neue API-Funktionen für die Umkreissuche

Die in Kürze verfügbare Version 1.5.0 des Contentfly CMS hält ein neues Geo-Plugin bereit, mit dem zum Beispiel einfach eine Umkreissuche über die API umgesetzt werden kann.

Das Plugin ist bereits jetzt unter github.com/area-net-gmbh/contentfly-plugin-geo verfügbar. Jede Entität kann nach der Installation über ein Trait mit entsprechenden Geodaten (z.B. Felder für Längen- und Breitengrad) ausgestattet werden. Dies Entitäten verfügen im Backend automatisch über eine Kartendarstellung (Leaflet.js und OpenStreetMap) und  Geokodierung. Diese erfolgt über OpenCageData. Zur Nutzung ist ein kostenloser Account unter opencagedata.com und der entsprechende API-Key bei der Installation einzutragen:

$app['pluginManager']->register('Areanet_Geo', API_KEY');


Entitäten anpassen

Eine entsprechende Entität, z.B. PointsOfInterest kann wie folgt erweitert werden - bei der jetzigen Vorab-Version des Geo-Plugins, müssen in der Entität die Properties street, zipcode und city vorhanden sein!

namespace Custom\Entity;

use Areanet\PIM\Classes\Annotations as PIM;
use Areanet\PIM\Entity\Base;
use Doctrine\ORM\Mapping as ORM;
use Plugins\Areanet_Geo\Traits\Geo;

/**
* @ORM\Entity
* @ORM\Table(name="poi")
* @PIM\Config(label="POIs", labelProperty="name", sortBy="name")
*/
class PointOfInterest extends Base
{

use Geo;

/**
* @ORM\Column(type="string")
* @PIM\Config(showInList=20, label="Titel")
*/
protected $name;

/**
  * @ORM\Column(type="string")
  * @PIM\Config(showInList=30, label="Strasse")
  */

protected $street;

/**
  * @ORM\Column(type="string")
  * @PIM\Config(showInList=40, label="PLZ")
  */

protected $zipcode;

/**
  * @ORM\Column(type="string")
  * @PIM\Config(showInList=50, label="Ort")
  */

protected $city;

...
}

Umkreissuche über API

Objekte dieser Entität können über die Query-API per Umkreissuche (in km) abgefragt werden.

POST api/query

JSON-Body
{
"select": "id, name, lat, lng, (6371 * acos(cos(radians( 48.7784485 )) * cos(radians( lat )) * cos(radians( lng ) - radians( 9.1800132 )) + sin(radians( 48.7784485 )) * sin(radians( lat )))) as distance",
"from": "PointOfInterest",
"where": {"(6371 * acos(cos(radians( ? )) * cos(radians( lat )) * cos(radians( lng ) - radians( ? )) + sin(radians( ? )) * sin(radians( lat )))) < 5": [48.7784485, 9.1800132, 48.7784485]}
}

zurück zur Übersicht