Android [安卓][谷歌地图]:在触摸屏上获取位置地址
我已经在谷歌上搜索了几个小时,但到目前为止运气不好 我想知道触摸/点击地图的位置的地址Android [安卓][谷歌地图]:在触摸屏上获取位置地址,android,google-maps,geocoding,google-geocoder,Android,Google Maps,Geocoding,Google Geocoder,我已经在谷歌上搜索了几个小时,但到目前为止运气不好 我想知道触摸/点击地图的位置的地址 我知道为了得到地址,我需要对坐标进行反向地理编码。但是,首先我如何从地图中获取坐标呢?谷歌地图有回调来实现这一点 只要在你的代码中实现它们,一旦它们被触发,只需对坐标进行反向地理编码。实际上,您找到了最复杂的部分(您知道您需要反转地理编码)。谷歌地图有回调来实现这一点 只要在你的代码中实现它们,一旦它们被触发,只需对坐标进行反向地理编码。实际上,您找到了最复杂的部分(您知道您需要反转地理编码)。您需要做的就是
我知道为了得到地址,我需要对坐标进行反向地理编码。但是,首先我如何从地图中获取坐标呢?谷歌地图有回调来实现这一点
只要在你的代码中实现它们,一旦它们被触发,只需对坐标进行反向地理编码。实际上,您找到了最复杂的部分(您知道您需要反转地理编码)。谷歌地图有回调来实现这一点
只要在你的代码中实现它们,一旦它们被触发,只需对坐标进行反向地理编码。实际上,您找到了最复杂的部分(您知道您需要反转地理编码)。您需要做的就是设置一个,然后
onmaplick()
覆盖将为您提供一个LatLng
对象。然后,使用对象获取刚刚单击的点的地址
在这个简单的例子中,每次用户单击地图上的新点时,我都会添加一个标记
以下是您需要的主要功能:
mMap.setOnMapClickListener(new GoogleMap.OnMapClickListener() {
@Override
public void onMapClick(LatLng point) {
//save current location
latLng = point;
List<Address> addresses = new ArrayList<>();
try {
addresses = geocoder.getFromLocation(point.latitude, point.longitude,1);
} catch (IOException e) {
e.printStackTrace();
}
android.location.Address address = addresses.get(0);
if (address != null) {
StringBuilder sb = new StringBuilder();
for (int i = 0; i < address.getMaxAddressLineIndex(); i++){
sb.append(address.getAddressLine(i) + "\n");
}
Toast.makeText(MapsActivity.this, sb.toString(), Toast.LENGTH_LONG).show();
}
//remove previously placed Marker
if (marker != null) {
marker.remove();
}
//place marker where user just clicked
marker = mMap.addMarker(new MarkerOptions().position(point).title("Marker")
.icon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_MAGENTA)));
}
});
mMap.setOnMapClickListener(新的GoogleMap.OnMapClickListener(){
@凌驾
公共空区(停车点){
//保存当前位置
latLng=点;
列表地址=新的ArrayList();
试一试{
地址=地理编码器.getFromLocation(点.纬度,点.经度,1);
}捕获(IOE异常){
e、 printStackTrace();
}
android.location.Address=地址.get(0);
if(地址!=null){
StringBuilder sb=新的StringBuilder();
对于(int i=0;i
下面是我用来测试这个的完整类:
public class MapsActivity extends AppCompatActivity {
private GoogleMap mMap;
private LatLng latLng;
private Marker marker;
Geocoder geocoder;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_maps);
geocoder = new Geocoder(this, Locale.getDefault());
setUpMapIfNeeded();
}
@Override
protected void onResume() {
super.onResume();
setUpMapIfNeeded();
}
private void setUpMapIfNeeded() {
// Do a null check to confirm that we have not already instantiated the map.
if (mMap == null) {
// Try to obtain the map from the SupportMapFragment.
mMap = ((SupportMapFragment) getSupportFragmentManager().findFragmentById(R.id.map))
.getMap();
// Check if we were successful in obtaining the map.
if (mMap != null) {
setUpMap();
}
}
}
private void setUpMap() {
mMap.setMyLocationEnabled(true);
mMap.setMapType(GoogleMap.MAP_TYPE_HYBRID);
mMap.getUiSettings().setMapToolbarEnabled(false);
mMap.setOnMapClickListener(new GoogleMap.OnMapClickListener() {
@Override
public void onMapClick(LatLng point) {
//save current location
latLng = point;
List<Address> addresses = new ArrayList<>();
try {
addresses = geocoder.getFromLocation(point.latitude, point.longitude,1);
} catch (IOException e) {
e.printStackTrace();
}
android.location.Address address = addresses.get(0);
if (address != null) {
StringBuilder sb = new StringBuilder();
for (int i = 0; i < address.getMaxAddressLineIndex(); i++){
sb.append(address.getAddressLine(i) + "\n");
}
Toast.makeText(MapsActivity.this, sb.toString(), Toast.LENGTH_LONG).show();
}
//remove previously placed Marker
if (marker != null) {
marker.remove();
}
//place marker where user just clicked
marker = mMap.addMarker(new MarkerOptions().position(point).title("Marker")
.icon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_MAGENTA)));
}
});
}
}
公共类映射活动扩展了AppCompatActivity{
私有谷歌地图;
私人车床;
专用标记;
地理编码器;
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_映射);
geocoder=新的geocoder(这个,Locale.getDefault());
setupmapifneed();
}
@凌驾
受保护的void onResume(){
super.onResume();
setupmapifneed();
}
私有void setUpMapIfNeeded(){
//执行空检查以确认尚未实例化映射。
如果(mMap==null){
//尝试从SupportMapFragment获取映射。
mMap=((SupportMapFragment)getSupportFragmentManager().findFragmentById(R.id.map))
.getMap();
//检查我们是否成功获得地图。
如果(mMap!=null){
setUpMap();
}
}
}
私有void setUpMap(){
mMap.setMyLocationEnabled(真);
mMap.setMapType(GoogleMap.MAP\u TYPE\u HYBRID);
mMap.getUiSettings().setMapToolbarEnabled(false);
mMap.setOnMapClickListener(新的GoogleMap.OnMapClickListener(){
@凌驾
公共空区(停车点){
//保存当前位置
latLng=点;
列表地址=新的ArrayList();
试一试{
地址=地理编码器.getFromLocation(点.纬度,点.经度,1);
}捕获(IOE异常){
e、 printStackTrace();
}
android.location.Address=地址.get(0);
if(地址!=null){
StringBuilder sb=新的StringBuilder();
对于(int i=0;i
在两个不同点点击地图的结果:
您只需设置一个对象,然后
onmaclick()
覆盖将为您提供一个LatLng
对象。然后,使用对象获取刚刚单击的点的地址
在这个简单的例子中,每次用户单击地图上的新点时,我都会添加一个标记
以下是您需要的主要功能:
mMap.setOnMapClickListener(new GoogleMap.OnMapClickListener() {
@Override
public void onMapClick(LatLng point) {
//save current location
latLng = point;
List<Address> addresses = new ArrayList<>();
try {
addresses = geocoder.getFromLocation(point.latitude, point.longitude,1);
} catch (IOException e) {
e.printStackTrace();
}
android.location.Address address = addresses.get(0);
if (address != null) {
StringBuilder sb = new StringBuilder();
for (int i = 0; i < address.getMaxAddressLineIndex(); i++){
sb.append(address.getAddressLine(i) + "\n");
}
Toast.makeText(MapsActivity.this, sb.toString(), Toast.LENGTH_LONG).show();
}
//remove previously placed Marker
if (marker != null) {
marker.remove();
}
//place marker where user just clicked
marker = mMap.addMarker(new MarkerOptions().position(point).title("Marker")
.icon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_MAGENTA)));
}
});
mMap.setOnMapClickListener(新的GoogleMap.OnMapClickListener(){
@凌驾
公共空区(停车点){
//保存当前位置
latLng=点;
列表地址=新的ArrayList();
试一试{
地址=地理编码器.getFromLocation(点.纬度,点.经度,1);
}捕获(IOEXEP)