Es gibt nur sehr wenige Artikel, die als Referenz verwendet werden können, und es war der schwierigste Teil beim Erstellen eines Portfolios. Deshalb habe ich es geschrieben, weil ich dachte, es wäre gut, es als Ausgabe für mein eigenes Lernen zu belassen und jemandem zu helfen! Was bedeutet diese Beschreibung als Anfänger? Ich beabsichtige, den Teil zu erklären, den ich denke. natürlich! Bitte beachten Sie, dass es viele Teile gibt, die ich denke.
Sie können Google Map nicht nur mit der Google Maps-API anzeigen, sondern auch willkürlich aus dem Markierungsballon zur Routensuchliste hinzufügen. Ziel ist es, an mehreren Punkten nach Routen zu suchen.
・ Ruby: 2.5.1 ・ Schienen: 5.2.1 ・ Betriebssystem: macOS
・ Einführung von Slim
Gemfile
gem 'dotenv-rails' #Machen Sie den API-Schlüssel zu einer Umgebungsvariablen
gem 'gon' #Stellen Sie die im Controller definierten Instanzvariablen in JavaScript zur Verfügung.
gem 'geocoder' #Berechnen Sie Längen- und Breitengrad aus der Adresse.
Terminal
$ bundle install
Erstellen Sie eine ".env" -Datei direkt unter der Anwendung
Terminal
$ touch .env
Schreiben Sie Ihren eigenen API-Schlüssel in ''
.env
GOOGLE_MAP_API = 'Eigener kopierter API-Schlüssel'
.gitignore
/.env
Gemfile
gem 'turbolinks' #Löschen Sie diese Zeile
app/assets/javascripts/application.js
//= require turbolinks //Löschen Sie diese Zeile
data-turbolinks-track ': Attribut' reload 'entfernen
ruby:app/views/layouts/application.html.slim
= stylesheet_link_tag 'application', media: 'all'
= javascript_include_tag 'application'
Erstellen und bearbeiten Sie die Geocorder-Konfigurationsdatei
Terminal
$ touch config/initializers/geocoder.rb
config/initializers/geocoder.rb
#Nachtrag
Geocoder.configure(
lookup: :google,
api_key: ENV['GOOGLE_MAP_API']
)
Damit sind die Einstellungen abgeschlossen. Von hier aus geben wir die Implementierung ein, in der Google Map angezeigt wird.
Fügen Sie für Ihre eigene App Ihrem Place-Modell eine Adressspalte hinzu. Die Breiten- und Längengradspalten sind die Längen- / Breitengradwerte, die aus den Werten in der Adressspalte von der Geocoding-API berechnet wurden. Da es sich um einen Bruchwert handelt, verwendet der Typ float.
Terminal
$ rails g migration AddColumnsToPlaces address:string latitude:float longitude:float
Terminal
$ rails db:migrate
models/place.rb
#Nachtrag
geocoded_by :address #Berechnen Sie Breiten- und Längengrade anhand der Adressspalte.
after_validation :geocode #Beim Ändern der Adresse werden auch der Breiten- und Längengrad geändert.
controllers/places_controller.rb
def index
@place = Place.all
gon.place = @place #Nachtrag
end
private
def place_params
#"Adresse" zu starken Parametern hinzugefügt
params.require(:place).permit(:name, :description, :image, :address)
end
① Bearbeiten Sie application.html.slim Schreiben Sie, um Gon vor CSS und JavaScript zu laden.
ruby:views/layouts/application.html.slim
doctype html
html
head
title
| app_name
= csrf_meta_tags
= csp_meta_tag
= include_gon #Nachtrag
= stylesheet_link_tag 'application', media: 'all'
= javascript_include_tag 'application'
② Fügen Sie dem neuen Registrierungsbildschirm ein Adresseneingabeformular hinzu
ruby:views/places/new.html.slim
= f.label :address, 'Adresse'
= f.text_field :address, class: 'form-control'
③ Beschreiben Sie in der Datei, in der Google Map angezeigt wird
ruby:views/places/index.html.slim
div id = 'map_index' #Gib einen Ausweis,Die in der js-Datei beschriebene Google Map ist in diesen Teil eingebettet
- google_api = "https://maps.googleapis.com/maps/api/js?key=#{ ENV['GOOGLE_MAP_API'] }&callback=initMap".html_safe
script{ async src = google_api }
.map-route
<Routensuchliste>
ul id = "route-list" class = "list-group" #Die Schaltfläche zum Hinzufügen in der Sprechblase in der js-Datei fügt diese Position dem li-Element hinzu
div id = 'directions-panel' #Entfernung / Zeit ist eingebettet
<Entfernung / Zeit zwischen Punkten>
ul id = "display-list" class = "display-group"
.map-search
= button_tag "Routensuche", id: "btn-search", class: "btn btn-primary", onclick: "search()" #Suche durch Klickverarbeitung()Rufen Sie eine Funktion auf
[Über den Teil von google_api = ~ ~ ~ ~] → Rufen Sie die Funktion initMap auf, wenn Sie den Rückrufprozess einlesen. → .html_safe ist Escape-Verarbeitung → Das asynchrone Attribut lädt JavaScript asynchron, um das Rendern zu beschleunigen.
④ Beschreiben Sie die Größe, die Sie in scss auf Google Map anzeigen möchten
stylesheets/application.scss
#map_index{
height: 400px;
width: 400px;
}
Das ist das Herz. Erstellen Sie eine neue Datei direkt unter Assets / Javascripts und beschreiben Sie sie. Es mag lange Zeit schwierig sein zu sehen, aber nachdem wir die Variablen definiert haben, definieren wir einfach jede Funktion. die Funktion ist, ・ InitMap ・ MarkerEvent (i) ・ AddPlace (Name, Lat, Länge, Nummer) · Suche () Es gibt vier in der Reihenfolge von. Die schwer verständlichen Teile und Punkte entnehmen Sie bitte dem Kommentar.
assets/javascripts/googlemap.js
var map
var geocoder
var marker = [];
var infoWindow = [];
var markerData = gon.places; //Weisen Sie der Variablen die vom Controller definierte Instanzvariable zu
var place_name = [];
var place_lat = [];
var place_lng = [];
//Funktion zum Anzeigen von GoogleMap(Wird in der Rückrufverarbeitung aufgerufen)
function initMap(){
geocoder = new google.maps.Geocoder()
//ID anzeigen='map_index'Betten Sie Google Map in den Teil von ein
map = new google.maps.Map(document.getElementById('map_index'), {
center: { lat: 35.6585, lng: 139.7486 }, //Im Zentrum des Tokyo Tower
zoom: 9,
});
//Zeigen Sie mehrere Marker und Sprechblasen durch iterative Verarbeitung an
for (var i = 0; i < markerData.length; i++) {
//Berechnen Sie den Breiten- und Längengrad jedes Punktes
markerLatLng = new google.maps.LatLng({
lat: markerData[i]['latitude'],
lng: markerData[i]['longitude']
});
//Anzeige von Markern
marker[i] = new google.maps.Marker({
position: markerLatLng,
map: map
});
//Anzeige des Ballons
let id = markerData[i]['id']
place_name[i]= markerData[i]['name'];
place_lat[i]= markerData[i]['latitude'];
place_lng[i]= markerData[i]['longitude'];
infoWindow[i] = new google.maps.InfoWindow({
//Inhalt des Ballons,Übergeben Sie das Array und die Array-Nummer jedes Attributs als Argumente
content: `<a href='/places/${ id }'>${ markerData[i]['name'] }</a><input type="button" value="hinzufügen" onclick="addPlace(place_name, place_lat, place_lng, ${i})">`
});
markerEvent(i);
}
}
}
//Klicken Sie auf die Markierung, um eine Sprechblase anzuzeigen
function markerEvent(i) {
marker[i].addListener('click', function () {
infoWindow[i].open(map, marker[i]);
});
}
//Zur Liste hinzufügen
function addPlace(name, lat, lng, number){
var li = $('<li>', {
text: name[number],
"class": "list-group-item"
});
li.attr("data-lat", lat[number]); // data-lat zum Attribut lat[number]Einstellen
li.attr("data-lng", lng[number]); // data-lng zum Attribut lng[number]Einstellen
$('#route-list').append(li); //ID ist Route-Fügen Sie li am Ende des Listenelements hinzu
}
//Suche nach einer Route
function search() {
var points = $('#route-list li');
//Wenn es zwei oder mehr Punkte gibt
if (points.length >= 2){
var origin; //Startpunkt
var destination; //Endpunkt
var waypoints = []; //Wegpunkt
// origin, destination,Wegpunkte festlegen
for (var i = 0; i < points.length; i++) {
points[i] = new google.maps.LatLng($(points[i]).attr("data-lat"), $(points[i]).attr("data-lng"));
if (i == 0){
origin = points[i];
} else if (i == points.length-1){
destination = points[i];
} else {
waypoints.push({ location: points[i], stopover: true });
}
}
//Eine Anfrage stellen
var request = {
origin: origin,
destination: destination,
waypoints: waypoints,
travelMode: google.maps.TravelMode.DRIVING
};
//Root-Serviceanforderung
new google.maps.DirectionsService().route(request, function(response, status) {
if (status == google.maps.DirectionsStatus.OK) {
new google.maps.DirectionsRenderer({
map: map,
suppressMarkers : true,
polylineOptions: { //Einstellungen für gezeichnete Linien
strokeColor: '#00ffdd',
strokeOpacity: 1,
strokeWeight: 5
}
}).setDirections(response);//Strichzeichnungsteil
//Entfernung und Zeit anzeigen
var data = response.routes[0].legs;
for (var i = 0; i < data.length; i++) {
//Entfernung
var li = $('<li>', {
text: data[i].distance.text,
"class": "display-group-item"
});
$('#display-list').append(li);
//Zeit
var li = $('<li>', {
text: data[i].duration.text,
"class": "display-group-item"
});
$('#display-list').append(li);
}
const route = response.routes[0];
//ID anzeigen='directions-panel'Einbetten in den Teil von
const summaryPanel = document.getElementById("directions-panel");
summaryPanel.innerHTML = "";
//Zeigen Sie die Entfernung und Zeit zwischen jedem Punkt an
for (let i = 0; i < route.legs.length; i++) {
const routeSegment = i + 1;
summaryPanel.innerHTML +=
"<b>Route Segment: " + routeSegment + "</b><br>";
summaryPanel.innerHTML += route.legs[i].start_address + "<br>" + " ↓ " + "<br>";
summaryPanel.innerHTML += route.legs[i].end_address + "<br>";
summaryPanel.innerHTML += "<" + route.legs[i].distance.text + ",";
summaryPanel.innerHTML += route.legs[i].duration.text + ">" + "<br>";
}
}
});
}
}
__ Ergänzung zum Inhaltsteil des Inhalts der Sprechblase: (weil ich mit der Methode zum Übergeben von Daten zu kämpfen hatte) __
content: `<a href='/places/${ id }'>${ markerData[i]['name'] }</a><input type="button" value="hinzufügen" onclick="addPlace(place_name, place_lat, place_lng, ${i})">`
addPlace(place_name, place_lat, place_lng, ${i}) Beim Aufruf dieser Funktion werden die vorherigen drei Argumente als Array übergeben. Das vierte Argument ist die Ausdruckserweiterung der Zahl (als Index bezeichnet), die darstellt, welche Informationen im Array enthalten sind. Die Ausdruckserweiterung in JavaScript scheint diese Form zu sein. Durch die Angabe eines solchen Arguments kann die Funktion addPlace (name, lat, lng, number) Informationen darüber verarbeiten, um welche Daten es sich normalerweise handelt.
Vielen Dank für das Lesen bis zum Ende. Ich selbst bin in einem Zustand, in dem das Portfolio kurz vor der Fertigstellung steht, und ich habe mit der Arbeitssuche begonnen! Wir unterstützen aufrichtig diejenigen, die Ziele haben, wie das Erstellen von Portfolios und den Wechsel von Arbeitsplätzen. Lassen Sie uns also gemeinsam unser Bestes geben! !!
Anzeigen mehrerer Markierungen auf Google Map und Anzeigen einer Sprechblase beim Klicken
[Suche nach Routen an mehreren Punkten, die mit der Google Maps-API zur Liste hinzugefügt wurden] (https://qiita.com/yoshi_01/items/d3848e4e7c854fe585bd)
Recommended Posts