Привет! ПОдскажите, как правильно работать с городами у себя в проекте? Планирую использовать, скорее всего ФИАС. Его будем использовать в виде подсказок. Далее нужно организовать GEO модуль для хранения стран, городов, регионов. Планирую ID хранить как в ФИАС по типу UUID. Подскажите как это организовать и взаимодействовать?
На VUE посылаем запросы для подсказчика. Если нашли город, то помещаем UUID города. Так же страны, и региона. Длаее отправляем эти ID в Backend. Он делает запрос на существование таких данных. Если такие данные найдены - проверяет запрос в своём модуле GEO. Если такого города нет, то добавляет его. Далее уже этот ID присваивает в сущности, где нужен город. В модуле город так же сохраняем ID ФИАС. Правильно ли я мыслю?
Далее я планирую работать с адресами. подскажите как тут быть? Зависеть польностью от ФИАС не удобно. Если вдруг она откажет, то адреса не подгрузятся. Тогда нам придется хранить свою базу адресов, по аналогии с городами. Верно?
Подскажите как лучше работать с городами в проекте. Либо вообще отказаться от своего модуля GEO и использовать ID только ФИАС? Либо данные хранить в виде названий, а не ID? В общем я в замешательстве! Если есть какие-то примеры - рад буду посмотреть. Очень волнует этот вопрос.
На гитхабе куча проектов которые парсят фиас.
Я для себя делал mssql и потоковый парсер. Эти его гигабайты он прожевывает минут за 30. База в итоге весит в пределах 10гб.
Впрочем если ограничится населенными пунктами то размер будет мегабайт 20.
Если скачивать "дельту", то время обработки вообще несколько секунд.
Из плюсов всегда актуальная информация. Данные лучше храните в Guid, в фиасе они собственно так и хранятся, правда криворучки бывают загружают как строки. Таких записей порядка 20 на всю их базу.
Правильно ли понял, что создаем свою базу. Парсим всю базу сразу к себе. и сохраняем рядом ID ФИАС. в проектах вставляем только ID города из своей базы. Нужно ли в таблице еще хранить id страны или получаем по городу?
pro-dev, ФИАС только для России, для других стран попробуйте MAXMIND.
Для примера контроллер из реального проекта
#region License
// Разработано: Коротенко Владимиром Николаевичем (Vladimir N. Korotenko)
// email: koroten@ya.ru
// skype:vladimir-korotenko
// https://vkorotenko.ru
// Создано: 19.08.2019 20:44
#endregion
using HeIsBad.Code;
using HeIsBad.Models;
using Microsoft.AspNetCore.Mvc;
using System.Linq;
namespace HeIsBad.Controllers
{
/// <summary>
/// Адресный контроллер. Занимается всеми вопросами связанными с адресами, регионами и прочим.
/// </summary>
[Route("api/address")]
[ApiController]
public class AddressController : Controller
{
private static Country[] _countryes = new Country[]
{
new Country{Id = 643,
Alpha2 = "RU",
Alpha3 = "RUS",
Name = "Russia"},
};
private Region[] _regions = RegionsSinglton.Instance.Items;
private City[] _cityes = CityesSinglton.Instance.Items;
/// <summary>
/// Список стран в системе.
/// </summary>
/// <returns></returns>
[HttpGet]
[ResponseCache(Location = ResponseCacheLocation.Any, Duration = 86000)]
public IActionResult Get()
{
return Ok(_countryes);
}
/// <summary>
///
/// </summary>
/// <param name="country"></param>
/// <returns></returns>
[HttpGet("{country}")]
[ResponseCache(Location = ResponseCacheLocation.Any, Duration = 86000)]
public ActionResult<Country> Get(string country)
{
var res = _countryes.FirstOrDefault(x => x.Alpha2 == country.ToUpper());
if (res == null)
return NotFound(new { error = "Not found country" });
return res;
}
/// <summary>
/// Список регионов для страны.
/// </summary>
/// <param name="country"></param>
/// <returns></returns>
[HttpGet("{country}/regions")]
[ResponseCache(Location = ResponseCacheLocation.Any, Duration = 86000)]
public ActionResult GetRegions(string country)
{
var res = _countryes.FirstOrDefault(x => x.Alpha2 == country.ToUpper());
if (res == null)
return NotFound(new { error = "Not found country" });
if (res.Alpha2 == "RU")
return Ok(_regions);
return NoContent();
}
/// <summary>
/// Список городов для страны. Только Россия. Первым идет спецобьект "Вся Россия", потом Москва и Санк-Петербург, дальше сортировка по коду.
/// </summary>
/// <param name="country">Код страны, ru</param>
/// <param name="query">Поисковая фраза, по умолчанию все</param>
/// <param name="limit">Лимит для запроса</param>
/// <returns></returns>
[HttpGet("{country}/cityes")]
[ResponseCache(Location = ResponseCacheLocation.Any, Duration = 86000)]
public ActionResult GetCityes(string country, [FromQuery]string query = "", [FromQuery]int limit = 10)
{
var res = _countryes.FirstOrDefault(x => x.Alpha2 == country.ToUpper());
if (res == null)
return NotFound(new { error = "Not found country" });
if (res.Alpha2 == "RU")
{
return Ok(GetFilteredCityList(query, limit));
}
return NoContent();
}
/// <summary>
/// Отдает лимитированное количество городов.
/// </summary>
/// <param name="query">Если строка не пустая то применяется фильтр</param>
/// <param name="limit"></param>
/// <returns></returns>
private City[] GetFilteredCityList(string query, int limit)
{
if (string.IsNullOrEmpty(query))
return _cityes.Take(limit).ToArray();
query = query.ToLower();
return _cityes.Where(x => x.Name.ToLower().Contains(query) || x.Slug.ToLower().Contains(query))
.Take(limit)
.ToArray();
}
}
}
#region License
// Разработано: Коротенко Владимиром Николаевичем (Vladimir N. Korotenko)
// email: koroten@ya.ru
// skype:vladimir-korotenko
// https://vkorotenko.ru
// Создано: 19.08.2019 14:38
#endregion
using Newtonsoft.Json;
using System;
namespace HeIsBad.Models
{
/// <summary>
/// Город
/// </summary>
public class City
{
/// <summary>
/// Идентификатор
/// </summary>
public int Id { get; set; }
/// <summary>
/// Регион к которому принадлежит город
/// </summary>
public int RegionId { get; set; }
/// <summary>
/// Имя города
/// </summary>
public string Name { get; set; }
/// <summary>
/// Longitude
/// </summary>
public long Lon { get; set; }
/// <summary>
/// Lattitude
/// </summary>
public long Lat { get; set; }
/// <summary>
/// Название для ЧПУ
/// </summary>
public string Slug { get; set; }
/// <summary>
/// Префикс образования, например район или область
/// </summary>
public string Prefix { get; set; }
/// <summary>
/// Идентификатор
/// </summary>
[JsonIgnore]
public Guid Guid { get; set; }
/// <summary>
/// Вышестоящий обьект, используется для вывода иерархии
/// </summary>
public string Parent { get; set; }
}
}
Руководитель frontend направления, предприниматель
Если тебе нужна география, то чем Яндекс плох?
Ну а если тебя беспокоит страховка от падения сервака, то чисто теоретически ты можешь разработать логику, которая будет перекидываться от одного API к другому. Конечно, тебе придется заводить много полей, так как идентификаторы 100% разные. Зато надёжно)
Мне кажется такой себе подход))
Яндекс? Можно и яндекс. Просто видел, что в основном используют фиас.
Единственно не понимаю как лучше взаимодействовать и хранить. А может и вообще обойтись без ФИАС и просить пользователей просто добавлять города самим?)