2015-09-08 7 views
1

Мне было интересно, можно ли реализовать RouteBoxer в приложении iOS, использующем API Карт Google? Если нет, есть ли другой способ найти POI на маршруте? Я не очень хорошо знаком с HTML, но есть ли способ получить доступ к RouteBoxer, выполнив HTTP-запрос? Использует ли RouteBoxer веб-страницу и карту для видимости? Я использую Parse.com для моего бэкэнд, поэтому я могу также сделать HTTP-запросы в облаке, используя Javascript, если это необходимо.Google Maps RouteBoxer в приложении iOS

+0

Привет, Якоб, я также сталкиваюсь с той же проблемой. Получили ли вы какое-нибудь решение? –

+0

@ KotiTummala Пока нет, извините !! :( – Jacob

ответ

1

Я нашел решение на данный момент (я не знаю, что это правильный способ сделать это). Я делаю это, я добавил файл Routeboxer.JS для проекта и создаю HTML-файл для вызова функции box из файла Routeboxer.js, который возвращает поля.

Вот код HTML файл ..

<!DOCTYPE html> 
    <html xmlns="http://www.w3.org/1999/xhtml" xmlns:v="urn:schemas-microsoft-com:vml"> 
    <head> 
     <meta http-equiv="content-type" content="text/html; charset=utf-8"/> 
     <title>Google Maps JavaScript API Search Along a Route Example</title> 
     <script src="http://maps.google.com/maps/api/js" type="text/javascript"></script> 
     <script src="RouteBoxer.js" type="text/javascript"></script> 
     <script type="text/javascript"> 

     var boxpolys = null; 
     var directions = null; 
     var routeBoxer = null; 
     var distance = null; // km 

     function initialize() { 
      // Default the map view to the continental U.S. 
      routeBoxer = new RouteBoxer(); 
      directionService = new google.maps.DirectionsService(); 
     } 

     function route(source, destination, distance) { 
      // Convert the distance to box around the route from miles to km 
      //distance = parseFloat(document.getElementById("distance").value) * 1.609344; 
      routeBoxer = new RouteBoxer(); 
      directionService = new google.maps.DirectionsService(); 
      //route("Hyderabad", "Vijayawada", "5"); 
      distance = parseFloat(distance) * 1.609344; 
      var request = { 
      origin: source, 
      destination: destination, 
      travelMode: google.maps.DirectionsTravelMode.DRIVING 
      } 
      // Make the directions request 
      //onload="route('Vijayawada','Hyderabad','5'); 
      var boxes; 
      directionService.route(request, function(result, status) { 
      if (status == google.maps.DirectionsStatus.OK) { 
       //directionsRenderer.setDirections(result); 
       // Box around the overview path of the first route 
       var path = result.routes[0].overview_path; 
       var boxes = routeBoxer.box(path, distance); 
//This object to get the boxes array to get the places from api call 
           var result = JSON.stringify(boxes); 
           console.log(result); 
           var data = []; 

           for (var i = 0; i < boxes.length; i++) { 

           //This object to draw the boxes.. 
           var str = {"NE": [boxes[i].getNorthEast().lat(), boxes[i].getNorthEast().lng()], "SE": [boxes[i].getSouthWest().lat(), boxes[i].getNorthEast().lng()], "SW": [boxes[i].getSouthWest().lat(), boxes[i].getSouthWest().lng()], "NW": [boxes[i].getNorthEast().lat(), boxes[i].getSouthWest().lng()], "WW": [boxes[i].getNorthEast().lat(), boxes[i].getNorthEast().lng()]}; 
           data.push(str) 
           } 
           var latLng = JSON.stringify(data) 
           console.logCoord(latLng); 
           //return JSON.Stringify(boxes); 
      } else { 
       alert("Directions query failed: " + status); 
           return "Direction query failed"; 
      } 
      }); 
     } 
     //As direction service.route method is Asynchronous call we can't return anything from this function so we added the console.log to get the data back to iOS 
     console = new Object(); 
     console.log = function(log) { 
      var iframe = document.createElement("IFRAME"); 
      iframe.setAttribute("src", "ios-log:#iOS#" + log); 

      document.documentElement.appendChild(iframe); 
      iframe.parentNode.removeChild(iframe); 
      iframe = null; 
     }; 
     console.debug = console.log; 
     console.info = console.log; 
     console.warn = console.log; 
     console.error = console.log; 

     console.logCoord = function(log) { 
      var coordiframe = document.createElement("IFRAME"); 
      coordiframe.setAttribute("src", "ios-coor:#iOS#" + log); 
      document.documentElement.appendChild(coordiframe); 
      coordiframe.parentNode.removeChild(coordiframe); 
      coordiframe = null; 
     }; 
     console.debug = console.logCoord; 
     console.info = console.logCoord; 
     console.warn = console.logCoord; 
     console.error = console.logCoord; 
    </script> 
    </head> 
    <body> 
    </body> 
    </html> 

После этого добавьте объект UIWebView к контроллеру представления. Нет необходимости видеть пользователя.! В методе viewDidLoad загрузите URL-адрес с локальным HTML-файлом. Здесь simpleest-3 - это имя файла HTML.

override func viewDidLoad() { 
     super.viewDidLoad() 
     // Do any additional setup after loading the view, typically from a nib. 
     let url = NSBundle.mainBundle().URLForResource("simpletest-3", withExtension:"html") 
     let request = NSURLRequest(URL: url!) 
     webView.loadRequest(request) 
    } 

Ниже приведен пример функции калибровки метода маршрута из javascript ..! Web вид должен быть завершен загрузки перед вызовом этой функции

@IBAction func onClick(sender: UIButton!) { 
     let function = String(format: "route('%@', '%@', '%@')", "Hyderabad", "Mysore", "5") 
     //let function = String(format: "route('Vijayawada','Hyderabad','5')") 
     let result = webView.stringByEvaluatingJavaScriptFromString(function) 
     print("result is : \(result)") 
    } 

В Webview методе делегата мы можем получить результат (массив Boxes, а также координаты для рисования Боксы на карте).

extension MapViewController: UIWebViewDelegate { 
    func webViewDidFinishLoad(webView: UIWebView) { 
     print("web view did finsih loading") 
    } 
    func webView(webView: UIWebView, shouldStartLoadWithRequest request: NSURLRequest, navigationType: UIWebViewNavigationType) -> Bool { 
     if let urlString = request.URL?.absoluteString.stringByRemovingPercentEncoding { 
      if urlString.hasPrefix("ios-log:") { 
       let logString = urlString.componentsSeparatedByString(":#iOS#")[1] 
       self.getPlacesForJsonData(logString) 
       return false 
      } 
      if urlString.hasPrefix("ios-coor:") { 
       let logString = urlString.componentsSeparatedByString(":#iOS#")[1] 
       //print("logString is \(logString)") 
       let data: NSData = logString.dataUsingEncoding(NSUTF8StringEncoding)! 
       do { 
        let json = try NSJSONSerialization.JSONObjectWithData(data, options: NSJSONReadingOptions.MutableLeaves) 

        //print("coordString is \(json)") 
        if let json = json as? NSArray { 
         self.drawBoxes(json) 
        } 

       } catch { 
        print("JSON conversion error") 
       } 
       return false 
      } 
     } 
     return true 
    } 
} 

И последнее, что нарисовать коробки на карте по маршруту ..!

func drawBoxes(boxes: NSArray) { 
     if boxes.count > 0 { 
      for dict in boxes { 
       let path = GMSMutablePath() 
       path.addCoordinate(CLLocationCoordinate2DMake((dict["NE"] as! NSArray)[0].doubleValue, (dict["NE"] as! NSArray)[1].doubleValue)) 
       path.addCoordinate(CLLocationCoordinate2DMake((dict["SE"] as! NSArray)[0].doubleValue, (dict["SE"] as! NSArray)[1].doubleValue)) 
       path.addCoordinate(CLLocationCoordinate2DMake((dict["SW"] as! NSArray)[0].doubleValue, (dict["SW"] as! NSArray)[1].doubleValue)) 
       path.addCoordinate(CLLocationCoordinate2DMake((dict["NW"] as! NSArray)[0].doubleValue, (dict["NW"] as! NSArray)[1].doubleValue)) 

       // Create the polygon, and assign it to the map. 
       let polygon = GMSPolygon(path: path) 
       polygon.fillColor = UIColor(red:1.0, green:0, blue:0, alpha:0.25); 
       //polygon.strokeColor = UIColor.blackColor() 
       polygon.strokeWidth = 0 
       polygon.map = mapView 
      } 
     } 
    } 

Надеюсь, это поможет вам, если у вас возникнут проблемы с этим, дайте мне знать.

Смежные вопросы