collective.geo.*包的集成包。
项目描述
介绍
此产品帮助集成collective.geo.*包,旨在提供一些合理的默认设置。除了一些集成胶水之外,它还定义了一个新的接口IGeocodableLocation,可以用于创建适配器,知道如何将具有地址字段的内容的地理位置表示为字符串,以便传递给地理编码API。
目的
通过IGeocodableLocation适配器自动地理编码IGeoreferenceable内容类型
地理编码响应的缓存
只有当内容项上的位置相关字段发生变化时才触发地理编码查找
便于基于位置字段自动地理编码,同时仍允许手动设置自定义坐标
用法
自动地理编码内容类型
为了使您的内容类型在ObjectEdited或ObjectInitialized事件上自动地理编码,您需要为您的内容类型创建一个实现IGeocodableLocation的适配器,并知道如何从内容类型的与位置相关的字段中构建一个可地理编码的位置字符串。
为了实现该接口,您需要在您的适配器上定义一个getLocationString方法,该方法返回完整的地理位置作为一个逗号分隔的字符串,从左到右位置部分逐渐变得不那么具体。
例如
'1600 Amphitheatre Parkway, Mountain View, CA, US' 'Engehaldestr. 53, 3012 Bern, Switzerland'
如果getLocationString方法返回空字符串或None,则事件处理器将不会尝试进行地理编码查找,因此这是在位置信息不足时终止地理编码的建议方法。
示例代码
from ftw.geo.interfaces import IGeocodableLocation from zope.component import adapts from zope.interface import implements class MyTypeLocationAdapter(object): """Adapter that is able to represent the location of an MyType in a geocodable string form. """ implements(IGeocodableLocation) adapts(IMyType) def __init__(self, context): self.context = context def getLocationString(self): """Build a geocodable location string from the MyType's address related fields. """ street = self.context.getAddress() zip_code = self.context.getZip() city = self.context.getCity() country = self.context.getCountry() location = ', '.join([street, zip_code, city, country]) return location
使用ZCML注册适配器
<adapter factory=".mytpe.MyTypeLocationAdapter" />
地理编码响应的缓存
地理编码API的响应正在使用RAM进行缓存。所使用的缓存键是getLocationString方法的结果,这意味着对于每个唯一的地理位置字符串,地理编码查找只会进行一次,之后从缓存中获取。
仅在位置字段更改时触发地理编码
如果我们要在每个ObjectEdited事件上执行地理编码查找,则任何已设置的定制坐标都会在更改内容项的任何字段时(即使地理编码响应本身是从缓存中获取的)被覆盖。
为了避免这种情况,ftw.geo将getLocationString的结果存储为对象的注解,并在ObjectEdited上检查地理位置字符串(以及相关的位置字段)是否实际上已更改,只有在必要时才进行查找。这意味着
在ObjectInitialized时,内容类型将首先进行地理编码初始化(除非getLocationString返回None或空字符串)。如果您通过collective.geo.contentlocations提供的“坐标”选项卡手动设置坐标,则它们将被保存并覆盖之前由地理编码确定的坐标。之后,如果您编辑内容项并更改任何与位置无关的字段,则自定义坐标将被保留。只有在更改getLocationString中使用的位置相关字段之一时,才会再次执行地理编码,并覆盖任何自定义坐标。
Google API密钥
可以使用Google的地理编码API而不需要API密钥,但这样每天的请求限制为2500次。如果您在collective.geo.settings中定义了Google Maps API密钥,则将使用它;否则,将不带API密钥调用地理编码API。
在自定义模板中渲染内容地图小部件
如果您不想在内容项的主要视图中使用默认的小部件管理器(plone.abovecontentbody / plone.abovecontentbody)显示内容地图,而是想在自定义视图中或使用不同的小部件管理器,请按照以下步骤操作
首先,您需要确保您的浏览器视图实现了一个特定的接口,并为它提供KMLMapViewletLayer适配器(视图、请求、上下文、小部件)
<adapter for="..interfaces.IContactView zope.interface.Interface zope.interface.Interface zope.interface.Interface" factory="collective.geo.kml.browser.viewlets.KMLMapViewletLayers" />
您的视图类必须提供collective.geo.kml.interfaces.IKMLOpenLayersView
from collective.geo.kml.interfaces import IKMLOpenLayersView from Products.Five.browser import BrowserView from zope.interface import implements class ContactView(BrowserView): implements(IKMLOpenLayersView)
然后,在您的视图模板中,简单地使用collective.geo.mapwidget提供的宏
<div id="kml-content-viewlet"> <metal:use use-macro="context/@@collectivegeo-macros/openlayers" /> <metal:use use-macro="context/@@collectivegeo-macros/map-widget" /> </div>
依赖关系
collective.geo.contentlocations
如果您在通过分发包管理器安装collective.geo.*依赖项(特别是libgeos和shapely)时遇到问题,您可以使用此buildout配置自行构建
shapely.cfg:
[buildout] parts += geos shapely [geos] recipe = zc.recipe.cmmi url = http://download.osgeo.org/geos/geos-3.3.5.tar.bz2 md5sum = 2ba61afb7fe2c5ddf642d82d7b16e75b extra_options = CC='gcc -m32' CXX='g++ -m32' [shapely] recipe = zc.recipe.egg:custom egg = Shapely include-dirs = ${geos:location}/include library-dirs = ${geos:location}/lib rpath = ${geos:location}/lib
在您的main buildout.cfg中使用它,如下所示
[buildout] extends = # ... shapely.cfg [instance1] eggs += ${shapely:egg} environment-vars += LD_LIBRARY_PATH ${geos:location}/lib
链接
贡献者
Lukas Graf [lukasg],作者
版权
本软件包的版权由4teamwork拥有。
ftw.geo许可协议为GNU通用公共许可证,版本2。
变更日志
1.4.2 (2019-10-23)
将plone5不兼容的依赖项移至plone4 extra [Nachtalb]
1.4.1 (2019-04-01)
修复找不到位置的错误,引发False异常,导致用户收到错误的错误信息 [Nachtalb]
1.4.0 (2019-01-23)
位置适配器可能返回utf-8或unicode,所以让我们使用safe_uniode来确保。 [mathias.leimgruber]
停止支持Plone 4.2。 [mathias.leimgruber]
从版本1.3.6开始需要plone.api 1.5.1。 [mathias.leimgruber]
添加Plone 5.1测试配置。 [mathias.leimgruber]
1.3.6 (2018-10-10)
从“IGeoSettings.googleapi”传递Google API密钥到GoogleV3(现在需要)。 [mathias.leimgruber]
停止支持Plone 4.1。 [jone]
1.3.5 (2016-09-29)
修复德语翻译。 [mbaechtold]
1.3.4 (2016-03-30)
修复在使用ftw.geo结合IReferenceable行为时的错误。此错误将在plone >= 4.3.8时出现 [elioschmutz]
1.3.3 (2016-03-30)
修复在没有给出位置时删除坐标的错误。如果您从对象中删除现有的地址,处理程序现在也会删除坐标。这导致地图在对象上不再可见。 [elioschmutz]
限制某些依赖项的版本,以免拉入Plone 5。 [mbaechtold]
1.3.2 (2014-10-20)
声明plone.app.dexterity为依赖项。Dexterity在handlers.py中使用。 [mathias.leimgruber]
1.3.1 (2014-10-20)
使用Archetypes事件处理AT内容,使用zope.lifecycle事件处理DX。 [mathias.leimgruber]
修复:不再将geocode(geocoders.GoogleV3)强制转换为列表。它已经是列表。 [mathias.leimgruber]
1.3 (2013-11-26)
使用条件导入来处理geopy 0.96中的API更改。 [lgraf]
使用zope.lifecycleevents为dexterity支持。 [jone]
添加缺少的依赖项。 [Julian Infanger]
1.2 (2013-05-10)
修复德语翻译文件。 [jone]
修复渲染GQueryError时门户消息的UnicodeDecode错误。 [jone]
1.1 (2013-04-03)
在错误信息翻译中使用消息ID和默认值。 [lgraf]
改进在保存时进行地理编码时的异常处理。处理网络错误和其他任何未处理的异常,并为所有情况显示有意义的消息。 [lgraf]
根据新功能修复测试 [mathias.leimgruber]
在自动地理编码没有产生任何结果时显示状态消息。 [lgraf]
确保在切换到V3地理编码API后从googlev3 geocoder导入我们检查的异常。 [lgraf]
处理自动地理编码的多个结果。当保存内容项的自动地理编码产生多个匹配项时,选择第一个,并向用户显示一条消息,说明他们可能需要更改它。 [lgraf]
删除API密钥使用。geopy GoogleV3 Geocoder没有实现API密钥。 [mathias.leimgruber]
使用geopy 0.95的Google地图API V3。请参阅 -> http://plone.293351.n2.nabble.com/collective-geo-GBadKeyError-when-geocoding-w-geopy-td7563845.html [mathias.leimgruber]
1.0 (2012-12-03)
添加使用quickinstaller卸载Products.Maps的导入步骤。 [lukasg]
首次实现。 [lukasg]
项目详情
ftw.geo-1.4.2.tar.gz的哈希
算法 | 哈希摘要 | |
---|---|---|
SHA256 | 523504a8aaeb730b0dc91b4f951e9d32431ce8482055a06aaf240820e3ce8c24 |
|
MD5 | bc206113cb56b1f4f606f711bf5274c6 |
|
BLAKE2b-256 | f90616c4323af10fd25fc8320af8baf65d4ea7098b60a9fbaf9409907f2fab92 |