Использование данных Shapefile для определения окрестности для долготы / широты - PullRequest
6 голосов
/ 17 декабря 2009

Я пытаюсь определить окрестность для местоположения, основываясь на свободно публикуемых данных Zillow Shapefile.

Я действительно ничего не знаю о формате Shapefile, и у меня возникли некоторые проблемы с поиском учебников в Интернете - но я в основном хочу взять пары широта / долгота и запустить их по данным Shapefile, чтобы определить соответствующие окрестности. ).

Кто-нибудь может указать мне правильное направление? Даже не уверен, с чего начать.

Здесь я взял файлы Shapefile: http://www.zillow.com/howto/api/neighborhood-boundaries.htm

Ответы [ 2 ]

9 голосов
/ 11 апреля 2010

Вот пример использования PostGIS, пространственного расширения postgresql. Подобные расширения существуют для mysql, oracle, mssql, sqlite и, без сомнения, других баз данных. PostGIS должен быть установлен , чтобы это работало.

Сначала вы должны преобразовать шейп-файл в файл sql:

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

Затем запустите sql в базе данных (в данном случае в базе данных gis), чтобы преобразовать файл 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) Для справки наберите «help».

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 простым запросом.

3 голосов
/ 09 апреля 2010

Если вы еще не получили ответ на эту тему, предложенный вами метод не является наиболее эффективным механизмом. Я постараюсь раскрыть идею о том, как вы можете сделать это более эффективным способом.

Начните с импорта вашего шейп-файла в базу данных / хранилище данных GeoSpatial.

Широкую / длинную модель сравнения все еще можно использовать, но она только вызовет больше работы для вас. Геопространственные базы данных / хранилища данных предоставляют функции для сравнения геометрий (точка, линия, многоугольник). Вместо использования широты и долготы все типы геометрии хранятся в одном столбце геометрии. Затем функции позволяют сравнивать расстояние, размер, наложение, пересечение и другие сравнения.

Как переводится шейп-файл?

Шейп-файл - это набор табличных данных, имя окрестности и дополнительные поля, а также способ сопоставления этих записей с пространственно представленным местоположением. Это геопространственная база данных в группе файлов. На ум приходит сравнение, когда кто-то использует доступ в качестве базы данных по сравнению с традиционной базой данных сервера. Доступны наборы инструментов / библиотеки, которые преобразуют шейп-файл в геопространственную базу данных. Вы можете найти больше информации, ища GDAL.

Надеюсь, это было полезно.

...