读写空间矢量

geotable的Python项目详细描述


使用GDALpandas以以下格式读取和写入空间向量。

  • GeoJSON
  • KMZ
  • 上海医药
  • CSV

安装

sudo dnf -y install gdal-python3 libkml
# sudo apt-get -y install python3-gdal libkml
virtualenv -p $(which python3) --system-site-packages \
    ~/.virtualenvs/crosscompute
source ~/.virtualenvs/crosscompute/bin/activate
pip install -U geotable

使用

如果克隆或下载了存储库,则可以在tests文件夹中运行这些示例。

$ cd tests

加载URL。

In [1]: import geotable

In [2]: t = geotable.load(
        'https://data.cityofnewyork.us/api/geospatial/tqmj-j8zm'
        '?method=export&format=Original')

加载KMZ文件。

In [1]: import geotable

In [2]: t = geotable.load('xyz.kmz')

加载形状文件。

In [1]: import geotable

In [2]: t = geotable.load('shp.zip')

In [3]: t.iloc[0]
Out[3]:
name                                                 b
quantity                                             2
cost                                              0.66
date                               1990-01-01 00:00:00
geometry_object         POINT (-91.5305465 14.8520705)
geometry_layer                                       b
geometry_proj4     +proj=longlat +datum=WGS84 +no_defs
Name: 0, dtype: object

加载包含空间信息的CSV。

geotable.load('csv/wkt.csv')  # Load single CSV
geotable.load('csv.zip')  # Load archive of multiple CSVs
geotable.load('csv.zip', parse_dates=['date'])  # Configure pandas.read_csv

处理具有不同几何列的CSV。

$ cat csv/latitude_longitude.csv
name,quantity,cost,date,latitude,longitude
b,2,0.66,1990-01-01,14.8520705,-91.5305465

$ cat csv/lat_lon.csv
name,quantity,cost,date,lat,lon
c,3,0.99,2000-01-01,42.2808256,-83.7430378

$ cat csv/latitude_longitude_wkt.csv
name,quantity,cost,date,latitude_longitude_wkt
a,1,0.33,1980-01-01,POINT(42.3736158 -71.10973349999999)

$ cat csv/longitude_latitude_wkt.csv
name,quantity,cost,date,longitude_latitude_wkt
a,1,0.33,1980-01-01,POINT(-71.10973349999999 42.3736158)

$ cat csv/wkt.csv
name,quantity,cost,date,wkt
aaa,1,0.33,1980-01-01,"POINT(-71.10973349999999 42.3736158)"
bbb,1,0.33,1980-01-01,"LINESTRING(-122.1374637 37.3796627,-92.5807231 37.1067189)"
ccc,1,0.33,1980-01-01,"POLYGON ((-83.10973350093332 42.37361082304877, -103.5305394806998 14.85206885307358, -95.7430260175515 42.28082607112266, -83.10973350093332 42.37361082304877))"

处理具有不同空间引用的CSV。

$ cat proj4_from_file.csv
name,wkt
aaa,"POLYGON((326299 4693415,-1980130 1771892,-716771 4787516,326299 4693415))"

$ cat proj4_from_file.proj4
+proj=utm +zone=17 +ellps=WGS84 +datum=WGS84 +units=m +no_defs

$ cat proj4_from_row.csv
name,wkt,geometry_layer,geometry_proj4
aaa,"LINESTRING(-122.1374637 37.3796627,-92.5807231 37.1067189)",l1,+proj=longlat +datum=WGS84 +no_defs
aaa,"POLYGON((326299 4693415,-1980130 1771892,-716771 4787516,326299 4693415))",l2,+proj=utm +zone=17 +ellps=WGS84 +datum=WGS84 +units=m +no_defs

加载并保存在different spatial references中。

from geotable.projections import SPHERICAL_MERCATOR_PROJ4
t = geotable.load('shp.zip', target_proj4=SPHERICAL_MERCATOR_PROJ4)

from geotable.projections import LONGITUDE_LATITUDE_PROJ4
t.save_shp('/tmp/shp.zip', target_proj4=LONGITUDE_LATITUDE_PROJ4)

使用经纬度proj4与使用测地距离的算法(如geopypysal)兼容。测地线距离也称为弧距离,是使用地球曲率测量的两点之间的距离。如果您的位置分布在很大的地理范围内,测地经纬度坐标比欧几里德XY坐标提供更高的精度。

from geotable.projections import LONGITUDE_LATITUDE_PROJ4
t = geotable.load('shp.zip', target_proj4=LONGITUDE_LATITUDE_PROJ4)
t.save_csv('/tmp/csv.zip', target_proj4=LONGITUDE_LATITUDE_PROJ4)
t.save_shp('/tmp/shp.zip', target_proj4=LONGITUDE_LATITUDE_PROJ4)
t.save_kmz('/tmp/xyz.kmz', target_proj4=LONGITUDE_LATITUDE_PROJ4)

