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]}
}