topojson-一个强大的库,可以将地理数据编码为python中的拓扑结构!γ

topojson的Python项目详细描述


topojson

pypi version许可证/a>

[为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]]]}'

可识别以下地理输入数据类型:

在上面的示例中,输出被解析为一个json字符串(.to_json()),但这并不是我们唯一能做的事情。多个函数可用于序列化拓扑对象。

<表><广告>函数必需的软件包 < /广告><正文>topojson.topology().to_json()身材匀称,性感topojson.topology().to_dict()身材匀称,性感topojson.topology().to_svg()身材匀称,性感topojson.topology().to_alt()Shapely、Numpy、Altair*topojson.topology().to_gdf()Shapely、Numpy、Geopandas*topojson.topology().to_widget()shapely、numpy、simplification*、ipywidgets*(+labextension)

*可选依赖项

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(带有fionaversion>;=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

字典的结构应该像{key1obj1key2obj2}。

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()
svg

输入类型:geodataframefrom 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))< ><表>

geodataframe

应用拓扑并将输出显示为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 Altair

输入类型:featurecollectionfrom 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 <表><广告>< T/>几何体 < < 名称< /广告><正文>< 0 >多边形((11,10,0 0,0 1,1 1))无 ABC/< TD> <1</th>多边形((10,11,21,20,10))无 DEF< ><表>

当前将topojson解析为字符串输入需要geopandasfionaversion>;=1.8.6),将geojson解析为字符串需要包geojson

如果您想采用Visvalingam-Whyatt算法来简化或加速Douglas-Peucker算法(与集成版的Shapely相比),则可以使用包Simplification

.to_widget()函数依赖于ipywidgets,要安装并正常工作可能有点困难。但如果您这样做,将显示如下内容:

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.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。

开发说明

此软件包的开发从以下内容开始:

开发此软件包的原因是愿意:

  • 采用shapely(geos)和numpy作为导出拓扑的核心功能。
  • 与python生态系统中的其他地理软件包集成(例如geopandasaltair)。
  • 我们还希望在javascript实现中包含许多可用的测试。

为了在javascript和python实现之间创建某种协同,处理步骤采用了相同的命名约定(extractjoincutdeduphashmap)。即使实际的代码差别很大。

javascript实现和当前的python实现在派生拓扑方面存在一些细微的差异。此处简要介绍了其中一些偏差:

  1. extraction类将所有不同的几何对象存储为linestrings中的形状线条,并在booking\u geoms键下保存这些线条的记录。在javascript实现中有一个diff在和包含所有坐标的单独对象之间的几何引用。由于目前的方法采用的是shapely来完成大部分繁重的工作(在切割过程中),因此提取对我们不利。

  2. 在联接类中,只有具有共享路径的几何图形才被视为具有联接。这意味着两条交叉线在单个坐标处的交点不被视为交点。这也意味着,不会自动将线串的两端视为连接点。因此,如果一个线段在另一个线段上开始或结束,并且该坐标是唯一共同的坐标,则该线段不被视为连接点。

  3. 在计算共享路径时,可以在一个几何图形中的现有坐标上创建连接。在javascript实现中,只有当两个几何图形都包含坐标时,才可以考虑这一点。

  4. 在切割线的过程中;环在javascript实现中旋转,以确保它们从一个连接处开始。这减少了削减的数量。这个旋转是在切割前完成的。在当前的python实现中,这是不同的。首先使用连接坐标剪切线串,然后尝试在包含至少一个共享弧的几何体的非重复弧上应用线合并。

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
java如何使用Ibatis在插入时返回ID(使用返回关键字)   java(org.hibernate.TransactionException)org。冬眠TransactionException:事务未成功启动   java小程序jwindow始终位于JNLP顶部   在Java中重新解析JSON对象?   java单击后将ListView数据移动到新屏幕   Mule ESB中的java WSA寻址特性   Java,对象编程:获取返回0值的方法   hibernate的Java通用问题,如何处理T get(K id)   java在使用超级CSV读取CSV时忽略引用   ssh使用Java远程运行命令   java如何向具体用户发送websocket消息?   在JAVA中,我可以在不指定的情况下使用条件运算符吗?