首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

在laravel中使用google地图和mysql进行radius搜索

在Laravel中使用Google地图和MySQL进行半径搜索,可以通过以下步骤实现:

  1. 首先,确保你已经安装了Laravel框架,并创建了一个新的Laravel项目。
  2. 在Google Cloud平台上创建一个新的项目,并启用Google Maps JavaScript API和Places API。获取API密钥。
  3. 在Laravel项目的.env文件中配置Google Maps API密钥:
代码语言:txt
复制

GOOGLE_MAPS_API_KEY=your_api_key

代码语言:txt
复制
  1. 在Laravel项目中安装Guzzle HTTP客户端,用于发送HTTP请求:
代码语言:txt
复制

composer require guzzlehttp/guzzle

代码语言:txt
复制
  1. 创建一个新的控制器,例如MapController,并在其中编写以下代码:
代码语言:php
复制

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;

use GuzzleHttp\Client;

class MapController extends Controller

{

代码语言:txt
复制
   public function search(Request $request)
代码语言:txt
复制
   {
代码语言:txt
复制
       $address = $request->input('address');
代码语言:txt
复制
       $radius = $request->input('radius');
代码语言:txt
复制
       // 使用Google Geocoding API将地址转换为经纬度坐标
代码语言:txt
复制
       $client = new Client();
代码语言:txt
复制
       $response = $client->get('https://maps.googleapis.com/maps/api/geocode/json', [
代码语言:txt
复制
           'query' => [
代码语言:txt
复制
               'address' => $address,
代码语言:txt
复制
               'key' => config('app.google_maps_api_key'),
代码语言:txt
复制
           ],
代码语言:txt
复制
       ]);
代码语言:txt
复制
       $data = json_decode($response->getBody(), true);
代码语言:txt
复制
       $location = $data['results'][0]['geometry']['location'];
代码语言:txt
复制
       $latitude = $location['lat'];
代码语言:txt
复制
       $longitude = $location['lng'];
代码语言:txt
复制
       // 使用MySQL进行半径搜索
代码语言:txt
复制
       $results = DB::select(DB::raw('
代码语言:txt
复制
           SELECT *,
代码语言:txt
复制
               (6371 * acos(cos(radians(' . $latitude . ')) * cos(radians(latitude)) * cos(radians(longitude) - radians(' . $longitude . ')) + sin(radians(' . $latitude . ')) * sin(radians(latitude))))
代码语言:txt
复制
               AS distance
代码语言:txt
复制
           FROM locations
代码语言:txt
复制
           HAVING distance < ' . $radius . '
代码语言:txt
复制
           ORDER BY distance
代码语言:txt
复制
       '));
代码语言:txt
复制
       return response()->json($results);
代码语言:txt
复制
   }

}

代码语言:txt
复制

请注意,上述代码中的locations是你的MySQL数据库中存储位置信息的表名。

  1. 在路由文件中定义一个路由,将请求指向MapControllersearch方法:
代码语言:php
复制

Route::post('/search', 'MapController@search');

代码语言:txt
复制
  1. 创建一个包含Google地图和搜索表单的视图文件,例如search.blade.php
代码语言:html
复制

<html>

<head>

代码语言:txt
复制
   <title>Radius Search</title>
代码语言:txt
复制
   <script src="https://maps.googleapis.com/maps/api/js?key={{ config('app.google_maps_api_key') }}&libraries=places"></script>
代码语言:txt
复制
   <script>
代码语言:txt
复制
       function initMap() {
代码语言:txt
复制
           var map = new google.maps.Map(document.getElementById('map'), {
代码语言:txt
复制
               center: {lat: -34.397, lng: 150.644},
代码语言:txt
复制
               zoom: 8
代码语言:txt
复制
           });
代码语言:txt
复制
           var input = document.getElementById('address');
代码语言:txt
复制
           var searchBox = new google.maps.places.SearchBox(input);
代码语言:txt
复制
           map.addListener('bounds_changed', function() {
代码语言:txt
复制
               searchBox.setBounds(map.getBounds());
代码语言:txt
复制
           });
代码语言:txt
复制
           var markers = [];
代码语言:txt
复制
           searchBox.addListener('places_changed', function() {
代码语言:txt
复制
               var places = searchBox.getPlaces();
代码语言:txt
复制
               if (places.length === 0) {
代码语言:txt
复制
                   return;
代码语言:txt
复制
               }
代码语言:txt
复制
               markers.forEach(function(marker) {
代码语言:txt
复制
                   marker.setMap(null);
代码语言:txt
复制
               });
代码语言:txt
复制
               markers = [];
代码语言:txt
复制
               var bounds = new google.maps.LatLngBounds();
代码语言:txt
复制
               places.forEach(function(place) {
代码语言:txt
复制
                   if (!place.geometry) {
代码语言:txt
复制
                       console.log("Returned place contains no geometry");
代码语言:txt
复制
                       return;
代码语言:txt
复制
                   }
代码语言:txt
复制
                   markers.push(new google.maps.Marker({
代码语言:txt
复制
                       map: map,
代码语言:txt
复制
                       title: place.name,
代码语言:txt
复制
                       position: place.geometry.location
代码语言:txt
复制
                   }));
代码语言:txt
复制
                   if (place.geometry.viewport) {
代码语言:txt
复制
                       bounds.union(place.geometry.viewport);
代码语言:txt
复制
                   } else {
代码语言:txt
复制
                       bounds.extend(place.geometry.location);
代码语言:txt
复制
                   }
代码语言:txt
复制
               });
代码语言:txt
复制
               map.fitBounds(bounds);
代码语言:txt
复制
           });
代码语言:txt
复制
       }
代码语言:txt
复制
   </script>

</head>

<body>

代码语言:txt
复制
   <input id="address" type="text" placeholder="Enter a location">
代码语言:txt
复制
   <input id="radius" type="number" placeholder="Enter a radius">
代码语言:txt
复制
   <button onclick="search()">Search</button>
代码语言:txt
复制
   <div id="map" style="height: 400px;"></div>
代码语言:txt
复制
   <script>
代码语言:txt
复制
       function search() {
代码语言:txt
复制
           var address = document.getElementById('address').value;
代码语言:txt
复制
           var radius = document.getElementById('radius').value;
代码语言:txt
复制
           axios.post('/search', {
代码语言:txt
复制
               address: address,
代码语言:txt
复制
               radius: radius
代码语言:txt
复制
           })
代码语言:txt
复制
           .then(function (response) {
代码语言:txt
复制
               console.log(response.data);
代码语言:txt
复制
           })
代码语言:txt
复制
           .catch(function (error) {
代码语言:txt
复制
               console.log(error);
代码语言:txt
复制
           });
代码语言:txt
复制
       }
代码语言:txt
复制
   </script>

</body>

</html>

代码语言:txt
复制

请注意,上述代码中使用了Axios库来发送异步POST请求,确保你已经在项目中安装了Axios。

  1. 运行Laravel项目,并访问/search路由,你将看到一个包含Google地图和搜索表单的页面。输入地址和半径后,点击搜索按钮,将会在控制台中打印出符合条件的结果。

这是一个基本的示例,你可以根据自己的需求进行修改和扩展。在这个示例中,我们使用了Google Maps JavaScript API和MySQL来实现在Laravel中使用Google地图和MySQL进行半径搜索。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

没有搜到相关的结果

领券