使用Universal Transverse Mercator (UTM)投影与在xy坐标上使用欧几里德距离(如scipy.spatial)的算法兼容。如果您知道您的位置限制在一个小区域内,您可以使用基于标准欧几里德算法的投影XY坐标,该算法往往比它们的测地变量快得多。

utm_proj4 = geotable.load_utm_proj4('shp.zip')
t = geotable.load('csv.zip', target_proj4=utm_proj4)
t.save_csv('/tmp/csv.zip', target_proj4=utm_proj4)
t.save_shp('/tmp/shp.zip', target_proj4=utm_proj4)
t.save_kmz('/tmp/xyz.kmz', target_proj4=utm_proj4)

当可视化比精确性更重要时,使用Spherical Mercator投影。不要将此投影用于空间精度很重要的算法。

from geotable.projections import SPHERICAL_MERCATOR_PROJ4
t = geotable.load('csv/wkt.csv', target_proj4=SPHERICAL_MERCATOR_PROJ4)
t.save_csv('/tmp/csv.zip', target_proj4=SPHERICAL_MERCATOR_PROJ4)
t.save_shp('/tmp/shp.zip', target_proj4=SPHERICAL_MERCATOR_PROJ4)
t.save_kmz('/tmp/xyz.kmz', target_proj4=SPHERICAL_MERCATOR_PROJ4)

可以使用draw函数在jupyter笔记本中呈现空间向量。每个几何图层将以不同的颜色显示。

t = geotable.load('csv/wkt.csv')
t.draw()  # Render the geometries in Jupyter Notebook

您还可以直接在jupyter笔记本中使用ColorfulGeometryCollection

from geotable import ColorfulGeometryCollection
from shapely.geometry import Point
ColorfulGeometryCollection([Point(0, 0), Point(1, 1)])

这里还有一些其他的便利功能。

import geotable

# Show WKT for first geometry
geotable.load('xyz.kmz').geometries[0].wkt

# Load without z coordinates
geotable.load('xyz.kmz', drop_z=True).geometries[0].wkt

# Restrict geometries to bounding box
geotable.load('xyz.kmz', bounding_box=(-71.2, 42.37, -71.1, 42.38))

# Restrict geometries to bounding polygon
from shapely.geometry import Polygon
polygon = Polygon([
    (-71.2, 42.37),
    (-71.1, 42.37),
    (-71.1, 42.38),
    (-71.2, 42.38)])
geotable.load('xyz.kmz', bounding_polygon=polygon)

# Load files according to a reference file's UTM projection
reference_path = 'xyz.kmz'
load = geotable.define_load_with_utm_proj4(reference_path)
load('csv/wkt.csv')

测试

pip install pytest pytest-cov
py.test --cov-report term-missing --cov=geotable tests

0.4

  • 添加geotable.save_geojson
  • 添加geotable.save_kmz
  • 保存时排除多余的几何列
  • 支持从geotable类初始化
  • 支持geotable.load(url)

0.3

  • 添加geotable.from_记录
  • 添加geotable.save_csv
  • 添加geotable.save_shp
  • 通过省略几何图形图层和几何图形项目4来减小CSV大小,除非需要
  • 支持复杂的经度和鼓舞人心的纬度

0.2

  • 添加geotable.load
  • 将geotable.to_csv添加到
  • 将geotable.添加到shp中
  • 添加geotable.draw
  • 支持经纬度wkt、经纬度wkt

0.1

  • 添加ColorfulGeometryCollection

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

推荐PyPI第三方库


热门话题
JavaI从另一个Jframe类B扩展了一个J帧类a,但在显示帧B时,它也在B中播放帧a   java适配器模式应用程序   使用并行流从java列表中获取Pojo,而不使用任何类型的索引   java更新文本文件中的双精度   java从webservice返回自定义对象   java在查找多个集合的交集时使用Retainal()的最快顺序   java如何在安卓社交媒体应用程序中应用用户对用户支付?   c代码能引发java异常吗?   Java数组填充了最后一个插槽中的内容   java JOOQ从大表中获取数据:良好实践   使用ApachePOI在JavaSwing中嵌入excel工作表   java如何使用枚举定义常量值组   java JavaFX将文本追加到TextArea引发异常   javascript JS在firefox中无法正常工作   java如何在同一片段中的片段打开后编辑该片段打开的活动中的值   对夏洛克的命令。py的解释不同于linux命令行和java进程api   php在Java中动态创建全局多维数组   html Java XML Transformer将“\n”替换为空格   Javac编译编码问题