Установите границы почтового индекса в Google Map API

Я видел все ответы на аналогичный вопрос, но либо все они старые, либо на них никто не ответил.

Мне дали задание получить почтовые индексы и отобразить их соответствующие границы пользователю на карте Google, как в этом примере.

Я пишу этот код на Javascript и использую API Карт Google. Я хочу, чтобы пользователь ввел почтовый индекс, и маркер упал на место назначения с рамкой, представляющей эту область почтового индекса. Я вижу, что в настоящее время в коде карт Google Maps есть что-то, что позволяет увидеть границы, если кто-то поместит почтовый индекс на maps.google.com. Я использовал многоугольники, но это не помогло бы сделать границу вокруг определенного почтового индекса.

Есть предложения о том, как это получить?

Заранее спасибо!


person njavia66    schedule 13.07.2012    source источник
comment
Вы пробовали посмотреть, как Google сделал это со своей собственной страницей и собственным API?   -  person Lee Taylor    schedule 13.07.2012
comment
Да, многие вещи, которые я нахожу, являются статьями, а что нет. В другом сообщении говорилось, что они используют Twitter API, но я не смог найти именно этот.   -  person njavia66    schedule 13.07.2012
comment
Я только что поговорил с сотрудниками отдела продаж Digital Map Products, чтобы узнать о том, как сделать это через их службу ParcelStream, и они посоветовали мне, что Google входит в число их клиентов. (услуга около 10к / месяц).   -  person johntrepreneur    schedule 17.05.2013
comment
используйте www.boundaries-io.com в худшем случае очень хорошо.   -  person Jeryl Cook    schedule 26.07.2016


Ответы (3)


Я знаю непростой ответ на этот вопрос. Но вот схема высокого уровня того, как это сделать.

Все шейп-файлы для почтовых индексов можно найти на сайте переписи и загрузить с этого ftp-сервера. Однако это тонна данных, поэтому вам нужно место для их хранения. Я рекомендую использовать базу данных PostgreSQL с надстройкой PostGIS. Это бесплатно, с открытым исходным кодом и в целом потрясающе. В нем есть утилита для преобразования файлов .shp (тип в файлах формы переписи) в геометрическую форму PostGIS. PostGIS позволяет получать формы обратно в формате KML.

Вы можете а) получить форму из базы данных как KML, когда это необходимо, и отобразить ее на карте, или б) заранее сгенерировать файл kml для каждого почтового индекса и получить файл по мере необходимости (это занимают совсем немного места).

person Mark    schedule 13.07.2012
comment
О, черт возьми, звучит как долгий процесс! : - / На самом деле у меня есть файл excel, полный почтовых индексов, а чего нет, и я могу попросить пользователя ввести почтовый индекс, и в середине почтового индекса появится маркер. Есть ли способ избежать использования KML? - person njavia66; 13.07.2012
comment
@ njavia66 Вы можете избежать KML (я его не использую), но вам все равно нужна база данных, полная полигонов. Вы вряд ли сможете сохранить эту информацию в файле Excel. Я использую PostgreSQL / PostGIS, как предложил Марк. И да, это долгий процесс, требующий множества различных навыков, за который серьезные клиенты платят тысячи долларов, поэтому я не ожидал получить халяву. :-) - person Marcelo; 13.07.2012
comment
@ njavia66 Трудно избежать KML (или GeoJSON или другого формата gis), если вы хотите, чтобы отображались границы почтового индекса. AFAIK, Google не предоставляет вам формы почтового индекса. Если вы в порядке, просто сбросив маркер, вы можете поместить свою электронную таблицу в Google Fusion Tables и извлечь эти данные с помощью API Карт (developers.google.com/maps/documentation/javascript/). - person Mark; 13.07.2012
comment
@Mark: обратите внимание, что то, что вы получаете от Бюро переписи населения, не является почтовым индексом, как определено USPS. Вместо этого они являются ZCTA или «областями табуляции почтовых индексов». census.gov/geo/ZCTA/zcta.html - person Marcelo; 13.07.2012
comment
Потрясающие! @Marcelo Я искал не халяву, а простой способ ее интегрировать. :) Кажется, простая идея, но ее трудно реализовать, и это нормально. Мне нравятся вызовы. Спасибо, что рассказали мне базу полигонов! Это палочка-выручалочка. Я рисовал их, и если у вас было много маркеров в почтовом индексе ... это становится некрасиво! - person njavia66; 13.07.2012
comment
Вы можете найти многоугольники почтового индекса в общедоступных таблицах FusionTables, вы можете использовать FusionTableLayer для их отображения, если сможете найти их все. - person geocodezip; 13.07.2012
comment
@Mark, спасибо за ссылку! Я испортил таблицы слияния, но они, кажется, неправильно рассчитывают почтовые индексы, которые я им скармливаю. Я обязательно изучу KML и посмотрю, что я могу предложить Вам обоим, СПАСИБО! : D - person njavia66; 13.07.2012
comment
@Marcelo Хорошее замечание. Настоящие почтовые индексы на самом деле не полигоны, это маршруты, по которым USPS может доставлять почту (полилинии, я думаю). Но я думаю, что ZCTA обычно полезны для того, что делает njavia. - person Mark; 13.07.2012
comment
@Mark - Я вижу, что redfin.com (сайт недвижимости) не только добавляет границы для введенных почтовых индексов, но и каким-то образом делает это для отдельных свойств / участков. На redfin, щелкните значок дома, затем щелкните быстрые карты справа и обратите внимание на многоугольник вокруг адреса собственности. Есть ли в рекомендуемом решении многоугольники для отдельных участков / свойств? - person johntrepreneur; 17.05.2013
comment
@Marcelo - не могли бы вы также взвесить мой предыдущий комментарий? Я тоже хотел бы получить ваш отзыв. Спасибо! - person johntrepreneur; 17.05.2013
comment
@Mark - я разместил его здесь в качестве другого вопроса, если вам нужна дополнительная информация или вы хотите на нее ответить. - person johntrepreneur; 17.05.2013

