6

我正在尝试根据 Zillow 自由发布的 Shapefile 数据确定某个位置的邻域。

我对 Shapefile 格式一无所知,并且在网上查找教程时遇到了一些麻烦——但我基本上想获取纬度/经度对,然后针对 Shapefile 数据运行它以确定相应的邻域。

谁能指出我正确的方向?甚至不知道从哪里开始。

这是我获取 Shapefile 文件的地方:http ://www.zillow.com/howto/api/neighborhood-boundaries.htm

4

2 回答 2

9

这是一个使用 PostGIS 的示例,它是 postgresql 的空间扩展。mysql、oracle、mssql、sqlite 以及毫无疑问的其他数据库也存在类似的扩展。 必须安装 PostGIS 才能正常工作。

首先,您必须将 shapefile 转换为 sql 文件:

fmark@fmark-laptop:~$ shp2pgsql -c Desktop/zillow/ZillowNeighborhoods-AK.shp zillowak > Desktop/zillow/ZillowNeighborhoods-AK.sql
Shapefile type: Polygon
Postgis type: MULTIPOLYGON[2]

然后在数据库(本例中为数据库“gis”)上运行 sql 以将 sql 文件转换为启用空间的表:

fmark@fmark-laptop:~$ psql -d gis -f Desktop/zillow/ZillowNeighborhoods-AK.sql
SET
BEGIN
...
COMMIT

此时您可能想要创建一个空间索引,因为您将要进行空间查询:

fmark@fmark-laptop:~$ psql -d gis
psql (8.4.2)
Type "help" for help.

gis=# CREATE INDEX idx_neighborhoods ON zillowak USING gist(the_geom);
CREATE INDEX
gis-# \q

现在,如果您有纬度/经度(在本例中为 -149.309W,60.985S),您可以找到它所在的邻域: fmark@fmark-laptop:~$ psql -d gis psql (8.4.2) 键入“帮助”寻求帮助。

gis=# select gid, state, county, city, name, regionid from zillowak WHERE ST_CONTAINS(the_geom, GeomFromText('POINT(-149.309 60.985)', -1));
 gid | state |  county   |   city    |     name      | regionid 
-----+-------+-----------+-----------+---------------+----------
  29 | AK    | Anchorage | Anchorage | Turnagain Arm |   275783
(1 row)

gis=# \q
fmark@fmark-laptop:~$ 

这最后阶段显然可以通过简单的查询从 PHP 中完成。

于 2010-04-11T05:02:16.367 回答
3

如果您尚未收到有关此主题的答案,则您建议的方法不是最有效的机制。我将尝试打破如何以更有效的方式做到这一点的想法。

首先将 shapefile 导入 GeoSpatial 数据库/数据存储。

纬度/经度比较模式仍然可以使用,但它只会给你带来更多的工作。地理空间数据库/数据存储提供了比较几何(点、线、多边形)的功能。所有几何类型都存储在单个几何列中,而不是使用纬度和经度。然后,这些函数允许您比较距离、大小、叠加、交叉点和其他比较。

shapefile 如何翻译?

shapefile 是表格数据的集合,包括邻域名称和其他字段,以及将这些记录映射到空间表示位置的方法。它是一组文件中的地理空间数据库。想到的比较是使用访问作为数据库与传统服务器数据库的比较。有可用的工具集/库可以将 shapefile 转换为地理空间数据库。您可以通过搜索 GDAL 找到更多信息。

希望这对您有所帮助。

于 2010-04-09T00:15:51.993 回答