ujamii/geocoder-neos

此包最新版本(v0.1.0)没有可用的许可信息。

此包提供了一种非常灵活的方式来地理编码您的节点属性。

安装量: 4,694

依赖者: 0

建议者: 0

安全: 0

星标: 2

关注者: 3

分支: 1

开放问题: 0

类型:neos-package

v0.1.0 2021-01-20 22:07 UTC

This package is auto-updated.

Last update: 2024-09-11 14:48:33 UTC


README

Packagist

此包提供了一种非常灵活的方式来地理编码您的节点属性。想象一下,您有一个包含一些物理地址数据(街道、邮编、城市)的文档或内容类型,并想在地图上显示这些数据(例如,使用 WebExcess.OpenStreetMap)或您需要这些地理数据来进行一些计算。

安装

composer req ujamii/geocoder-neos php-http/guzzle6-adapter

使用方法

此包提供了一个新的节点类型混合 "Ujamii.Geocoder:Mixin.AddressData"。将此混合添加到您的包中所需的节点类型

'Your.Package:Document.BranchLocation':
    superTypes:
        'Neos.Neos:Document': true
        'Ujamii.Geocoder:Mixin.AddressData': true

这将向节点检查器添加一些新的属性。当您添加地址数据后,在保存更改后,将添加地理数据。这是通过一个功能丰富的包完成的 Geocoder

FormatD.GeoIndexableWwwision.Neos.AddressEditor 有何区别?

您可能会问。嗯,后者也使用地理编码包,但仅使用精确的一个地理编码服务:Google Maps。相比之下,这个包没有任何限制地整合了地理编码包。尽管我这里默认包括了 Nominatim/OpenStreetMap 数据提供者,但您可以使用 完全不同 的,或者使用不同的配置。这就是这个包更加灵活的原因。

Configuration/Objects.yaml 文件中,NEOS 的 对象管理 功能被用来配置用于从地址数据获取坐标的地理编码器/数据提供者。

Geocoder\StatefulGeocoder:
  className: 'Geocoder\StatefulGeocoder'
Geocoder\Provider\Nominatim\Nominatim:
  className: 'Geocoder\Provider\Nominatim\Nominatim'

Ujamii\Geocoder\Service\GeocodingService:
  properties:
    geocoder:
      object:
        name: 'Geocoder\StatefulGeocoder'
        arguments:
          1:
            object:
              name: 'Geocoder\Provider\Nominatim\Nominatim'
              arguments:
                1:
                  object: 'Http\Adapter\Guzzle6\Client'
                2:
                  value: 'https://nominatim.openstreetmap.org'
                3:
                  value: 'NEOS CMS Ujamii.Geocoder'
          2:
            value: 'de'

如您所见,提供了用于所用对象的构造函数的所有参数,当然,您可以通过自己的包和配置进行更改。

Configuration/Settings.yaml 文件中,也可以更改属性配置。所以,比如说,您需要更多属性,如国家或州。您只需将这些添加到您的节点类型或创建自己的混合,该混合再次可能具有 Ujamii.Geocoder:Mixin.AddressData 作为超类型。当发送给数据提供者时,属性将通过一个 空格 字符连接。

但您甚至可以更换这部分。在保存节点后的事件将检查配置的类型,所以如果您创建了自定义类型,只需在您的设置中设置即可

Ujamii:
  Geocoder:
    GeocodingService:
      observedNodeType: 'Ujamii.Geocoder:Mixin.AddressData'
      observedProperties: ['street', 'zip', 'city']
      mandatoryProperties: ['street', 'zip', 'city']

现在,假设一切配置如您所愿,您想显示一个 漂亮的地图,将文档作为地图标记添加,并带有漂亮的工具提示和信息弹出框(我们添加了一些更多属性)

(对于此示例,安装 WebExcess.OpenStreetMap,但任何其他地图都可以正常工作)

prototype(Your.Package:Content.BranchLocationMap) < prototype(Neos.Neos:ContentComponent) {
    @context.branches = Neos.Fusion:Loop {
        items = ${q(site).find('[instanceof Your.Package:Document.BranchLocation]').get()}
        @glue = ','
        itemRenderer = Neos.Fusion:RawArray {
            type = "Feature"
            properties {
                tooltip = ${q(item).property('title')}
                popup = Your.Package:Component.Molecule.BranchLocationMapPopup {
                    company = ${q(item).property('company')}
                    street = ${q(item).property('street')}
                    zip = ${q(item).property('zip')}
                    city = ${q(item).property('city')}
                    phone = ${q(item).property('phone')}
                    email = ${q(item).property('email')}
                }
            }
            geometry {
                type = "Point"
                coordinates = ${[q(item).property('longitude'), q(item).property('latitude')]}
            }
            @process.json = ${Json.stringify(value)}
        }
    }

    map = WebExcess.OpenStreetMap:Map.Component {
        json = ${'[' + branches + ']'}
    }

    renderer = afx`
        <div>
            {props.map}
        </div>
    `
}

prototype(Your.Package:Component.Molecule.BranchLocationMapPopup) < prototype(Neos.Fusion:Component) {
    company = ''
    street = ''
    zip = ''
    city = ''
    phone = ''
    email = ''

    renderer = afx`
        <p>
            {String.nl2br(props.company)}<br/>
            {props.street}<br/>
            {props.zip} {props.city}
        </p>
        <p>
            {props.phone}
            {props.email}
        </p>
    `
}

使用不同的提供商

比如说,你想使用Google Maps作为数据提供商。首先,安装这个包

composer require geocoder-php/google-maps-provider

然后,调整配置

Geocoder\StatefulGeocoder:
  className: 'Geocoder\StatefulGeocoder'
Geocoder\Provider\GoogleMaps\GoogleMaps:
  className: 'Geocoder\Provider\GoogleMaps\GoogleMaps'

Ujamii\Geocoder\Service\GeocodingService:
  properties:
    geocoder:
      object:
        name: 'Geocoder\StatefulGeocoder'
        arguments:
          1:
            object:
              name: 'Geocoder\Provider\GoogleMaps\GoogleMaps'
              arguments:
                1:
                  object: 'Http\Adapter\Guzzle6\Client'
                2:
                  value: null
                3:
                  value: '<your-api-key>'
          2:
            value: 'de'

所需库

composer require ...

然后在Objects.yaml中配置它,如果你想的话,可以提供可选的构造函数参数。

待办事项

  • 特性:多语言
  • 特性:添加用于地理编码和反向地理编码的eel助手方法
  • 特性:命令控制器用于填充空值(例如导入的节点)

许可证和贡献

GPLv3

因为是开源的,非常欢迎你通过报告错误、改进代码、编写测试或你能做的任何其他事情来为项目做出贡献。

如果你想帮助我,请从我的亚马逊心愿单上为我买点什么。