Google API 返回服务器位置,而不是用户位置

Posted

技术标签:

【中文标题】Google API 返回服务器位置,而不是用户位置【英文标题】:Google API returning the server location, not user location 【发布时间】:2019-11-17 02:10:10 【问题描述】:

您好,虽然我是通过此代码获取用户位置,但我实际上是在获取服务器的位置,知道如何更改它以便获取用户位置吗?

    public void geolocate() 
            try 

            GeolocationPayloadBuilder payloadBuilder = new GeolocationPayload.GeolocationPayloadBuilder();
            GeolocationPayload payload = payloadBuilder.createGeolocationPayload();
            //GeoApiContext context = new GeoApiContext.Builder().apiKey("my api key").build();
            // I guess the payload needs to be build in a different way but no clue how it should be :/
            GeolocationApiRequest req = (GeolocationApiRequest) GeolocationApi.geolocate(context, payload);

            GeolocationResult res = req.await();
            String location = res.location.toString();
            String[] latLngArray = location.split(",");
            com.google.maps.model.LatLng latLng = new com.google.maps.model.LatLng(Double.parseDouble(latLngArray[0]),
                    Double.parseDouble(latLngArray[1]));
            GeocodingApiRequest geoReq = GeocodingApi.reverseGeocode(context, latLng);
            GeocodingResult[] geoRes = geoReq.await();
            // Setting the user location for view
            System.out.println(geoRes[0].formattedAddress);
            origen.setValue(geoRes[0].formattedAddress);

         catch (Exception e) 
            System.out.println("Exception in NetClientGet:- " + e);
        
        

这是我从中获取对象的依赖项:

<dependency>
            <groupId>com.google.maps</groupId>
            <artifactId>google-maps-services</artifactId>
            <version>0.9.3</version>
</dependency>

希望有人能帮帮我,在此先感谢

编辑:

我一直在搜索并发现如何在https://developers.google.com/maps/documentation/geolocation/intro#cell_tower_object的帮助下构建有效载荷

但是我有几个问题,我将如何获取我的用户 MAC 地址来创建 wifiAccessPoint,以及我在哪里可以找到我所在城市(哥伦比亚卡利)的手机信号塔信息?只是更新将继续搜索任何帮助表示赞赏..

@POST
@Path("/geolocate")
public String geolocate() 
    try 
        CellTower newCellTower = new CellTower.CellTowerBuilder().CellId(42).LocationAreaCode(415)
                .MobileCountryCode(310).MobileNetworkCode(410).Age(0).createCellTower();
        WifiAccessPoint newWifiAccessPoint = new WifiAccessPoint.WifiAccessPointBuilder()
                .MacAddress("00:25:9c:cf:1c:ac").createWifiAccessPoint();
        WifiAccessPoint newWifiAccessPoint2 = new WifiAccessPoint.WifiAccessPointBuilder()
                .MacAddress("00:25:9c:cf:1c:ad").createWifiAccessPoint();

        GeolocationPayloadBuilder payloadBuilder = new GeolocationPayload.GeolocationPayloadBuilder()
                .HomeMobileCountryCode(310).HomeMobileNetworkCode(410).RadioType("gsm").Carrier("Vodafone")
                .ConsiderIp(false).AddCellTower(newCellTower).AddWifiAccessPoint(newWifiAccessPoint)
                .AddWifiAccessPoint(newWifiAccessPoint2);
        GeolocationPayload payload = payloadBuilder.createGeolocationPayload();
        GeoApiContext context = new GeoApiContext.Builder().apiKey("my api key")
                .build();

        GeolocationApiRequest req = (GeolocationApiRequest) GeolocationApi.geolocate(context, payload);

        GeolocationResult res = req.await();
        String location = res.location.toString();
        String[] latLngArray = location.split(",");
        com.google.maps.model.LatLng latLng = new com.google.maps.model.LatLng(Double.parseDouble(latLngArray[0]),
                Double.parseDouble(latLngArray[1]));
        GeocodingApiRequest geoReq = GeocodingApi.reverseGeocode(context, latLng);
        GeocodingResult[] geoRes = geoReq.await();
        // Setting the user location for view
        return geoRes[0].formattedAddress;

     catch (Exception e) 
        System.out.println("Exception in NetClientGet:- " + e);
    
    return "XD";

【问题讨论】:

【参考方案1】:

Google Maps Platform 的Geolocation API 不是用来获取用户位置的,我可以建议您改用 html5 Geolocation,Google Maps Platform documentation 中也有一个示例。但请注意,Google 不支持此功能,因为它使用的是 HTML5 Geolocation 而不是 Google API,如果您还想获取用户位置的地址,您可以Geocode HTML5 Geolocation 返回的坐标.您可能会看到下面的示例(没有地理编码功能)。这是一个工作示例 - https://jsfiddle.net/w2sad5pn/

if (navigator.geolocation) 
    navigator.geolocation.getCurrentPosition(function(position) 
      var pos = 
        lat: position.coords.latitude,
        lng: position.coords.longitude
      ;

      infoWindow.setPosition(pos);
      infoWindow.setContent('Location found.');
      infoWindow.open(map);
      map.setCenter(pos);
    , function() 
      handleLocationError(true, infoWindow, map.getCenter());
    );
   else 
    // Browser doesn't support Geolocation
    handleLocationError(false, infoWindow, map.getCenter());
  

【讨论】:

嗯,有趣,有时间我会测试这个,谢谢,我尝试使用javascript方式但我没有设法得到它返回到后端的纬度和经度,我用过这个w3schools.com/html/html5_geolocation.asp反正我会在有时间的时候试试你发布的内容谢谢 嘿,我阅读了代码,这正是我前一段时间尝试过的,但我没有设法从 javascript 将纬度和经度获取到我的后端(java),不知道我该怎么做那个?

以上是关于Google API 返回服务器位置,而不是用户位置的主要内容,如果未能解决你的问题,请参考以下文章

Google Geolocation API 总是返回相同的位置,不管 cellTower 是不是指定

如何在 iOS 版 Google Places API 中查找当前用户位置

如何使用地名服务 api 而不是 html5 位置对象的东西获取国家/地区代码信息

在 Google API 中使用自定义帐户而不是服务帐户

如何在应用程序处于后台时保持GPS接收器位置更新(Google Play服务位置API)

在服务中访问 Google Play 服务位置 API