最新消息:雨落星辰是一个专注网站SEO优化、网站SEO诊断、搜索引擎研究、网络营销推广、网站策划运营及站长类的自媒体原创博客

javascript - Leaflet.Geosearch: get lonlat from address - Stack Overflow

programmeradmin4浏览0评论

Without any knowledge of JS, I was forced to implement a map (OSM via Leaflet) on a webpage. On this map, there should be a marker for the actual address of a person. The address is saved as a string in the database. I can see a map, can add marker to it, but after that, I'm lost.

I've tested some Leaflet-geocoding-plugins, but i must confess, that they're not simple enough for my actual programmming experience.

Another question was about the same problem, but i didn't understand, how to get the lon/lat from an address with the L.Geosearch-plugin for Leaflet.

Can anyone provide me a example of looking up an address (via OSMN or something else, not google/bing or other api-key-needy provider), converting it to lon/lat and add a marker to it on a map?

Without any knowledge of JS, I was forced to implement a map (OSM via Leaflet) on a webpage. On this map, there should be a marker for the actual address of a person. The address is saved as a string in the database. I can see a map, can add marker to it, but after that, I'm lost.

I've tested some Leaflet-geocoding-plugins, but i must confess, that they're not simple enough for my actual programmming experience.

Another question was about the same problem, but i didn't understand, how to get the lon/lat from an address with the L.Geosearch-plugin for Leaflet.

Can anyone provide me a example of looking up an address (via OSMN or something else, not google/bing or other api-key-needy provider), converting it to lon/lat and add a marker to it on a map?

Share Improve this question edited May 23, 2017 at 10:31 CommunityBot 11 silver badge asked Jun 19, 2015 at 9:15 GromdenGromden 811 gold badge1 silver badge2 bronze badges 2
  • 1 You can get lat/lon for an address from nominatim open.mapquestapi.com/nominatim. How to put it into your leaflet map, i don' know sorry. – Gwny Commented Jun 19, 2015 at 9:26
  • 1 I'll not post an answer because I use openlayers, but you can have an idea in this example. – Jonatas Walker Commented Jun 20, 2015 at 14:57
Add a comment  | 

2 Answers 2

Reset to default 9

First you will have to include the .js files of a geocoder in the head of your HTML code, for my example I have used this one: https://github.com/perliedman/leaflet-control-geocoder. Like this:

<script src="Control.Geocoder.js"></script>

Then you will have to initialize the Geocoder in your .js:

geocoder = new L.Control.Geocoder.Nominatim();

Then you will have to specify the address that you are looking for, you can save it in a variable. For example:

var yourQuery = (Addres of person);    

(You can also get the address out of your database, then save it in the variable)

Then you can use the following code to 'geocode' your address into latitude / longitude. This function will return the latitude / longitude of the address. You can save the latitude / longitude in an variable so you can use it later for your marker. Then you only have to add the marker to the map.

geocoder.geocode(yourQuery, function(results) {    
       latLng= new L.LatLng(results[0].center.lat, results[0].center.lng);
       marker = new L.Marker (latLng);
       map.addlayer(marker);
});

I made a jfsfiddle that

  1. Has an address set
  2. Looks for the coordinates of that address using geosearch
  3. Creates a marker at the coordinates of that address found by geosearch.

It can be found here: https://jsfiddle.net/Alechan/L6s4nfwg/

The "tricky" part is dealing with the Javascript "Promise" instance returned by geosearch and that the address may be ambigous and more than one coordinate may be returned in that case. Also, be careful because the first position in the Leaflet coordinates corresponds to the latitude and the second to the longitude, which is in reverse of the Geosearch "x" and "y" results.

Geosearch returns a promise because it's an asynchronous call. The alternative would have to be a synchronous call and the browser would have to be freezed until an answer was retrieved. More info about promises from MDM (Mozilla) and Google.

In my example, I create a marker for every result found for the indicated address. However, in this case the address is unambiguous and returns only one result.

Breakdown of code:

<!-- Head, imports of Leaflet CSS and JS, Geosearch JS, etc -->

<div id='map'></div>


<script>
// Initialize map to specified coordinates
  var map = L.map( 'map', {
    center: [ 51.5, -0.1], // CAREFULL!!! The first position corresponds to the lat (y) and the second to the lon (x)
    zoom: 12
});

  // Add tiles (streets, etc)
  L.tileLayer( 'http://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png', {
    attribution: '&copy; <a href="https://www.openstreetmap.org/copyright">OpenStreetMap</a>',
    subdomains: ['a','b','c']
}).addTo( map );

var query_addr = "99 Southwark St, London SE1 0JF, UK";
// Get the provider, in this case the OpenStreetMap (OSM) provider.
const provider = new window.GeoSearch.OpenStreetMapProvider()
// Query for the address
var query_promise = provider.search({ query: query_addr});
// Wait until we have an answer on the Promise
query_promise.then( value => {
   for(i=0;i < value.length; i++){
     // Success!
     var x_coor = value[i].x;
     var y_coor = value[i].y;
     var label = value[i].label;
     // Create a marker for the found coordinates
     var marker = L.marker([y_coor,x_coor]).addTo(map) // CAREFULL!!! The first position corresponds to the lat (y) and the second to the lon (x)
     // Add a popup to said marker with the address found by geosearch (not the one from the user)
     marker.bindPopup("<b>Found location</b><br>"+label).openPopup();
   };
}, reason => {
  console.log(reason); // Error!
} );

</script>
发布评论

评论列表(0)

  1. 暂无评论