Это на самом деле сложный вопрос. Использование решения геокодирования, такого как GeoNames, может привести к серьезным ошибкам для большого количества запросов. Причиной этого является то, что GeoNames ищет информацию в своей базе данных, которая находится ближе всего к вашей точке запроса, а затем возвращает почтовый индекс, который они имеют в записи для этой точки. Это прекрасно работает, когда точка запроса находится прямо над записью в их базе данных, но в противном случае может привести к ошибкам. Например, если их ближайшая запись находится в нескольких кварталах от другого почтового индекса, вы получите неправильный ответ.
Бюро переписей США создало карты почтовых индексов:
https://www.census.gov/geo/reference/zctas.html
Пожалуйста, смотрите их заметки на этой странице.
Я также работал над проектом, который использует карты переписи для предоставления API, который возвращает почтовый индекс для заданной широты и долготы. Это в:
http://askgeo.com
Мы предлагаем как веб-API, так и библиотеку Java, которые вы можете запускать на своем собственном сервере. Библиотека имеет отличную производительность. Поскольку наш сайт предлагает дополнительную информацию, а не только почтовый индекс, вы можете прочитать о нашей службе почтового индекса здесь:
http://askgeo.com/database/UsZcta2010
А о документации по веб-API вы читаете здесь:
http://askgeo.com/#web-api
Методология GeoNames в корне ошибочна для этого типа запроса. Если вы ищете многоугольник, который содержит заданную точку запроса, вам нужна карта с многоугольниками, и вам нужен пространственный индекс для быстрого поиска. GeoNames не имеет ни того, ни другого. AskGeo имеет оба.