#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, поэтому я могу быть немного предвзятым здесь 🙂