如何从Google地图扩展共享位置网址?

问题描述 投票:4回答:1

我正在尝试从谷歌地图共享位置链接获取位置,所以我使用谷歌缩短URL API来扩展URL,但当我从Android设备共享谷歌地图应用程序的URL时,它给了我https://maps.app.goo.gl/eEhh3这种URL。它没有给我实际扩展的URL来提供位置信息。

如何扩展这个:

https://maps.app.goo.gl/eEhh3

在此链接中:

https://www.google.com/maps/place/Siddique+Trade+Center/@31.5313297,74.3504459,17z/data=!3m1!4b1!4m5!3m4!1s0x391904e4af9b1e35:0xee6f3c848c9e5341!8m2!3d31.5313297!4d74.3526346

这是我用来扩展它的API URL。

“Qazxswpoi”

但是,不是给我上面的位置信息URL,而是返回这个长URL。

https://www.googleapis.com/urlshortener/v1/url?shortUrl=https://maps.app.goo.gl/eEhh3&key=(API_KEY)

请帮助我如何通过Google API获取上述位置信息网址,以便从任何设备(IOS,WebAPP,特别是Android)通过Google Map共享位置Url获取位置(Lat,Lng)。

android google-maps google-maps-api-3 geolocation maps
1个回答
3
投票

现在似乎(2019年)没有单独的API或服务来扩展Google地图中的共享位置网址,但您可以使用基于该技巧的解决方法:Google服务器可以通过Google地图网络界面执行此操作。

TLDR;

你不需要https://maps.app.goo.gl/?link=https://www.google.com/maps/place//data%3D!4m2!3m1!1s0x391904e4af9b1e35:0xee6f3c848c9e5341?utm_source%3Dmstt_1&apn=com.google.android.apps.maps&ibi=com.google.Maps&ius=comgooglemapsurl&isi=585027354 。例如,如果

expand API

在PC上的Web浏览器(例如FireFox)中键入的URL比扩展该URL并显示标记。在此期间,您可以在地址字段中看到“部分扩展”的URL,例如:

https://maps.app.goo.gl/eEhh3

在1-2秒内通过“完全展开”URL更改(重定向到),使用lat / lng坐标,如:

https://www.google.com/maps/place//data=!4m2!3m1!1s0x391904e4af9b1e35:0xee6f3c848c9e5341?utm_source=mstt_1

所以你可以使用https://www.google.com/maps/place/Siddique+Trade+Center/@31.5313297,74.3504459,17z/data=!3m1!4b1!4m5!3m4!1s0x391904e4af9b1e35:0xee6f3c848c9e5341!8m2!3d31.5313297!4d74.3526346做同样的事情并从中获得“完全扩展”(例如在WebViewpublic void onPageFinished(WebView view, String url))。注意:有必要跳过第一个“部分扩展”的URL。

另一个问题:WebViewClient将缩短的网址(如WebView)转换为Intent for Google Maps Application,并且“部分扩展”的网址https://maps.app.goo.gl/eEhh3永远不会被加载。实际上,如果你只需要显示标记就足够了。但是如果你需要坐标这个问题可以通过https://www.google.com/maps/place//data=!4m2!3m1!1s0x391904e4af9b1e35:0xee6f3c848c9e5341?utm_source=mstt_1打开缩短的URL https://maps.app.goo.gl/eEhh3并在连接打开和HttpUrlConnection后通过HttpUrlConnection.getURL()或通过Location Header字段重定向“部分扩展”URL。实际上,如果您将来自HttpUrlConnection.getInputStream() called输入流的所有响应加载为HttpUrlConnection - 您可以通过String标记在其中找到所需的lat / lng坐标。就像是:

https://www.google.com/maps/preview/place通过... [[[1,42]\n]\n,0,null,0,47]\n]\n,null,\"Suit 706 Siddiq Trade Center, Main Blvd Gulberg, Block H Gulberg III, Lahore, Punjab, Pakistan\",null,null,\"https://www.google.com/maps/preview/place/Siddique+Trade+Center,+Suit+706+Siddiq+Trade+Center,+Main+Blvd+Gulberg,+Block+H+Gulberg+III,+Lahore,+Punjab,+Pakistan/@31.5313297,74.3526346,3401a,13.1y/data\\u003d!4m2!3m1!1s0x391904e4af9b1e35:0xee6f3c848c9e5341\",1,null,null,null,null,null, ... 打开缩短的URL。恕我直言更好(但稍微慢一点)的方法是将从HttpUrlConnection收到的“部分扩展”URL传递到HttpUrlConnection.getURL()并从其地址线获得“完全扩展”的URL。所以,有完整的源代码:

