接受地址并返回经纬度坐标的Java函数
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/18455394/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
Java function that accepts address and returns longitude and latitude coordinates
提问by devdar
I am looking for a simple java function that can accept an address and return the longitude and latitude coordinates for that address. Based on my research this is what i found thus far:
我正在寻找一个简单的 java 函数,它可以接受一个地址并返回该地址的经度和纬度坐标。根据我的研究,这是我迄今为止发现的:
I am abit unsure how to implements this. I am not sure what order i will need to call the different methods.
我有点不确定如何实现这一点。我不确定调用不同方法需要什么顺序。
E.g. would i have to do this? :
例如,我必须这样做吗?:
String address = 'Some Place, Venezuela';
Geocoder geo = new Geocoder();
String url = geo.encode(address);
String encodeUrl = geo.urlEncode(url);
GLatLng latLng = geo.decode(encodeUrl);
If there are others that you have used feel free to share it.
如果有其他人用过,请随时分享。
/*
*
* ==============================================================================
* Licensed under the Apache License, Version 2.0 (the "License"); you may not
* use this file except in compliance with the License. You may obtain a copy of
* the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
* License for the specific language governing permissions and limitations under
* the License.
*/
package org.wicketstuff.gmap.geocoder;
import java.io.IOException;
import java.io.InputStream;
import java.io.Serializable;
import java.io.UnsupportedEncodingException;
import java.net.URL;
import java.net.URLEncoder;
import java.util.StringTokenizer;
import org.wicketstuff.gmap.api.GLatLng;
/**
* Geocoder. See: http://www.google.com/apis/maps/documentation/services.html# Geocoding_Direct
*
* @author Thijs Vonk
*/
public class Geocoder implements Serializable
{
private static final long serialVersionUID = 1L;
// Constants
public static final String OUTPUT_CSV = "csv";
public static final String OUTPUT_XML = "xml";
public static final String OUTPUT_KML = "kml";
public static final String OUTPUT_JSON = "json";
private final String output = OUTPUT_CSV;
public Geocoder()
{
}
public GLatLng decode(String response) throws GeocoderException
{
StringTokenizer gLatLng = new StringTokenizer(response, ",");
String status = gLatLng.nextToken();
gLatLng.nextToken(); // skip precision
String latitude = gLatLng.nextToken();
String longitude = gLatLng.nextToken();
if (Integer.parseInt(status) != GeocoderException.G_GEO_SUCCESS)
{
throw new GeocoderException(Integer.parseInt(status));
}
return new GLatLng(Double.parseDouble(latitude), Double.parseDouble(longitude));
}
/**
* builds the google geo-coding url
*
* @param address
* @return
*/
public String encode(final String address)
{
return "http://maps.google.com/maps/geo?q=" + urlEncode(address) + "&output=" + output;
}
/**
* @param address
* @return
* @throws IOException
*/
public GLatLng geocode(final String address) throws IOException
{
InputStream is = invokeService(encode(address));
if (is != null)
{
try
{
String content = org.apache.wicket.util.io.IOUtils.toString(is);
return decode(content);
}
finally
{
is.close();
}
}
return null;
}
/**
* fetches the url content
*
* @param address
* @return
* @throws IOException
*/
protected InputStream invokeService(final String address) throws IOException
{
URL url = new URL(address);
return url.openStream();
}
/**
* url-encode a value
*
* @param value
* @return
*/
private String urlEncode(final String value)
{
try
{
return URLEncoder.encode(value, "UTF-8");
}
catch (UnsupportedEncodingException ex)
{
throw new RuntimeException(ex.getMessage());
}
}
}
采纳答案by Matt
If you're using Google Maps API, you need to show a map with your application in order to use the data, as far as I understand their TOS.
如果您使用的是 Google Maps API,就我了解他们的 TOS 而言,您需要在您的应用程序中显示地图才能使用数据。
Here's an example on GitHubthat uses an address verification API from SmartyStreets to verify a US address and get the coordinates. There license restrictions are much more lenient this way. (I work at SmartyStreets and actually wrote this particular example.)
这是 GitHub 上的一个示例,它使用来自 SmartyStreets 的地址验证 API 来验证美国地址并获取坐标。这种方式的许可限制要宽松得多。(我在 SmartyStreets 工作,实际上写了这个特定的例子。)
Alternatively, there's a small library for massively-batch geocoding in Java by exoanalytic.
或者,有一个小型库,用于通过 exoanalytic 在 Java 中进行大规模批量地理编码。