Получить текущее местоположение пользователей

#c# #wpf #networking #geolocation #location

Вопрос:

Я работал над приложением WPF, в котором необходимо было определить текущее местоположение пользователей (оно настраивается в настройках = нет анонимного отслеживания личных данных). Было протестировано несколько решений.

Альтернатива № 1 — отлично работает на разных компьютерах, также включен VPN. Местоположение отслеживается на основе IP-адреса, и все, кажется, хорошо. Однако недостатком этого является то, что он использует внешние источники, такие как сторонние веб-сайты, для получения IP-адреса, а затем считывает этот IP-адрес, чтобы узнать местоположение.

 public string GetPublicIP()
{
  String direction = string.Empty;
  WebRequest request = WebRequest.Create("http://website/");
  using (WebResponse response = request.GetResponse())
  using (StreamReader stream = new StreamReader(response.GetResponseStream()))
  {
    direction = stream.ReadToEnd();
  }

  //Search for the ip in the html
  // code here

  return direction;
}
 

Альтернатива № 2 — Класс геолокатора C#. Это отлично работает с дополнительным файлом JSON с координатами геолокации и данными о местоположении. Однако на корпоративном компьютере PositionChanged событие почему-то не срабатывает. Не уверен, что он каким-то образом заблокирован. Никаких исключений, но местоположение не распознается из-за того, что событие не срабатывает. На моем персональном компьютере то же решение работает нормально (та же версия Windows — Windows 10). Geolocator.ReportInterval = 1000; также не происходит принудительного запуска каждые 1 секунду.

 private void RunGeoTracker()
{
  if (Geolocator == null)
  {
    Geolocator = new Geolocator();
    Geolocator.DesiredAccuracy = PositionAccuracy.High;
    Geolocator.MovementThreshold = 100; // The units are meters.
    Geolocator.ReportInterval = 1000;
    Geolocator.PositionChanged  = this.PositionChanged;
  }
}

private async void PositionChanged(Geolocator sender, PositionChangedEventArgs args)
{
  await Dispatcher.InvokeAsync(() =>
  {
     // code here
  }
}
 

Существуют ли какие-либо альтернативы, предпочтительно без использования какого-либо REST API или веб-сайтов. Предпочтительно использовать JSON или базу данных для получения данных о местоположении. Я слышал, что есть какое-то решение PowerShell? Не могу найти примеров. Я имею в виду, что в основном необходимы Широта и долгота. Все остальное уже может быть достигнуто.

Комментарии:

1. Геолокация-это дерьмо. Если вы используете его на моем IP-адресе, вы получаете местоположение на расстоянии более 1000 миль, где находится штаб-квартира провайдера. Я также мог бы воспользоваться услугой VPN (очень распространенной сегодня), и вы, возможно, даже не сможете попасть на тот же континент, где я нахожусь. IP-адреса не имеют реального физического местоположения.

2. Для всех недовольных избирателей… вы можете хотя бы уточнить, что не так в этом вопросе? Может быть, вы можете дать какой-то ответ или комментарий вместо того, чтобы голосовать против или закрывать его?

3. @RonMaupin спасибо за ваш комментарий! У меня также есть VPN на моем корпоративном компьютере, но, по крайней мере, верхнее решение предоставляет мне правильный IP-адрес. Даже несмотря на то, что наш VPN должен выдавать в качестве вывода другую страну. Однако я не являюсь экспертом по сетям.

Ответ №1:

Собственный API геолокатора Windows ограничен широким спектром состояний, в которых ноутбук Windows может находиться в режиме полета, настройки местоположения отключены в общих настройках Windows, отключены в настройках конкретного приложения или просто отсутствуют поставщики данных, доступные для ОС (спутники GPS, триангуляция Wi-Fi, подключение к Интернету, OEM — оборудование и прошивка и т. Д.). Таким образом, любая стратегия использования API геолокатора для конкретной операционной системы зависит от вашего приложения (а), нуждающегося в высокоточной GPS-фиксации, (б) включающей мобильность-например, работник, сидящий за рулем с открытым ноутбуком в автомобиле, или (в) возможность направлять пользователя через UX, который помогает им определить местоположение. Тем не менее, проверьте, правильно ли выполнена инициализация объекта геолокатора с помощью шагов в документации Microsoft — они имеют значение!

IP-геолокация имеет свои ограничения для пользователей VPN, но у нее гораздо меньше способов выйти из строя, как только вы отправите программное обеспечение на реальные ПК и ноутбуки. Следующий REST API, например, не только автоматически определит общедоступный IP-адрес устройства, но и предоставит приблизительное местоположение на уровне города, включая приблизительную широту долготу.

 https://ep.api.getfastah.com/whereis/v1/json/auto?fastah-key=<trial_key>
 

Ответ JSON может выглядеть следующим образом, где общедоступный IP-адрес передается вашему клиентскому приложению:

 {
  "ip": "146.75.209.1",
  "isEuropeanUnion": false,
  "locationData": {
    "countryName": "Australia",
    "countryCode": "AU",
    "cityName": "Canberra",
    "cityGeonamesId": 2172517,
    "lat": -35.28,
    "lng": 149.13,
    "tz": "Australia/Sydney",
    "continentCode": "OC"
  }
}
 

Хитрость в том, чтобы использовать API IP-определения местоположения, которые постоянно обновляются по мере быстрого развития Интернета и мобильной среды.

Отказ от ответственности: Я являюсь разработчиком вышеупомянутого сервиса Fastah API, поэтому я могу быть немного предвзятым здесь 🙂