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("Geocode failed with error: \(error.localizedDescription)")
} else if placemarks.count > 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 = "http://maps.googleapis.com/maps/api/geocode/xml?address=" + URLEncoder.encode(address, "UTF-8") + "&sensor=true";
System.out.println("URL : "+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("/GeocodeResponse/status");
String status = (String)expr.evaluate(document, XPathConstants.STRING);
if(status.equals("OK"))
{
expr = xpath.compile("//geometry/location/lat");
String latitude = (String)expr.evaluate(document, XPathConstants.STRING);
expr = xpath.compile("//geometry/location/lng");
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 = "http://maps.google.com/maps/api/geocode/json?address=" +
youraddress + "&sensor=false";
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("results")).getJSONObject(0)
.getJSONObject("geometry").getJSONObject("location")
.getDouble("lng");
double lat = ((JSONArray)jsonObject.get("results")).getJSONObject(0)
.getJSONObject("geometry").getJSONObject("location")
.getDouble("lat");
Log.d("latitude", "" + lat);
Log.d("longitude", "" + 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]