Вам необходимо ознакомиться с коллекциями FeatureCollections в формате GeoJSON. Вы можете отображать их на любом наборе фрагментов карты с помощью OpenLayers (или, возможно, также Google API).

Это может показаться довольно сложным, но вполне достижимо.

Если поискать, вы можете приобрести файлы GeoJSON для групп почтовых индексов.

person lazaruslarue    schedule 24.02.2016

ЗАГРУЗИТЕ шейп-файл отсюда https://catalog.data.gov/dataset/tiger-line-shapefile-2019-2010-nation-us-2010-census-5-digit-zip-code-tabulation-area-zcta5-na

Упрощение использования GDAL

Мы можем использовать команду ogr2ogr из библиотеки GDAL для преобразования шейп-файла в geojson, но даже с одним полем и простыми координатами выходной файл превышает 1 ГБ.

ogr2ogr -f GeoJSON -select ZCTA5CE10 -lco COORDINATE_PRECISION=6 zcta.geojson /vsizip/tl_2017_us_zcta510.zip

Я попытался упростить это до topojson, но библиотека topojson задыхается от этого даже на очень мощном MacBook Pro 2017 года.

_2 _ ›› Не хватает памяти для JavaScript

Другой метод, который я пробовал, заключался в использовании параметра -simplify в ogr2ogr. Аргумент упрощения - это единица измерения, основанная на системе пространственной привязки шейп-файла. Поскольку srs для ZCTA - WGS84, единица измерения - это широта / долгота.

ogr2ogr -f "GeoJSON" -lco COORDINATE_PRECISION=6 -select ZCTA5CE10 -simplify 0.006 zcta.geojson /vsizip/tl_2017_us_zcta510.zip

Это создает файл GeoJSON гораздо меньшего размера (30 МБ), который TopoJSON может легко обрабатывать, и в итоге мы получаем более управляемый (но все еще слишком большой) файл topojson размером 13 МБ. Кроме того, топология набора данных очень плохая в средних и крупных масштабах.

npx topojson -q 1e5 -o zcta_topo.json zcta.geojson

Упрощение использования Postgis

Создайте том докера для использования для сохранения тома докера создать postgresql

Запустите докер postgis

docker run --name postgis -p 25432:5432 -it --mount source=postgresql,target=/var/lib/postgresql kartoza/postgis

Загрузите шейп-файл zcta в postgis

ogr2ogr -f "PostgreSQL" -progress -select "ZCTA5CE10" -overwrite -lco OVERWRITE=yes -nln zcta -nlt PROMOTE_TO_MULTI -t_srs "EPSG:4326" PG:"dbname='gis' host='localhost' port='25432' user='docker' password='docker'" ~/Downloads/tl_2017_us_zcta510/tl_2017_us_zcta510.shp

Пример запроса с st_simplifypreservetopology (Новая Англия). Это занимает много времени для всей страны, и мы все равно теряем большую часть топологии.

select st_simplifypreservetopology(wkb_geometry, 0.025) as thegeom, zcta5ce10 from zcta where zcta5ce10 like '0%' OR zcta5ce10 like '1%'

Упрощение с помощью Mapshaper (лучшее решение)

Библиотека Mapshaper может выводить TopoJSON прямо из шейп-файла без ошибок кучи памяти JavaScript. Эта команда создает файл topojson размером ~ 6 МБ, который мы можем использовать. Ему также удается очень хорошо поддерживать топологию, предполагая, что очень близкие вершины и ребра должны совпадать.

npx -p mapshaper mapshaper-xl tl_2017_us_zcta510.shp snap -simplify 0.1% -filter-fields ZCTA5CE10 -rename-fields zip=ZCTA5CE10 -o format=topojson zcta_mapshaper.json

источник: https://github.com/elastic/ems-file-service/issues/6

person Sahil Kashyap    schedule 26.07.2020