0
Отвечен

Как понять, дом найден в интервале или не найден?

Александр Хованский 7 лет назад обновлен 7 лет назад 4

Согласно документации, поле fias_id в подсказках может иметь следущий смысл:

  • HOUSE.HOUSEGUID, если дом найден в ФИАС по точному совпадению;
  • HOUSEINT.INTGUID, если дом найден в ФИАС как часть интервала;
  • ADDROBJ.AOGUID в противном случае.

Проблема в том, что не все эти варианты можно различить.


Случай, когда дом найден по точному совпадению, можно определить по fias_level == 8.

Если дом найден в интервале, fias_id является кодом интервала и fias_level == 7 (улица).

Если дом не найден (но найдена улица), fias_id является кодом улицы и fias_level == 7 (улица).


Таким образом, невозможно отличить последние два случая, и неизвестно, чем является fias_id, следовательно, нельзя его использовать.


В принципе API дает возможность обойти эту проблему, сравнив fias_id и street_fias_id. Но.

- Получается, что поле fias_id бесполезно: его действительный смысл нужно выводить из других полей.

- Поле street_fias_id доступно не во всех интерфейсах к API. В частности, в библиотеке для C# есть только fias_id (впрочем, это проблема этой библиотеки сама по себе).

Ответ

Ответ
Отвечен

> Если fias_level == улица, то брать street_fias_id вместо fias_id


Если вам не нужны интервалы, то рекомендую именно так и делать. Более того, я бы вообще не использовал ФИАС-коды домов, а всегда хранил код улицы + номер дома. Потому что ФИАС-коды домов неустойчивые, они могут меняться (это противоречит идее уникального идентификатора, но факт — налоговая их меняет).

На рассмотрении

Александр, добрый день!


Уточните, пожалуйста, для чего вы используете fias_id, и зачем нужна информация, принадлежит ли этот код именно интервалу домов?

Здравствуйте, Анастасия.


Я хочу идентифицировать адреса по ФИАС, но иметь возможность представлять и дома (как минимум), которых в ФИАС нет.

Для этого нужен код ФИАС наиболее специфичного объекта, найденного в ФИАС. Т.е. если найден дом, то адрес будет представлен просто его кодом ФИАС. Если найдена улица, то код улицы + номер дома. Возможно, и дальше - код города + название улицы + номер дома, и т.д. В качестве такого кода наиболее специфичного объекта я и пытаюсь использовать fias_id. Насколько я понимаю, он для этого и задумывался.


Только то, что он может быть кодом интервала домов, мешает. Для наших задач интервалы не нужны. Поэтому, когда fias_id обозначает интервал домов, я хочу брать вместо него код улицы.

И здесь проблема - неизвестно, когда он означает интервал домов.


Впрочем, проблему можно обойти. Если fias_level == улица, то брать street_fias_id вместо fias_id. Тогда все равно, что обозначает fias_id.


Дальше возникает другая проблема: в библиотеке для C# многие поля, включая street_fias_id, недоступны. Но об этом я заведу другую тему.

Ответ
Отвечен

> Если fias_level == улица, то брать street_fias_id вместо fias_id


Если вам не нужны интервалы, то рекомендую именно так и делать. Более того, я бы вообще не использовал ФИАС-коды домов, а всегда хранил код улицы + номер дома. Потому что ФИАС-коды домов неустойчивые, они могут меняться (это противоречит идее уникального идентификатора, но факт — налоговая их меняет).

> ФИАС-коды домов неустойчивые, они могут меняться (это противоречит идее уникального идентификатора, но факт — налоговая их меняет)

Не знал этого, спасибо за подсказку.


Хотя с конкретно моим случаем разобрались, проблема в API существует: неочевидно, как отличить, когда fias_id содержит код улицы, а когда интервала.

Сервис поддержки клиентов работает на платформе UserEcho