ujamii / geocoder-neos
此包提供了一种非常灵活的方式来地理编码您的节点属性。
Requires
- geocoder-php/nominatim-provider: ^5.4
- neos/flow: *
- php-http/message: ^1.10
This package is auto-updated.
Last update: 2024-09-11 14:48:33 UTC
README
此包提供了一种非常灵活的方式来地理编码您的节点属性。想象一下,您有一个包含一些物理地址数据(街道、邮编、城市)的文档或内容类型,并想在地图上显示这些数据(例如,使用 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
您可能会问。嗯,后者也使用地理编码包,但仅使用精确的一个地理编码服务: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助手方法
- 特性:命令控制器用于填充空值(例如导入的节点)
许可证和贡献
因为是开源的,非常欢迎你通过报告错误、改进代码、编写测试或你能做的任何其他事情来为项目做出贡献。
如果你想帮助我,请从我的亚马逊心愿单上为我买点什么。