topojson-一个强大的库,可以将地理数据编码为python中的拓扑结构!γ
topojson的Python项目详细描述
topojson
[为beta用户做好准备!换言之:打断它,但请报告它]
topojson将地理数据结构编码为共享拓扑。这个存储库描述了topojson格式的python实现的开发。
用法
该包可以以多种不同的方式使用,主要目的是创建topojson拓扑:
importtopojsondata=[{"type":"Polygon","coordinates":[[[0,0],[1,0],[1,1],[0,1],[0,0]]]},{"type":"Polygon","coordinates":[[[1,0],[2,0],[2,1],[1,1],[1,0]]]}]tj=topojson.Topology(data,prequantize=False,topology=True)tj.to_json()
导致以下topJSON对象的原因:
'{"type": "Topology", "objects": {"data": {"geometries": [{"type": "Polygon", "arcs": [[-2, 0]]}, {"type": "Polygon", "arcs": [[1, 2]]}], "type": "GeometryCollection"}}, "bbox": [0.0, 0.0, 2.0, 1.0], "arcs": [[[1.0, 0.0], [0.0, 0.0], [0.0, 1.0], [1.0, 1.0]], [[1.0, 0.0], [1.0, 1.0]], [[1.0, 1.0], [2.0, 1.0], [2.0, 0.0], [1.0, 0.0]]]}'
可识别以下地理输入数据类型:
geojson.feature
geojson.featurecollection
geopandas.geodataframe
geopandas.geoseries
shapely.geometry.linestring
shapely.geometry.multilinestring
shapely.geometry.polygon
shapely.geometry.multipolygon
shapely.geometry.point
shapely.geometry.multipoint
shapely.geometry.geometrycollection
dict
提供有效地理界面的对象列出提供有效地理界面的对象
str
具有topojson或geojson地理结构的对象
在上面的示例中,输出被解析为一个json字符串(.to_json()
),但这并不是我们唯一能做的事情。多个函数可用于序列化拓扑对象。
*可选依赖项
topojson格式只是为了创建比其geojson格式更小的文件。它可以通过以下几个选项来实现:计算拓扑、量化输入和/或输出、简化输入和/或输出。
以下参数可用于控制这些选项,以生成topology()
对象。详细信息可以在topojson.topology()
类的docstring中找到。
- 拓扑结构
- 预量化
- 拓扑量化
- 预简化
- 拓扑简化
- 用 简化
- 简化算法
- 缠绕顺序
安装
当前包在pypi上发布为版本1.0rc4
。
安装可以通过以下方式完成:
python3 -m pip install topojson
topojson依赖于以下包:
- 努比
- 形状
windows用户:从https://www.lfd.uci.edu/%7egohlke/pythonlibs/" rel="nofollow">https://www.lfd.uci.edu/~gohlke/pyt下载依赖项荣誉/。 OS X或Linux用户:像往常一样使用pip
此外,可选的依赖项是:
- Altair(通过可视化TopoJSON输出来扩大体验)
- 简化(更多更快的简化选项)
- geojson(用geojson数据解析字符串输入)
- Geopandas(带有
fiona
version>;=1.8.6!,将topojson输出直接解析为geodataframe-将其转换为geojson) - ipywidgets+(lab)扩展(通过互动体验让您的生活更完整)
联系
现在,只需使用github问题。可以是:
- 使用问题
- 错误报告
- 功能建议
- 或任何相关的
示例和教程笔记本
下面的示例展示了解析为不同输出类型的不同输入类型。输入类型不依赖于使用的输出类型,反之亦然,它们只是可能的示例。
输入类型:列表
列表应包含支持 字典的结构应该像{\u geo\u接口的项
importtopojsonlist_geoms=[{"type":"Polygon","coordinates":[[[0,0],[1,0],[1,1],[0,1],[0,0]]]},{"type":"Polygon","coordinates":[[[1,0],[2,0],[2,1],[1,1],[1,0]]]}]
应用拓扑并将输出显示为dict
tj=topojson.Topology(data,prequantize=False,topology=True)tj.to_dict()
{'type':'Topology',[[1.0,0.0],[1.0,1.0]],[[1.0,1.0],[2.0,1.0],[2.0,0.0],[1.0,0.0]]],'objects':{'data':{'geometries':[{'type':'Polygon','arcs':[[-2,0]]},{'type':'Polygon','arcs':[[1,2]]}],'type':'GeometryCollection'}},'options':TopoOptions({'prequantize':False,'presimplify':False,'simplify_with':'shapely','topology':True,'topoquantize':False,'toposimplify':0.0001,'winding_order':'CW_CCW'}),'bbox':(0.0,0.0,2.0,1.0),'arcs':[[[1.0,0.0],[0.0,0.0],[0.0,1.0],[1.0,1.0]],[[1.0,0.0],[1.0,1.0]],[[1.0,1.0],[2.0,1.0],[2.0,0.0],[1.0,0.0]]]}
输入类型:
dict
key1
:obj1
,key2
:obj2
}。importtopojsondictionary={0:{"type":"Polygon","coordinates":[[[0,0],[1,0],[1,1],[0,1],[0,0]]],},1:{"type":"Polygon","coordinates":[[[1,0],[2,0],[2,1],[1,1],[1,0]]],}}
应用拓扑并将输出显示为可缩放矢量图形
tj=topojson.Topology(dictionary,prequantize=False,topology=True)tj.to_svg()
输入类型:
geodataframe
from packagegeopandas
(如果已安装)importgeopandasimporttopojsonfromshapelyimportgeometry%matplotlibinlinegdf=geopandas.GeoDataFrame({"name":["abc","def"],"geometry":[geometry.Polygon([[0,0],[1,0],[1,1],[0,1],[0,0]]),geometry.Polygon([[1,0],[2,0],[2,1],[1,1],[1,0]])]})gdf.plot(column="name")gdf.head()
< div ><表><广告>< T/> < /广告><正文>名称 几何体
< 0 > ABC/< TD> 多边形((0 0,1 0,1 1,0 1,0 0))
<1</th> < ><表> DEF 多边形((10,20,21,11,10))
应用拓扑并将输出显示为Altair
图表(如果已安装)
importtopojsondata=[{"type":"Polygon","coordinates":[[[0,0],[1,0],[1,1],[0,1],[0,0]]]},{"type":"Polygon","coordinates":[[[1,0],[2,0],[2,1],[1,1],[1,0]]]}]tj=topojson.Topology(data,prequantize=False,topology=True)tj.to_json()0
输入类型:featurecollection
from packagegeojson
(如果已安装)
importtopojsondata=[{"type":"Polygon","coordinates":[[[0,0],[1,0],[1,1],[0,1],[0,0]]]},{"type":"Polygon","coordinates":[[[1,0],[2,0],[2,1],[1,1],[1,0]]]}]tj=topojson.Topology(data,prequantize=False,topology=True)tj.to_json()1
应用拓扑并将输出显示为geodataframe
(如果安装了geopandas
)
importtopojsondata=[{"type":"Polygon","coordinates":[[[0,0],[1,0],[1,1],[0,1],[0,0]]]},{"type":"Polygon","coordinates":[[[1,0],[2,0],[2,1],[1,1],[1,0]]]}]tj=topojson.Topology(data,prequantize=False,topology=True)tj.to_json()2 <表><广告>
当前将topojson解析为字符串输入需要geopandas
(fiona
version>;=1.8.6),将geojson解析为字符串需要包geojson
如果您想采用Visvalingam-Whyatt算法来简化或加速Douglas-Peucker算法(与集成版的Shapely
相比),则可以使用包Simplification
。
.to_widget()
函数依赖于ipywidgets
,要安装并正常工作可能有点困难。但如果您这样做,将显示如下内容:
使用ipywidgetS的安装网站,从[5]中的开始,在下面的笔记本中启动以使这些ipywidgets正常工作,但我经常会出现如下错误:
importtopojsondata=[{"type":"Polygon","coordinates":[[[0,0],[1,0],[1,1],[0,1],[0,0]]]},{"type":"Polygon","coordinates":[[[1,0],[2,0],[2,1],[1,1],[1,0]]]}]tj=topojson.Topology(data,prequantize=False,topology=True)tj.to_json()3
任何解决这个错误的建议都是非常感谢的!
此外,作为该软件包的一部分,许多测试也可以用作示例材料。
更改日志
版本1.0rc4
:
- 否
linestring
输入topojson - 序列化topojson或geojson数据的str
- 添加
vw
作为算法类型并更新小部件
版本1.0rc3
:
- 长列表
版本1.0rc2
:
- 在不重复的圆弧上应用线条合并
- 修复没有共享边界的计算拓扑(1,3)
- 将geopandas和geojson单独用于测试,但要将它们识别为类型(\2,\4)
- 使用
简化
作为简化线串的选项 - 包含将顶点捕捉到网格的选项
- 删除了作为依赖项的rdtree,改用
shapely中的
srttree
版本1.0rc1
:
- 初始版本
测试
有许多测试是为了确保所有类型的角落案件都被涵盖。要确保所有测试都将通过,必须将geopandas
的版本>;=0.5.0与fiona
的版本>;=1.8.6结合使用。
建议使用Shapely版本1.7a2(因为https://github.com/toblerity/shapely/pull/733" rel="nofollow">https://github.com/toblerity/shapely/pull/733),但所有测试都通过版本>;=1.6.3。
开发说明
此软件包的开发从以下内容开始:
- https://bost.ocks.org/mike/topology/和https://github.com/topojson作者:mike bostocks和
- 卡尔文·梅特卡夫的https://github.com/calvinmetcalf/topojson.py。
开发此软件包的原因是愿意:
- 采用
shapely
(geos)和numpy
作为导出拓扑的核心功能。 - 与python生态系统中的其他地理软件包集成(例如
geopandas
和altair
)。 - 我们还希望在javascript实现中包含许多可用的测试。
为了在javascript和python实现之间创建某种协同,处理步骤采用了相同的命名约定(extract
,join
,cut
,dedup
,hashmap
)。即使实际的代码差别很大。
javascript实现和当前的python实现在派生拓扑方面存在一些细微的差异。此处简要介绍了其中一些偏差:
extraction类将所有不同的几何对象存储为
linestrings
中的形状线条,并在booking\u geoms
键下保存这些线条的记录。在javascript实现中有一个diff在行
,环
和包含所有坐标
的单独对象之间的几何引用。由于目前的方法采用的是shapely
来完成大部分繁重的工作(在切割过程中),因此提取对我们不利。在联接类中,只有具有共享路径的几何图形才被视为具有联接。这意味着两条交叉线在单个坐标处的交点不被视为交点。这也意味着,不会自动将线串的两端视为连接点。因此,如果一个线段在另一个线段上开始或结束,并且该坐标是唯一共同的坐标,则该线段不被视为连接点。
在计算共享路径时,可以在一个几何图形中的现有坐标上创建连接。在javascript实现中,只有当两个几何图形都包含坐标时,才可以考虑这一点。
在切割线的过程中;环在javascript实现中旋转,以确保它们从一个连接处开始。这减少了削减的数量。这个旋转是在切割前完成的。在当前的python实现中,这是不同的。首先使用连接坐标剪切线串,然后尝试在包含至少一个共享弧的几何体的非重复弧上应用线合并。