WebView

public class MainActivity extends AppCompatActivity implements OnMapReadyCallback { private GoogleMap mGoogleMap; private MapFragment mMapFragment; private WebView mWebView; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); // configure WebView System.setProperty("http.agent", ""); // reset default User-Agent mWebView = (WebView) findViewById(R.id.web_view); mWebView.setVisibility(View.GONE); mWebView.setWebViewClient(new WebViewClient() { @Override public void onPageFinished(WebView view, String url) { // skip non-"ful expanded" urls if (isUrlFullExpanded(url)) { // extract lat/lng coordinates from "full expanded" URL String LatLng latLng = getLatLngFromExpandedUrl(url); // just show marker with extracted coordinates for test onLatLngReceived(latLng); } } }); mWebView.getSettings().setJavaScriptEnabled(true); mMapFragment = (MapFragment) getFragmentManager() .findFragmentById(R.id.map_fragment); mMapFragment.getMapAsync(this); // start get LatLng from URL coordinates task new GetLocationURL().execute(new String[] {"https://maps.app.goo.gl/eEhh3"}); } private LatLng getLatLngFromExpandedUrl(String url) { final String beginMarker = "/@"; final String endMarker = "/"; final int ixCoordsStart = url.indexOf(beginMarker) + beginMarker.length(); final int ixCoordsEnd = url.indexOf(endMarker, ixCoordsStart); String coordinatesString = url.substring(ixCoordsStart, ixCoordsEnd); LatLng latLng = null; if (!TextUtils.isEmpty(coordinatesString)) { String[] coords = coordinatesString.split(","); if (coords.length >= 2) { latLng = new LatLng(Float.parseFloat(coords[0]), Float.parseFloat(coords[1])); } } return latLng; } private boolean isUrlFullExpanded(String url) { return url.indexOf("place/") > -1 && url.indexOf("place//") == -1 && url.indexOf("/@") > -1; } private void onLatLngReceived(LatLng latLng) { if (mGoogleMap != null && latLng != null) { mGoogleMap.addMarker(new MarkerOptions().position(latLng)); mGoogleMap.moveCamera(CameraUpdateFactory.newLatLngZoom(latLng, 16)); } } @Override public void onMapReady(GoogleMap googleMap) { mGoogleMap = googleMap; } private class GetLocationURL extends AsyncTask<String, Void, String> { protected void onPreExecute() { super.onPreExecute(); } protected String doInBackground(String... params) { String locationUrl = null; HttpURLConnection connection = null; BufferedReader reader = null; try { URL url = new URL(params[0]); connection = (HttpURLConnection) url.openConnection(); connection.setRequestMethod("GET"); connection.connect(); // you can analyze response code //int responseCode = connection.getResponseCode(); InputStream stream = connection.getInputStream(); reader = new BufferedReader(new InputStreamReader(stream)); StringBuilder responseStringBuilder = new StringBuilder(); String line = ""; while ((line = reader.readLine()) != null) { responseStringBuilder.append(line); } // use commented code below if you want to get coordinates directly from HttpURLConnection response /* LatLng latLng = null; String responseString = responseStringBuilder.toString(); String pattern = "\\\"https://www.google.com/maps/preview/place"; int ixPlaceStart = responseString.indexOf(pattern); if (ixPlaceStart > -1) { int ixCoordsStart = responseString.indexOf("@", ixPlaceStart) + 1; int ixCoordsEnd = responseString.indexOf("/", ixCoordsStart); String coordinatesString = responseString.substring(ixCoordsStart, ixCoordsEnd); String[] coords = coordinatesString.split(","); // latLng - coordinates from URL latLng = new LatLng(Float.parseFloat(coords[0]), Float.parseFloat(coords[1])); } */ locationUrl = connection.getURL().toString(); } catch (MalformedURLException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } finally { if (connection != null) { connection.disconnect(); } try { if (reader != null) { reader.close(); } } catch (IOException e) { e.printStackTrace(); } } return locationUrl; } @Override protected void onPostExecute(String result) { super.onPostExecute(result); // pass redirected "partially expandeded" URL to WebView mWebView.loadUrl(result); } } }

activity_main.xml

你可以得到这样的东西:

<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context="<YOUR_PACKAGE>.MainActivity"> <fragment android:id="@+id/map_fragment" android:name="com.google.android.gms.maps.MapFragment" android:layout_width="match_parent" android:layout_height="match_parent"/> <WebView android:id="@+id/web_view" android:layout_width="match_parent" android:layout_height="match_parent"/> </RelativeLayout>

NB! Google可以随时更改所描述的行为。

© www.soinside.com 2019 - 2024. All rights reserved.