Cordova - 根据地理位置检测用户所在国家/地区

时间:2016-12-10 05:27:34

标签: c# asp.net cordova geolocation

我已将cordova-plugin-geolocation插件应用到我的cordova应用程序中。我只是试图在不需要第三方APi的情况下派生用户的国家。我的应用程序正在与用C#编写的WebApi进行通信,因此我不介意是否有针对此的C#解决方案。我宁愿不使用包括谷歌在内的第三方工具进行探索,但如果这是最佳选择,那么我将探索。

就准确性而言,我只需要检测它们是否在英国境外。

1 个答案:

答案 0 :(得分:0)

还有另一种可能性,根本不需要任何第三方api互联网连接。

此答案基于point-in-polygon-aglorithm

您需要一个国家/国家/地区作为由纬度/经度点组成的多边形,您可以使用GGIS-Editor和相关数据(例如)获取奥地利的所有纬度/经度点(例如) shapefile)来自here或来自自然地球(选择Admin 0 - Countries)here

  1. 安装GGIS-Editor
  2. 解压缩AUT_adm_shp.zip
  3. 启动GGIS-Editor
  4. 选择标签:图层 - >添加图层 - >添加Vectorlayer
  5. 选择AUT_adm0.shp(shapefile),它现在看起来像这样: enter image description here

  6. 通过Mark-Tools标记整个多边形(带光标的黄色按钮): enter image description here

  7. 选择标签:图层 - >保存为

  8. 另存为GeoJSON-File
  9. 将所有lng / lat坐标复制到此GeoJSON文件中: enter image description here

  10. 当您将所有Lng / Lat-Points复制为此格式的数组元素时:

    [[lng,lat],.....]

  11. 然后你可以使用我的小提琴代码:

    var countryLngLatsOfAustria = [ [ lng, lat ], .....];
    
    function pointInPoly(verties, testx, testy) {
      var i,
      j,
      c = 0,
      nvert = verties.length;
      for (i = 0, j = nvert - 1; i < nvert; j = i++) {
        if (((verties[i][0] > testy) != (verties[j][0] > testy)) && (testx < (verties[j][1] - verties[i][1]) * (testy - verties[i][0]) / (verties[j][0] - verties[i][0]) + verties[i][1]))
        c = !c;
      }
      return c;
    }
    
    // use current location
    navigator.geolocation.getCurrentPosition(
      function (position) {
        alert(position.coords.longitude +", "+ position.coords.latitude);
        var isInAustria = pointInPoly(countryLngLatsOfAustria, position.coords.latitude, position.coords.longitude);
        if (isInAustria) alert('User is located within austria!');
        else alert('User is located outside from austria!');
      }, 
      function (err) {
        console.log(err);
      }, 
      {
        timeout: 5000,
        enableHighAccuracy: true
      }
    );
    

    (链接:https://jsfiddle.net/pfa028n8)了解您是否位于奥地利境内或境外。当然,它也适用于其他国家或联合国家&#34;例如,找出用户是否在欧洲境内。

    希望这有帮助。