菜鸟教程小白 发表于 2022-12-13 09:49:40

java - Android 地理编码功能不如 iOS


                                            <p><p>所以我有一个将地址(字符串)转换为坐标的函数。</p>

<p>这就是它在 iOS 中的样子:</p>

<pre><code>func setCoords(buildet: BuildingDetail) {

    let geoCoder = CLGeocoder()

    geoCoder.geocodeAddressString(buildet.address, completionHandler:
      {(placemarks: !, error: NSError!) in

            if error != nil {
                println(&#34;Geocode failed with error: \(error.localizedDescription)&#34;)
            } else if placemarks.count &gt; 0 {
                let placemark = placemarks as! CLPlacemark
                let location = placemark.location
                buildet.lat = location.coordinate.latitude
                buildet.lon = location.coordinate.longitude
            }
            self.setupMarker(buildet)
    })
}
</code></pre>

<p>这就是它在 Android 中的样子:</p>

<pre><code>public static double[] getLatLongPositions(String address) throws Exception
{
    int responseCode = 0;
    String api = &#34;http://maps.googleapis.com/maps/api/geocode/xml?address=&#34; + URLEncoder.encode(address, &#34;UTF-8&#34;) + &#34;&amp;sensor=true&#34;;
    System.out.println(&#34;URL : &#34;+api);
    URL url = new URL(api);
    HttpURLConnection httpConnection = (HttpURLConnection)url.openConnection();
    httpConnection.connect();
    responseCode = httpConnection.getResponseCode();
    if(responseCode == 200)
    {
      DocumentBuilder builder = DocumentBuilderFactory.newInstance().newDocumentBuilder();;
      Document document = builder.parse(httpConnection.getInputStream());
      XPathFactory xPathfactory = XPathFactory.newInstance();
      XPath xpath = xPathfactory.newXPath();
      XPathExpression expr = xpath.compile(&#34;/GeocodeResponse/status&#34;);
      String status = (String)expr.evaluate(document, XPathConstants.STRING);
      if(status.equals(&#34;OK&#34;))
      {
            expr = xpath.compile(&#34;//geometry/location/lat&#34;);
            String latitude = (String)expr.evaluate(document, XPathConstants.STRING);
            expr = xpath.compile(&#34;//geometry/location/lng&#34;);
            String longitude = (String)expr.evaluate(document, XPathConstants.STRING);
            return new double[] {Double.parseDouble(latitude), Double.parseDouble(longitude)};
      }
    }
    return new double[]{0,0};
}
</code></pre>

<p>现在,上面的iOS函数只是运行setupMarker函数,Android方法返回坐标,没什么大不了的!</p>

<p>我遇到的问题是,我为这两个函数提供了完全相同的地址参数。</p>

<p>iOS 完美返回所有坐标。</p>

<p>然而,Android 只能正确返回大约 30%。</p>

<p>是否有与上面的 iOS 等效的 Android 功能,或者只有一个可以正确地理编码的功能。</p>

<p>您可以在此处看到 Android 调用 API:</p>

<pre><code>http://maps.googleapis.com/maps/api/geocode/xml?address=
</code></pre>

<p>而且我已经对此进行了测试,它并没有给出好的结果,至少不如 iOS。</p>

<p>我该怎么办?</p>

<p><strong>编辑 - 一些示例</strong>(均适用于 iOS)</p>

<ul>
<li>EBS, 2 Burlington Road, Dublin 2</li>
<li>爱尔兰都柏林 4 区鲍尔斯布里奇梅林路 AIB 银行中心</li>
<li>AIB, Unit 33, Sandyford Business Centre, Sandyford, Dublin 18</li>
</ul></p>
                                    <br><hr><h1><strong>Best Answer-推荐答案</ strong></h1><br>
                                            <p><p>尝试使用返回 JSON 格式数据的 URL,然后您可以解析并获取纬度和经度。这是一个例子:</p>

<pre><code>public static void getLatLongFromAddress(String youraddress) {
String uri = &#34;http://maps.google.com/maps/api/geocode/json?address=&#34; +
            youraddress + &#34;&amp;sensor=false&#34;;
HttpGet httpGet = new HttpGet(uri);
HttpClient client = new DefaultHttpClient();
HttpResponse response;
StringBuilder stringBuilder = new StringBuilder();

try {
    response = client.execute(httpGet);
    HttpEntity entity = response.getEntity();
    InputStream stream = entity.getContent();
    int b;
    while ((b = stream.read()) != -1) {
      stringBuilder.append((char) b);
    }
} catch (ClientProtocolException e) {
    e.printStackTrace();
} catch (IOException e) {
    e.printStackTrace();
}

JSONObject jsonObject = new JSONObject();
try {
    jsonObject = new JSONObject(stringBuilder.toString());

    double lng = ((JSONArray)jsonObject.get(&#34;results&#34;)).getJSONObject(0)
      .getJSONObject(&#34;geometry&#34;).getJSONObject(&#34;location&#34;)
      .getDouble(&#34;lng&#34;);

    double lat = ((JSONArray)jsonObject.get(&#34;results&#34;)).getJSONObject(0)
      .getJSONObject(&#34;geometry&#34;).getJSONObject(&#34;location&#34;)
      .getDouble(&#34;lat&#34;);

    Log.d(&#34;latitude&#34;, &#34;&#34; + lat);
    Log.d(&#34;longitude&#34;, &#34;&#34; + lng);
} catch (JSONException e) {
    e.printStackTrace();
}

}
</code></pre>

<p>希望这会有所帮助。 </p></p>
                                   
                                                <p style="font-size: 20px;">关于java - Android 地理编码功能不如 iOS,我们在Stack Overflow上找到一个类似的问题:
                                                        <a href="https://stackoverflow.com/questions/31944893/" rel="noreferrer noopener nofollow" style="color: red;">
                                                                https://stackoverflow.com/questions/31944893/
                                                        </a>
                                                </p>
                                       
页: [1]
查看完整版本: java - Android 地理编码功能不如 iOS