Вы можете иметь частные конструкторы дел, но выставлять публичные активные шаблоны с такими же именами. Вот как вы можете определить и использовать их (функции создания для краткости опущены):
module Helpers =
type ValidValue =
private
| ValidInt of int
| ValidString of string
let (|ValidInt|ValidString|) = function
| ValidValue.ValidInt i -> ValidInt i
| ValidValue.ValidString s -> ValidString s
module Usage =
open Helpers
let validValueToString = function
| ValidInt i -> string i
| ValidString s -> s
//
Много геопространственных платформ выручит Вас с этим. В геопространственном мире почтовый индекс является просто "полигоном", который является просто областью на карте, которая определяет ясные границы (не полигон в математическом смысле). В SQL пространственный 2008, например, можно создать новый полигон на основе исходного полигона. Таким образом, можно динамично создать полигон, который является почтовым индексом, расширенным определенным расстоянием в каждой точке. Это принимает броскую форму почтового индекса во внимание. С адресом Это легко, потому что Вы просто создаете полигон, который является кругом вокруг одной точки. Можно затем сделать, запросы дают Вам всем точки в новом полигоне, который Вы создали в любом методе.
Много этих сайтов в основном просто делает это. Они дают Вам всем, точки в 5 милях расширили полигон, и затем возможно, 10 миль расширили полигон и т. д. и т. п. Они на самом деле не вычисляют расстояние. Большая часть материала мамы в сети не сложна вообще.
Вы видите некоторые основные примеры здесь, чтобы в общих чертах понять то, о чем я говорю.
Существует стандарт zipode/location доступная база данных. Вот одна версия в формате Доступа, который включает lat/long индекса, а также другой информации. Можно затем использовать расширения PostgreSQL GIS, чтобы сделать поиски на местоположениях, например.
(предполагающий, конечно, что Вы извлекаете дб доступа и вставляете в более дружественную базу данных как PostgreSQL),
Я думаю, что это довольно универсально. Они берут адрес или индекс и заходят, это к "координате карты" (отличается в зависимости от реализации, вероятно, lat/long), и затем использование "координат карты" вещей в базе данных, легко вычислить расстояние.
Обратите внимание, что некоторые плохие реализации преобразовывают индекс в в координату, представляющую центр области индекса, которая иногда дает плохие результаты.
Точно так же, как Вы сказали. Преобразуйте адрес/ZIP в 2D мировую координату и сравните его с другими известными местоположениями. Выберите ближайшее.:) Я думаю, что некоторый DB (Oracle, MSSQL 2008) даже предлагают некоторые функции, которые могут помочь, но я никогда не использовал их.
Во-первых, Вы Геокод адрес, переводя его в (обычно) широту и долготу. Затем Вы делаете ближайший соседний запрос на своей базе данных для интересных мест.
Большинство пространственных индексов непосредственно не поддерживает ближайшие соседние запросы, таким образом, обычный подход здесь должен запросить на ограничительной рамке разумного размера с геокодируемой точкой в центре, затем отсортируйте результаты в памяти для выбора самых близких.
Ваши мысли о том, как сделать это, - то, как я, вероятно, сделал бы это. Можно геокодировать co-oridinated для zip и затем сделать вычисления на основе этого. Я знаю SQL Server, 2008 имеет некоторую специальную новую функциональность для помощи выполнению запросов на основе их, геокодировал координаты lon/lat.
Существуют фактические геометрические алгоритмы и/или datastructures, которые поддерживают ниже O (...) ближайшие запросы местоположения на точке, строке и/или данных региона.
См. эту книгу как пример информации о некоторых из них, как: Диаграммы Вороного, деревья квадрантов, и т.д.
Однако я думаю, что другие ответы здесь являются правильными в большинстве случаев, что Вы находите в программном обеспечении сегодня:
У меня была таблица, что я буду компилировать таблицу базы данных каждые 6 месяцев, она содержала 3 столбца, я использовал ее для нескольких клиентов в Австралии, она содержала о 40k строк, очень легких для выполнения запроса. это довольно быстро, если просто надеющийся успешно начинать что-то для клиента
Расстояние
ВЫБЕРИТЕ Store_ID, Store_AccountName, Store_PostalCode, Store_Address, Store_Suburb, Store_Phone, Store_State, Code_Distance ОТ Хранилища, (ВЫБЕРИТЕ Code_To Как Code_To, Code_Distance ИЗ Кода ГДЕ Code_From = @PostalCode ОБЪЕДИНЕНИЕ ВЕСЬ ИЗБРАННЫЙ Code_From Как Code_To, Code_Distance ИЗ Кода ГДЕ Code_To = @PostalCode ОБЪЕДИНЕНИЕ ВЕСЬ ВЫБОР @PostalCode Как Code_To, 0 Как Code_Distance) Как Код, ГДЕ Store_PostalCode = Code_To И Code_Distance <= @Distance ORDER BY Code_Distance
Может быть много оптимизации, которую Вы могли сделать для ускорения этого запроса!.