精华内容
下载资源
问答
  • 正向和反向地理编码。 用法 导入package:geocoder/geocoder.dart ,然后使用Geocoder.local来访问设备系统提供的地理编码服务。 例子: import 'package:geocoder/geocoder.dart' ; // From a query final query =...
  • 离线地理编码器-Android 用于检索国家名称和 ISO 代码的反向地理代码的离线版本。 该项目是 soheilbm 对的迁移。 用法 要使用该项目,您只需添加 offline-geocoder 模块作为项目的依赖项。 使用以下方法实例化 ...
  • 用于地理编码、反向地理编码、完整地理散列和多散列支持的 NodeJS 工具 Geobelt 目前支持 OpenStreetMap Nominatim 服务器进行地理编码和反向地理编码。 Nominatim 对象使用时间队列来调度每秒 1 个请求,因为这是 ...
  • A snapshot of the map visualization (clustered locations) created using Folium 使用Folium创建的地图可视化快照(聚集位置) 反向地理编码 (Reverse Geocoding) Reverse geocoding, on the other hand, converts...

    Geocoding is the process of taking input text, such as an address or the name of a place, and returning a latitude/longitude location. To put it simply, Geocoding is converting physical address to latitude and longitude.

    地理编码是获取输入文本(例如地址或地点名称)并返回纬度/经度位置的过程。 简而言之,地理编码会将物理地址转换为纬度和经度。

    There are many geocoding API options available in python. Some of the popular ones are GeoPy, OpenCage geocoder, google geocoding. Geopy is one of the few API services which provides unlimited access for non-commercial use. For Google API and OpenCage geocoders, there is a limit of 2500 requests per/day. Using geopy, the latitudes and longitudes for some addresses in my dataset, showed different countries instead of the US. With OpenCage geocoder, surprisingly all the addresses were accurate so I used OpenCage encoder.

    python中提供了许多地理编码API选项。 一些受欢迎的是GeoPy,OpenCage地理编码器,google地理编码。 Geopy是为非商业用途提供无限访问的少数API服务之一。 对于Google API和OpenCage地理编码器,每天限制为2500个请求。 使用geopy,我的数据集中某些地址的经度和纬度显示了不同的国家,而不是美国。 使用OpenCage 地理编码器时 ,令人惊讶的是所有地址都是准确的,因此我使用了OpenCage编码器。

    使用OpenCage地理编码器和熊猫 (Working with OpenCage geocoder and pandas)

    To use OpenCage Geocoder in python, the python library should be installed first using pip install opencage .More info about this library can be found here: OpenCageGeocode on Github

    要在python中使用OpenCage Geocoder,应首先使用pip install opencage安装python库。有关此库的更多信息,请参见: Github上的OpenCageGeocode

    Once the library is installed, you will need an OpenCage geocoder account to generate an API key. A free account can be created using opencagedata.com. Once you signup for an account you can find API keys in Dashboard as shown in the below image.

    安装库后,您将需要一个OpenCage地理编码器帐户来生成API密钥。 可以使用opencagedata.com创建免费帐户。 注册帐户后,即可在仪表板中找到API密钥,如下图所示。

    Image for post

    (Example)

    from opencage.geocoder import OpenCageGeocode
    key = "Enter_your_Api_Key"
    geocoder = OpenCageGeocode(key)
    address='1108 ROSS CLARK CIRCLE,DOTHAN,HOUSTON,AL'
    result = geocoder.geocode(address, no_annotations="1")
    result[0]['geometry']

    Output: {‘lat’: 31.2158271, ‘lng’: -85.3634326}

    输出:{'lat':31.2158271,'lng':-85.3634326}

    We got the latitude and longitude for one hospital named Southeast Alabama Medical Center. In most cases, we will have multiple addresses that need to be plotted in maps as we do now. In this case, using pandas to create a data frame will be a lot easier. The dataset I used contains the list of all Hospitals in the US along with the COVID-19 total cases for the counties where hospitals are located. The dataset can be downloaded from here.

    我们获得了一家名为阿拉巴马州东南医疗中心的医院的经度和纬度。 在大多数情况下,像现在一样,我们将需要在地图中绘制多个地址。 在这种情况下,使用熊猫创建数据框会容易得多。 我使用的数据集包含美国所有医院的列表以及医院所在县的COVID-19总病例数。 数据集可从此处下载。

    import pandas as pd
    data=pd.read_csv(‘Final.csv’)
    data.head(10)
    Image for post
    Hospital location data frame
    医院位置数据框

    We have a data frame that contains the list of Facility Name of all Hospitals in the US and their addresses, so we just need to find location coordinates.

    我们有一个数据框,其中包含美国所有医院的设施名称及其地址的列表,因此我们只需要查找位置坐标即可。

    First, we should convert the Address column to the list. So, it will be easier to loop all the addresses.

    首先,我们应该将“地址”列转换为列表。 因此,将更容易循环所有地址。

    Next, enter your API key from OpenCage geocoder website and create empty lists to store latitudes and longitudes. After creating empty list, create a loop which gives latitude’s and longitude’s for all addresses

    接下来,从OpenCage地理编码器网站输入您的API密钥,并创建一个空列表来存储纬度和经度。 创建空列表后,创建一个循环,该循环为所有地址提供纬度和经度

    addresses = data["Full_Address"].values.tolist()
    key = "Enter-your-key-here"
    geocoder = OpenCageGeocode(key)
    latitudes = []
    longitudes = []
    for address in addresses:
    result = geocoder.geocode(address, no_annotations="1")

    if result and len(result):
    longitude = result[0]["geometry"]["lng"]
    latitude = result[0]["geometry"]["lat"]
    else:
    longitude = "N/A"
    latitude = "N/A"

    latitudes.append(latitude)
    longitudes.append(longitude)

    We have latitudes and longitudes for the list of all the addresses in the data frame. we can add this latitudes and longitudes to our existing data frame using this simple pandas command.

    我们在数据框中列出了所有地址的经度和纬度。 我们可以使用此简单的pandas命令将此纬度和经度添加到我们现有的数据框中。

    data["latitudes"] = latitudes
    data["longitudes"] = longitudes
    data.head(10)

    Finally, we got the latitude and longitudes for all the hospital addresses. To better understand this location coordinates let’s plot all this location coordinates as points in map using folium maps.

    最后,我们获得了所有医院地址的经度和纬度。 为了更好地理解此位置坐标,让我们使用叶片地图在地图上将所有这些位置坐标绘制为点。

    folium_map= folium.Map(location=[33.798259,-84.327062],zoom_start=4.4,tiles=’CartoDB dark_matter’)FastMarkerCluster(data[[‘latitudes’, ‘longitudes’]].values.tolist()).add_to(folium_map)folium.LayerControl().add_to(folium_map) for row in final.iterrows():
    row=row[1]
    folium.CircleMarker(location=(row["latitudes"],
    row["longitudes"]),
    radius= 10,
    color="#007849",
    popup=row[‘Facility_Name’],
    fill=False).add_to(folium_map)

    folium_map

    Now, we can see the location points of all the hospitals in the USA. I used CircleMarker cluster to better help understand the regions with most number of hospitals.

    现在,我们可以看到美国所有医院的位置。 我使用CircleMarker集群来更好地帮助了解医院数量最多的地区。

    Image for post
    A snapshot of the map visualization (clustered locations) created using Folium
    使用Folium创建的地图可视化快照(聚集位置)

    反向地理编码 (Reverse Geocoding)

    Reverse geocoding, on the other hand, converts geographic coordinates to a description of a location, usually the name of a place or an addressable location. Geocoding relies on a computer representation of address points, the street/road network, together with postal and administrative boundaries.

    另一方面, 反向地理编码会将地理坐标转换为位置的描述,通常是位置名称或可寻址位置。 地理编码依赖于地址点,街道/道路网络以及邮政和行政边界的计算机表示。

    For reverse geocoding, I found the output format of Geopy API more detailed when compared to OpenCage Geocoder. And also, there is no limit for Geopy API so we will Geopy instead of OpenCage Geocoder.

    对于反向地​​理编码,与OpenCage Geocoder相比,我发现Geopy API的输出格式更加详细。 而且,对于Geopy API没有限制,因此我们将使用Geopy代替OpenCage Geocoder。

    OpenCage Reverse Geocoder Example

    OpenCage反向地理编码器示例

    result = geocoder.reverse_geocode(31.2158271,-85.3634326)  
    result[0][‘formatted’]

    Output : Southeast Health Medical Center, Alma Street, Dothan, AL 36302, United States of America

    产出:美利坚合众国阿拉巴马州多森市阿尔玛街东南健康医学中心,美国36302

    Geopy Reverse Geocoder Example

    Geopy反向地理编码器示例

    from geopy.geocoders import Nominatim
    geolocator = Nominatim(user_agent="test_app")
    location = geolocator.reverse("31.2158271,-85.3634326")
    location.raw[‘display_name’]

    Output: ‘Southeast Health Campus, 1108, Ross Clark Circle, Morris Heights, Dothan, Houston County, Alabama, 36301, United States of America

    产出:'东南健康校园,1108,罗斯克拉克圈,莫里斯高地,多森,休斯敦县,阿拉巴马州,36301,美国

    使用Geopy Geocoder和熊猫 (Working with Geopy Geocoder and pandas)

    For reverse geocoding, as above first, we will convert latitude and longitude to list and zip them together.

    对于反向地​​理编码,如上所述,首先,我们将纬度和经度转换为列表并将它们压缩在一起。

    lats=data['latitudes'].to_list()
    lons=data['longitudes'].to_list()
    # Creating a zip with latitudes and longitudes
    coords=list(zip(lats,lons))

    Since, we already created list, just like above we will create a loop to find address for each location coordinate and append them together.

    因为我们已经创建了列表,所以像上面一样,我们将创建一个循环以查找每个位置坐标的地址并将它们附加在一起。

    from geopy.geocoders import Nominatim
    geolocator = Nominatim(user_agent="test_app")
    full_address=[]
    for i in range(len(coords)):
    location = geolocator.reverse(coords[i])
    address=location.raw['address']['country']
    full_address.append(address)
    #Creating dataframe with all the addresses
    addres=pd.DataFrame(data=full_address , columns=['Address'])
    addres
    Image for post

    Finally, we have the address list of all hospitals in the US.

    最后,我们拥有美国所有医院的地址列表。

    For interested readers, I put the code in my GitHub Repo here. If you have any doubts, contact me using linkedin.

    对于感兴趣的读者,我将代码放在此处的 GitHub Repo中。 如有任何疑问,请使用linkedin与我联系。

    翻译自: https://towardsdatascience.com/geocoding-and-reverse-geocoding-using-python-36a6ad275535

    展开全文
  • 地理编码和反向地理编码的一个宁静的API 地名数据库。 快速开始 默认情况下,加载cities500 。 要更改默认数据集,请将GEONAMES_DATA环境变量设置为GEONAMES_DATA任何值: cities15000 (220万)人口> 15000或首都...
  • Dart库用于超快速的离线反向地理编码。 包使用kd树在给定文件中搜索最近的位置。 当Geocoder初始化时,搜索位置的速度非常快,大约4到5毫秒。 数据 要使用反向地理编码库,您需要为文件提供有关您要运行反向地理编码...
  • Mimirsbrunn(也称为Mimir)是一个独立的地理编码和反向地理编码系统,用编写,并基于构建。 它可以处理地址,街道,兴趣点(POI),行政区域或公共交通站点。 什么是地址解析器? 通常,是指“将物理地址描述转换...
  • Android Geocoder反向地理编码项目结构 (Android Geocoder Reverse Geocoding Project Structure) We’ll need the google maps and google places api. So let’s add them in the build.gradle file as shown ...

    geocoder

    Android Geocoder class is used for reverse geocoding i.e. retrieving the address from the location on the Google Map.
    If you aren’t aware of how to use Google Maps in your Android Application, refer android google maps tutorial before moving ahead.

    Android Geocoder类用于反向地理编码,即从Google Map上的位置检索地址。
    如果您不知道如何在Android应用程序中使用Google Maps,请先阅读android Google Maps教程,然后再继续。

    Android Geocoder (Android Geocoder)

    Android Geocoder class is used for Geocoding as well as Reverse Geocoding. Geocoding refers to transforming street address or any address into latitude and longitude. Reverse Geocoding refers to transforming latitude and longitude into its corresponding street address.

    Android Geocoder类用于地理编码以及反向地理编码。 地理编码是指将街道地址或任何地址转换为纬度和经度。 反向地理编码是指将纬度和经度转换为其对应的街道地址。

    Address class helps in fetching the street address, locality, sub-locality, city, country, landmark etc. features of the location.

    Address类别有助于获取街道地址,位置,子位置,城市,国家/地区地标等特征。

    Using the above two classes we’ll be fetching the current marker address on the Google Maps in our application. Let’s start with the android reverse geocoding example project.

    使用以上两个类,我们将在应用程序中的Google Maps上获取当前标记地址。 让我们从android反向地理编码示例项目开始。

    Android Geocoder反向地理编码项目结构 (Android Geocoder Reverse Geocoding Project Structure)

    We’ll need the google maps and google places api. So let’s add them in the build.gradle file as shown below.

    我们需要Google MapsGoogle Places API。 因此,如下所示,将它们添加到build.gradle文件中。

    apply plugin: 'com.android.application'
    
    
    allprojects {
        repositories {
            jcenter()
            maven {
                url "https://maven.google.com"
            }
        }
    }
    
    
    
    android {
        compileSdkVersion 26
        buildToolsVersion "26.0.1"
        defaultConfig {
            applicationId "com.journaldev.reversegeocoding"
            minSdkVersion 16
            targetSdkVersion 26
            versionCode 1
            versionName "1.0"
            testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
        }
        buildTypes {
            release {
                minifyEnabled false
                proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
            }
        }
    }
    
    dependencies {
        compile fileTree(dir: 'libs', include: ['*.jar'])
        androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {
            exclude group: 'com.android.support', module: 'support-annotations'
        })
        compile 'com.android.support:appcompat-v7:26.0.1'
        compile 'com.android.support:cardview-v7:26.0.1'
        compile 'com.android.support.constraint:constraint-layout:1.0.2'
        compile 'com.google.android.gms:play-services-maps:11.0.4'
        compile 'com.google.android.gms:play-services-places:11.0.4'
        testCompile 'junit:junit:4.12'
    }

    Get the relevant API key from the Google Developer Console and add it inside the meta-data in the AndroidManifest.xml file. If you aren’t aware of integrating Google APIs in your application, refer this tutorial before moving ahead.

    从Google Developer Console获取相关的API密钥,并将其添加到AndroidManifest.xml文件的元数据中。 如果您不知道将Google API集成到应用程序中,请先阅读教程,然后再继续。

    Android反向地理编码代码 (Android Reverse Geocoding Code)

    The code for the activity_main.xml layout is given below.

    下面给出了activity_main.xml布局的代码。

    <RelativeLayout xmlns:android="https://schemas.android.com/apk/res/android"
        xmlns:card_view="https://schemas.android.com/tools"
        android:layout_width="match_parent"
        android:layout_height="match_parent">
    
        <android.support.v7.widget.CardView
            android:id="@+id/cardView"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_margin="12dp"
            card_view:cardCornerRadius="0dp"
            card_view:cardElevation="0dp">
    
            <RelativeLayout
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_gravity="center">
    
                <TextView
                    android:id="@+id/txtLocationAddress"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:layout_alignParentTop="true"
                    android:layout_centerHorizontal="true"
                    android:ellipsize="marquee"
                    android:focusable="true"
                    android:focusableInTouchMode="true"
                    android:gravity="center"
                    android:marqueeRepeatLimit="marquee_forever"
                    android:maxLines="1"
                    android:padding="16dp"
                    android:scrollHorizontally="true"
                    android:text="Current Marker Address" />
    
            </RelativeLayout>
    
        </android.support.v7.widget.CardView>
    
    
        <FrameLayout
            android:layout_width="match_parent"
            android:layout_height="match_parent">
    
            <fragment
                android:id="@+id/mapFragment"
                android:name="com.google.android.gms.maps.SupportMapFragment"
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:tag="tag_map_fragment" />
    
            <FrameLayout
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_gravity="center">
    
                <ImageView
                    android:id="@+id/centerMarker"
                    android:layout_width="48dp"
                    android:layout_height="48dp"
                    android:layout_gravity="center"
                    android:src="@drawable/black_marker" />
    
            </FrameLayout>
    
        </FrameLayout>
    
    </RelativeLayout>

    Our layout contains a CardView, which holds a TextView that’ll eventually display the current address.
    The marker is placed in an ImageView at the center of the screen.

    我们的布局包含一个CardView ,其中包含一个TextView,最终将显示当前地址。
    标记放置在屏幕中央的ImageView中。

    The code for the MainActivity.java class is given below.

    下面给出MainActivity.java类的代码。

    package com.journaldev.reversegeocoding;
    
    import android.content.Intent;
    import android.location.Address;
    import android.location.Geocoder;
    import android.support.v7.app.AppCompatActivity;
    import android.os.Bundle;
    import android.support.v7.widget.CardView;
    import android.text.TextUtils;
    import android.view.View;
    import android.widget.TextView;
    import android.widget.Toast;
    
    import com.google.android.gms.common.GooglePlayServicesNotAvailableException;
    import com.google.android.gms.common.GooglePlayServicesRepairableException;
    import com.google.android.gms.location.places.Place;
    import com.google.android.gms.location.places.ui.PlaceAutocomplete;
    import com.google.android.gms.maps.CameraUpdate;
    import com.google.android.gms.maps.CameraUpdateFactory;
    import com.google.android.gms.maps.GoogleMap;
    import com.google.android.gms.maps.OnMapReadyCallback;
    import com.google.android.gms.maps.SupportMapFragment;
    import com.google.android.gms.maps.model.LatLng;
    
    import java.io.IOException;
    import java.util.List;
    import java.util.Locale;
    
    
    public class MainActivity extends AppCompatActivity {
    
    
        TextView txtLocationAddress;
        SupportMapFragment mapFragment;
        GoogleMap map;
        LatLng center;
        CardView cardView;
        private static final int PLACE_AUTOCOMPLETE_REQUEST_CODE = 1;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
    
            txtLocationAddress = findViewById(R.id.txtLocationAddress);
            txtLocationAddress.setEllipsize(TextUtils.TruncateAt.MARQUEE);
            txtLocationAddress.setSingleLine(true);
            txtLocationAddress.setMarqueeRepeatLimit(-1);
            txtLocationAddress.setSelected(true);
    
            cardView = findViewById(R.id.cardView);
    
            cardView.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    try {
                        Intent intent =
                                new PlaceAutocomplete.IntentBuilder(PlaceAutocomplete.MODE_FULLSCREEN)
                                        .build(MainActivity.this);
                        startActivityForResult(intent, PLACE_AUTOCOMPLETE_REQUEST_CODE);
                    } catch (GooglePlayServicesRepairableException e) {
                        printToast("Google Play Service Repair");
                    } catch (GooglePlayServicesNotAvailableException e) {
                        printToast("Google Play Service Not Available");
                    }
                }
            });
    
            mapFragment = (SupportMapFragment) getSupportFragmentManager().findFragmentById(R.id.mapFragment);
            mapFragment.getMapAsync(new OnMapReadyCallback() {
                @Override
                public void onMapReady(GoogleMap googleMap) {
                    map = googleMap;
                    map.getUiSettings().setZoomControlsEnabled(true);
                    LatLng latLng = new LatLng(20.5937, 78.9629);
                    map.moveCamera(CameraUpdateFactory.newLatLngZoom(latLng, 16));
                    initCameraIdle();
                }
            });
        }
    
        private void initCameraIdle() {
            map.setOnCameraIdleListener(new GoogleMap.OnCameraIdleListener() {
                @Override
                public void onCameraIdle() {
                    center = map.getCameraPosition().target;
                    getAddressFromLocation(center.latitude, center.longitude);
                }
            });
        }
    
        private void getAddressFromLocation(double latitude, double longitude) {
    
            Geocoder geocoder = new Geocoder(this, Locale.ENGLISH);
    
    
            try {
                List<Address> addresses = geocoder.getFromLocation(latitude, longitude, 1);
    
                if (addresses.size() > 0) {
                    Address fetchedAddress = addresses.get(0);
                    StringBuilder strAddress = new StringBuilder();
                    for (int i = 0; i < fetchedAddress.getMaxAddressLineIndex(); i++) {
                        strAddress.append(fetchedAddress.getAddressLine(i)).append(" ");
                    }
    
                    txtLocationAddress.setText(strAddress.toString());
    
                } else {
                    txtLocationAddress.setText("Searching Current Address");
                }
    
            } catch (IOException e) {
                e.printStackTrace();
                printToast("Could not get address..!");
            }
        }
    
        @Override
        protected void onActivityResult(int requestCode, int resultCode, Intent data) {
            if (requestCode == PLACE_AUTOCOMPLETE_REQUEST_CODE) {
                if (resultCode == RESULT_OK) {
                    Place place = PlaceAutocomplete.getPlace(this, data);
                    if (!place.getAddress().toString().contains(place.getName())) {
                        txtLocationAddress.setText(place.getName() + ", " + place.getAddress());
                    } else {
                        txtLocationAddress.setText(place.getAddress());
                    }
    
                    CameraUpdate cameraUpdate = CameraUpdateFactory.newLatLngZoom(place.getLatLng(), 16);
                    map.animateCamera(cameraUpdate);
    
    
                } else if (resultCode == PlaceAutocomplete.RESULT_ERROR) {
                    printToast("Error in retrieving place info");
    
                }
            }
        }
    
        private void printToast(String message) {
            Toast.makeText(getApplicationContext(), message, Toast.LENGTH_SHORT).show();
        }
    }

    Let’s break down the above code and see what it does.

    让我们分解上面的代码,看看它能做什么。

    1. We’ve set the attributes setEllipize() and set setMarqueeRepeatLimit() on the TextView programmatically since setting the same attributes in xml doesn’t scroll the text on all devices anymore. The above methods make the content of TextView scroll horizontally IF the content length is greater than the TextView width.

      我们已通过编程方式在TextView上设置了属性setEllipize()setMarqueeRepeatLimit() ,因为在xml中设置相同的属性不会再在所有设备上滚动文本。 如果内容长度大于TextView的宽度,则上述方法可使TextView的内容水平滚动。
    2. Passing -1 in setMarqueeRepeatLimit() makes it scroll forever.

      setMarqueeRepeatLimit()传递-1将使其永远滚动。
    3. The Google Map is displayed using the SupportMapFragment. getMapAsync() callback is assigned to the fragment. This callback gets triggered when the Google Play Services exists.

      使用SupportMapFragment显示Google Map。 getMapAsync()回调分配给该片段。 存在Google Play服务时会触发此回调。
    4. The onMapReady() method is the one that displays the Google Map and returns a non-null instance of the GoogleMap class. We assign it to our instance variable map.
      map.getUiSettings().setZoomControlsEnabled(true) is used to set the zoom controls on the screen.

      onMapReady()方法是显示Google Map并返回GoogleMap类的非null实例的方法。 我们将其分配给实例变量map
      map.getUiSettings().setZoomControlsEnabled(true)用于在屏幕上设置缩放控件。
    5. map.moveCamera(CameraUpdateFactory.newLatLngZoom(latLng, 16)) moves the map to the location specified in the latLng(Some location in India!). The camera zooms to the location in the center of the screen where the marker is placed.

      map.moveCamera(CameraUpdateFactory.newLatLngZoom(latLng, 16))将地图移动到latLng指定的位置(印度的某些位置!)。 相机将缩放到屏幕中心放置标记的位置。
    6. setOnCameraIdleListener would listen for the movements/dragging on the map. When the movement ends the method onCameraIdle() gets triggered. This is where we retrieve the latitude and longitude of the center of map(because that is where the marker resides) and pass it into the method getAddressFromLocation() which will eventually do the reverse geocoding.

      setOnCameraIdleListener将侦听地图上的移动/拖动。 运动结束后,将触发onCameraIdle()方法。 在这里,我们检索地图中心的纬度和经度(因为这是标记所在的位置),并将其传递到方法getAddressFromLocation() ,该方法最终将进行反向地理编码。
    7. The method getFromLocation(double latitude, double longitude, int maxResults) returns a List of Addresses for the current location.

      方法getFromLocation(double latitude, double longitude, int maxResults)返回当前位置的地址列表。
    8. Within the Address object, the method getAddressLine(int index) returns a line of the address numbered by the given index or null if no address exists.

      Address对象中,方法getAddressLine(int index)返回由给定索引编号的地址行;如果不存在地址,则返回null。
    9. We append that address to a StringBuilder which is eventually displayed in the TextView.

      我们将该地址附加到StringBuilder,该字符串最终显示在TextView中。
    10. getMaxAddressLineIndex() returns the largest index currently in use to specify an address line.

      getMaxAddressLineIndex()返回当前用于指定地址行的最大索引。
    11. There are several other important details of an address that can retrieved too. Some of them are listed below:
      • getThoroughfare() : This is the street, which contains the delivery point. If it doesn’t exist null would be returned.
      • getSubThoroughfare() : When a thoroughfare name exists more than once within a town, subThoroughfare name is used for additional information.
      • getLocality() and getSublocality() : Returns the locality of the address, for example “Mountain View” and sub locality respectively if available or null.
      • getFeatureName() : Returns the nearest landmark name if available or null.
      • getCountryName() getCountryCode() : Returns the country name and country code respectively.

      地址的其他一些重要细节也可以检索。 下面列出了其中一些:
      • getThoroughfare() :这是一条街道,其中包含交付点。 如果不存在,则返回null。
      • getSubThoroughfare() :当一个城镇的通途名称不止一次存在时,subThoroughfare名称将用于其他信息。
      • getLocality()getSublocality() :返回地址的局部性,例如,如果可用,则分别返回“ Mountain View”和子局部性,或者返回null。
      • getFeatureName() :返回最近的地标名称(如果有)或为null。
      • getCountryName() getCountryCode() :分别返回国家名称和国家代码。
    12. Clicking the CardView would launch the PlaceAutoComplete service from the Google Places API.

      点击CardView将从Google Places API启动PlaceAutoComplete服务。
    13. We use the PlaceAutocomplete.IntentBuilder to create Intent and pass the Mode as full screen.

      我们使用PlaceAutocomplete.IntentBuilder创建Intent并将Mode作为全屏传递。
    14. The selected place is returned in the onActivityResult() which is eventually displayed in the TextView. The latitude and longitude of the Place are returned as place.getLatLng() which is eventually zoomed into the center of the screen.

      所选位置将在onActivityResult()返回,该结果最终将显示在TextView中。 将Place的纬度和经度作为place.getLatLng()返回,最终将其缩放到屏幕的中心。

    The output of the android reverse geocoding application in action is given below.

    实际操作中的android反向地理编码应用程序的输出如下。

    This brings an end to android Geocoder example tutorial. You can download the final Android Reverse Geocoding Project from the link below and make sure to add your own API in the meta-data tag inside AndroidManifest.xml file.

    这结束了android Geocoder示例教程。 您可以从下面的链接下载最终的Android反向地理编码项目 ,并确保在AndroidManifest.xml文件内的meta-data标签中添加自己的API。

    References : Geocoder, Address, Place Autocomplete.

    参考: 地址 解析器地址 ,位置自动完成功能

    翻译自: https://www.journaldev.com/15676/android-geocoder-reverse-geocoding

    geocoder

    展开全文
  • LMGeocoder是使用Google Geocoding API和Apple iOS Geocoding Framework进行地理编码和反向地理编码的简单包装。 产品特点 地理编码和反向地理编码的包装,以及基于块的编码。 同时使用Google Geocoding API和Apple...
  • Android SDK提供了一组用于映射,路由,地理编码和反向地理编码的工具。 geokit-android 介绍 Geokit是一个SDK,提供了一组在OnYourMap平台上执行请求的工具。 这些请求包括映射,地理编码,反向地理编码和路由。 ...
  • Rust反向地理编码器Rust中的一种快速反向地理编码器。 受Python反向地理编码器的启发。 链接板条箱2.0.0文档1.0.1文档生成状态:描述Rust反向地理编码器Rust中的一种快速反向地理编码器。 受Python反向地理编码器的...
  • 使用 OSM 数据集进行离线反向地理编码。 类似于但它使用 openmaps 而不是使用 geonames。 当前使用情况: 列表节点 = OSMReader.openPBFFile("C:\Projects\offlinereversegeocode\Sydney.osm.pbf"); KD...
  • Go Code Coverage中的GeoService以Go的方式开发的地理编码服务,习惯而优雅,而不仅仅是golang。 该产品旨在向任何地理编码服务开放。 在此基础上,Go Code Coverage中的Google Maps Map GeoService这是一种以Go的...
  • 此小部件可以与您的应用程序打包在一起,并用于从地图点击中对地址进行反向地理编码。 #指示 下载此小部件并将其放入您的小部件文件夹(client/stemapp/widgets) 将小部件添加到您的应用程序并使用构建器设置新...
  • 与OpenStreetMap反向地理编码(PLACE)集成的组件 安装 使用选择的工具打开HA配置的目录(文件夹)(在其中找到configuration.yaml )。 如果那里没有custom_components目录(文件夹),则需要创建它。 在custom_...
  • 自述文件 该存储库是做什么用的? 如何设置? 即将添加API文档 贡献准则 我要和谁说话?
  • 反向地理编码确定地图上给出点的地址。本例展示了如何通过ArcGIS JavaScript API做反向地理编码反向地理编码和常规的地理编码请求都使用Locator类和ArcGIS Server geocode service。 调用 ...

    描述

    反向地理编码确定地图上给出点的地址。本例展示了如何通过ArcGIS JavaScript API做反向地理编码。

    反向地理编码和常规的地理编码请求都使用Locator类和ArcGIS Server geocode service。 调用 locationToAddress方法(和常规的地理编码相反addressToLocations)进行反向地理编码。下面的监听器捕获鼠标单击事件并为单击的点调用locationToAddress方法:

    dojo.connect(map, "onClick", function(evt) {
      map.graphics.clear();
      locator.locationToAddress(evt.mapPoint, 100);
    });

    onLocationToAddressComplete事件的监听器传递最好的AddressCandidate给一个回调函数。然后回调函数结合候选的点和图形并增加到地图里。函数也使用 InfoTemplate格式化一个单击图形显示的InfoWindow。注意为了定位信息窗口,地址结果的地图点必须被转换为一个屏幕点。

    var screenPnt = map.toScreen(candidate.location);
    map.infoWindow.show(screenPnt,map.getInfoWindowAnchor(screenPnt));

    为了保持信息窗口总是可见的,信息窗口位于锚点所在的四分之一地图的相反方向。例如,如果点位于地图右上角,信息窗口显示在点的左下方。

    展开全文
  • 浏览器地理位置 用法 在美国/加拿大使用VPN来检查邮政编码标识。 否则,它将显示国家(而不是ZIP) 示范
  • Verso - 离线反向地理编码
  • 以Go的方式开发的地理编码服务,既习惯又优雅,而不仅仅是golang。 该产品旨在向任何地理编码服务开放。 基于此, MapQuest 这里 每个客户在〜50 LoC中实现。 它使您仅需更改一条线路即可从一项服务切换到另一项...
  • opencage:用于OpenCage API的R包-正向和反向地理编码
  • 位于LocationManager和CLGeocoder之上的iOS Geocoder使用基于块的语法对用户的当前位置进行正向地理编码和反向地理编码。 它也可以用于对用户的大概位置(总是国家,几乎总是城市)进行地理编码,而无需征求许可...
  • Flutter地理编码 使用flutter,dart,mapbox和flutter-mapbox-gl插件的正向和反向地理编码实现
  • 地理定位和逆地理编码 地理定位和反向地理编码示例 您可以看到示例的演示
  • 支持方向和反向地理编码。 描述 Geopin 是一个 android 应用程序,用户可以在其中在地图上标记她最喜欢的地方并将它们存储在数据库中。 支持方向和反向地理编码以及不同的语言环境。 特征 安卓地图 V2 用户在地图...
  • 自定义窗口小部件,通过提供反向地理编码。 先决条件 的已安装和配置的实例 what3words API密钥; 您可以快速轻松地 此小部件的副本 安装与配置 通过将w3wwidget文件夹及其内容复制到Web AppBuilder安装的client/...
  • 反向地理编码

    千次阅读 2016-03-21 08:21:51
    使用Google提供的Geocoding API完成反向地理编码  Google提供的反向地理编码接口为: http://maps.googleapis.com/maps/api/geocode/json?latlng=40.714224,-73.961452&sensor=true_or_false  其中,sensor=true_...

    一.使用Google提供的Geocoding API完成反向地理编码

           Google提供的反向地理编码接口为:

    http://maps.googleapis.com/maps/api/geocode/json?latlng=40.714224,-73.961452&sensor=true_or_false

          其中,sensor=true_or_false表示这条请求是否来自于某个设备的位置传感器,通常指定成false.


    二.对经纬度进行解析

    基本步骤:先发送一个HTTP请求到谷歌服务器,然后对返回的JSON数据进行解析

    public static final int SHOW_LOCATION = 0;
    
    	// 显示经纬度
    	private void showLocation(final Location location) {
    		new Thread(new Runnable() {
    
    			@Override
    			public void run() {
    				try {
    					//组装反向地理编码的接口地址
    					StringBuilder url = new StringBuilder();
    					url.append("http://maps.googleapis.com/maps/api/geocode/json?latlng=");
    					url.append(location.getLatitude()).append(",");
    					url.append(location.getLongitude());
    					url.append("&sensor=false");
    					// HttpClient是一个接口,无法创建实例,通常情况下创建一个DefaultHttpClient对象
    					HttpClient httpClient = new DefaultHttpClient();
    					HttpGet httpGet = new HttpGet(url.toString());
    					// 在请求消息头中指定语言,保证服务器会返回中文数据
    					httpGet.addHeader("Accept-Language", "zh-CN");
    
    					HttpResponse httpResponse = httpClient.execute(httpGet);
    					if (httpResponse.getStatusLine().getStatusCode() == 200) {
    						HttpEntity entity = httpResponse.getEntity();
    						String response = EntityUtils.toString(entity, "utf-8");
    						JSONObject jsonObject = new JSONObject(response);
    						// 获取results节点下的位置信息
    						JSONArray resultArray = jsonObject
    								.getJSONArray("results");
    						if (resultArray.length() > 0) {
    							JSONObject subObject = resultArray.getJSONObject(0);
    							String address = subObject
    									.getString("formatted_address");
    							Message message = new Message();
    							message.what = SHOW_LOCATION;
    							message.obj = address;//使用obj字段来携带一个Object对象
    							handler.sendMessage(message);
    
    						}
    
    					}
    				} catch (Exception e) {
    					e.printStackTrace();
    				}
    
    			}
    		}).start();
    
    	}
           //异步消息处理机制,在主线程中更新UI
    	private Handler handler = new Handler() {
    		public void handleMessage(Message msg) {
    			switch (msg.what) {
    			case SHOW_LOCATION:
    				String currentPosition = (String) msg.obj;
    				positionTextView.setText(currentPosition);
    				break;
    
    			default:
    				break;
    			}
    		}
    	};
    


    展开全文
  • } #pragma mark ----反向地理编码 - (void)reverseGeoCodeWithLatitude:(NSString *)latitude withLongitude:(NSString *)longitude { //发起反向地理编码检索 CLLocationCoordinate2D coor; coor.latitude = ...
  • 地理编码器模块包含支持地理编码过程的算法-例如地址解析和插值。 它还在库子模块中包含正则表达式类和数据转换工具。 此应用程序所需的数据库位于单独的服务器上,必须进行构建。 我有用于构建原始数据库的构建...
  • 自述文件 该自述文件通常会记录启动和运行应用程序所需的所有步骤。 您可能要讲的内容: Ruby版本 系统依赖 配置 数据库创建 数据库初始化 如何运行测试套件 服务(作业队列,缓存服务器,搜索引擎等) ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 4,902
精华内容 1,960
关键字:

反向地理编码