使用PHP将shapefile存储到postgresql中
我正在尝试开发一个PHP脚本,允许用户上传shapefile以导入postGIS数据库 首先,对于转换部分,我们可以使用使用PHP将shapefile存储到postgresql中,php,postgresql,postgis,shapefile,Php,Postgresql,Postgis,Shapefile,我正在尝试开发一个PHP脚本,允许用户上传shapefile以导入postGIS数据库 首先,对于转换部分,我们可以使用shp2pgsql将shapefile转换为postgresql表;我想知道是否还有另一种转换方法,因为我不想使用exec()命令 我还想了解一下以一种不需要几十个统一名称的表的方式存储数据的任何想法。从这里了解如何使用PHP shapefile reader插件加载shapefile。这篇博文的重点是在后端使用PHP加载Flash应用程序的数据,但您应该能够忽略Flash部分
shp2pgsql
将shapefile转换为postgresql表;我想知道是否还有另一种转换方法,因为我不想使用exec()
命令
我还想了解一下以一种不需要几十个统一名称的表的方式存储数据的任何想法。从这里了解如何使用PHP shapefile reader插件加载shapefile。这篇博文的重点是在后端使用PHP加载Flash应用程序的数据,但您应该能够忽略Flash部分,并根据需要使用PHP部分
从shapefile加载数据后,可以将几何图形转换为WKT字符串,并使用ST_GeomFromText或其他PostGIS函数存储在数据库中
关于shapefile的唯一列,我发现这是存储特殊shapefile属性然后检索数据的最直接的方法。但是,如果不关心属性名称或类型,可以使用“tuple”系统,将属性转换为字符串,然后将它们存储在任意命名的列(col1、col2、col3等)中
如果您关心名称和类型,那么可以更进一步,将它们作为shapefile“schema”存储在另一个表中 除了使用postgresql的二进制文件转换shapefile之外,似乎没有其他方法了。虽然这并不是一个糟糕的选择,但如果有PHP本机函数或apache模块,我宁愿不使用
exec()
!
然而,听起来似乎只有exec
是明智的选择。所以我要用它。
没有怨恨!:)
关于最后一部分,这是一个不同的问题,应该单独提问。尽管如此,恐怕没有别的办法了
更新添加示例
是一个包含“SRID”的常量李>SRID
是指向所需形状文件的路径$shpfilpath
是表所需的名称$tblname
- 编写shp2pgsql并使用文本编辑器ie定义其参数 崇高的记事本等
- 复制、粘贴和更改每个 层李>
- 另存为批处理文件.bat
- 拉起命令窗口李>
- 调出保存yu.bat文件的目录李>
- 点击回车键,它将运行所有形状文件的代码,这些文件将上载到 在编写代码时定义的数据库李>
- 使用qgis,转到postgis窗口并点击connect
很好,您的形状文件现在已经准备就绪,可以作为图层添加到地图中。确保空间参照与运行之前的空间参照相匹配。这有意义吗?我希望这是最快的方法 添加此答案只是为了方便那些寻找与OP相同且不想依赖
eval()
或外部工具的人
截至2019年8月,您可以使用一个免费的开源PHP库,我已经开发和维护了几年,它可以读取和写入任何ESRI Shapefile,并将其从WKT和GeoJSON转换为本机文件,而无需任何第三方依赖
使用my library,它提供WKT与PostGIS函数一起使用,并使用一个包含所有数据的数组来执行一个简单的
插入,使此任务变得简单、快速和安全,而不需要邪恶的eval()
您能更具体地说明“形状”是什么吗?如果它是一个在多个(x,y)节点之间有直线的多边形,那么一个具有(x,y,ord)
列的表就可以完成这个任务。当然,ord
是为了保持坐标的正确顺序。@halfer'shapefile是数据表,包含一列几何数据。为什么需要“几十个唯一命名的列”?在基本文件结构中,我没有看到任何在数据输出中需要这样做的内容。另外,为什么要避免exec/shellcmd/etc?运行一个外部编译的应用程序来转换数据将比试图用PHP之类的东西来处理数据要高效得多,这样做并没有什么特别的错误。@JacobS对不起,我的错。我是说“桌子”!不幸的是没有。正如我提到的,它是一个脚本,允许网站用户上传他们自己的shapefile。欢迎来到SOF:)你到底是如何使用它的?你能举个例子吗?谢谢
$queries = shell_exec("shp2pgsql -s ".SRID." -c $shpfilpath $tblname")
or respond(false, "Error parsing the shapfile.");
pg_query($queries) or respond(false, "Query failed!");