[RUBY] [Rails] google maps api Comment publier et afficher des informations cartographiques

introduction

・ API JavaScript Maps ・ API de géocodage

À l'aide de l'API ci-dessus, j'ai implémenté le processus de publication et d'affichage d'un article comprenant une carte dans la production d'une application personnelle. J'étais assez accro à faire référence à divers articles, je vais donc le résumer.

Postscript [Rails] Description de l'API Google Maps lorsque la latitude et la longitude ne peuvent pas être enregistrées Je n'ai pas pu bien comprendre la latitude et la douceur, donc si vous avez une personne similaire, veuillez également vous référer à cet article.

Détails de mise en œuvre / photo d'image

  1. Demandez à l'utilisateur de saisir le nom ou l'adresse du lieu

  2. Déposez le marqueur sur la carte google sur la page de détails et affichez-le.

Au moment de la publication

投稿.png

Page de détails

投稿表示.png

Google API Vous devez obtenir l'API lorsque vous utilisez googlemap. Obtenez la clé API à partir du lien ci-dessous. Google Maps Platform J'omettrai cette fois la méthode d'acquisition.

Dans l'application créée cette fois ・ API JavaScript Maps ・ API de géocodage Sera utilisé, veuillez donc l'activer.

Création de base de données

Commencez par créer une base de données. Si vous l'avez déjà créé, ajoutez une colonne.

table de poteau

Column Type Options
title string null: false
text text null: false

Association

has_one :spot

table spot

Column Type Options
address string null: false
latitude float null: false
longitude float null: false
review_id references foreign_key: true, null: false

Association

belongs_to :post

installation de gemmes

Gemfile


gem "gmaps4rails"
gem "geocoder"
gem "gon"
gem "dotenv-rails"

Si vous pouvez le décrire dans le Gemfile, effectuez l'installation groupée.

D'en haut ・ Gem "gmaps4rails" qui facilite la création de Google Maps ・ Gem "géocodeur" qui peut convertir le nom de lieu en latitude et longitude -Gem "gon" qui permet à JS d'utiliser des variables de contrôleur ・ Gem "dotenv-rails" pour masquer la clé de l'API GoogleMap

Présentation de JS

Modifier application.html.haml

ruby:application.html.haml


!!!
%html
  %head
   .
   .
   .
    = include_gon
    = stylesheet_link_tag    'application', media: 'all', 'data-turbolinks-track': 'reload'
    = javascript_include_tag 'application', 'data-turbolinks-track': 'reload'
  %body
    = yield
    %script{src: "https://maps.googleapis.com/maps/api/js?key=#{ENV["GOOGLE_MAP_KEY"]}&callback=initMap"}
    %script{src: "//cdn.rawgit.com/mahnunchik/markerclustererplus/master/dist/markerclusterer.min.js"}
    %script{src: "//cdn.rawgit.com/printercu/google-maps-utility-library-v3-read-only/master/infobox/src/infobox_packed.js", type:"text/javascript"}

Décrivez en% head pour que la gemme "gon" puisse être utilisée.

Il existe une description de l'utilisation de JS dans% body. Je pense qu'il y a un moyen de l'écrire en% head, mais cette fois je l'ai écrit en% body.

ENV ["GOOGLE_MAP_KEY"] contient la clé API cachée dans le fichier .env.

.env


GOOGLE_MAP_KEY = "Veuillez décrire la clé API acquise"

Créez un fichier .env pour décrire ce qui précède.

Créer un underscore.js

Créez un underscore.js sous app / assets / javascripts et copiez et collez le code lié ci-dessous.

underscore.js

Modifier application.js

Modifiez application.js.

application.js


//= require underscore
//= require gmaps/google

Modifier le modèle

Ensuite, modifiez chaque modèle comme suit.

post.rb


class Post < ApplicationRecord
  has_one :spot, dependent: :destroy
  accepts_nested_attributes_for :spot
end

spot.rb


class Spot < ApplicationRecord
  belongs_to :post
  
  geocoded_by :address
  after_validation :geocode
end

Modifier vue

Créez une page de publication. Le post de googlemap et la description de l'affichage.

Créez un formulaire pour saisir le nom de l'adresse ou du lieu.

ruby:new.html.haml


= form_with(model: @post, local: true, multipart: true) do |f|
  .spot
    = f.fields_for :spot do |s|
      = s.label :address, "Revoir l'emplacement(Rechercher sur Google Map)", class: 'spot__title'
      = s.text_field :address, placeholder: "Entrez un endroit", id: "address", class: 'spot__text'
    %input{onclick: "codeAddress()", type: "button", value: "Rechercher"}
    .map{id: "map", style: "height: 320px; width: 640px;"}

Ensuite, décrivez la partie google map de la page de détails publiée.

ruby:show.html.haml


.show
  .show__address
    = @post.spot.address
  .show__maps{id: "show_map", style: "height: 320px; width: 400px;"}

Contrôleur d'édition

Modifiez le contrôleur.

post.controller


def new
  @post = Review.new
  @post.build_spot
end

def create
  @review = Review.new(review_params)
  if @post.save
    redirect_to root_path
  else
    redirect_to new_review_path
  end
end

def show
  @post = Review.find(params[:id])
  @lat = @review.spot.latitude
  @lng = @review.spot.longitude
  gon.lat = @lat
  gon.lng = @lng
end

private

def review_params
  params.require(:post).permit(:title, :text,spot_attributes: [:address])
end

Puisqu'il correspond à has_one dans la méthode .build de la nouvelle action @post.build_spot C'est dit.

Décrit dans l'action show

@lat = @review.spot.latitude @lng = @review.spot.longitude gon.lat = @lat gon.lng = @lng

Ainsi, les variables @ lat et @ lng définies dans le contrôleur sont affectées respectivement à gon.lat et gon.lng, de sorte qu'elles puissent être gérées par JavaScript.

Créer du JavaScript

Ensuite, nous allons créer un fichier JavaScript.

Créez googlemap.js dans asset / javascripts /.

googlemap.js


let map //Définition variable
let geocoder //Définition variable

function initMap(){ //Fonction de rappel
  geocoder = new google.maps.Geocoder() //Accéder au service de géocodage GoogleMapsAPI
  if(document.getElementById('map')){ //'map'Exécutez si vous pouvez obtenir l'identifiant
    map = new google.maps.Map(document.getElementById('map'), { //'map'Obtenez l'identifiant et affichez la carte
      center: {lat: 35.6594666, lng: 139.7005536}, //Le premier endroit à afficher (cette fois, "Shibuya scramble intersection" est la valeur initiale)
      zoom: 15, //Taux d'agrandissement (peut être réglé de 1 à 21)
    });
  }else{ //'map'S'il n'y a pas d'identifiant
    map = new google.maps.Map(document.getElementById('show_map'), { //'show_map'Obtenez l'identifiant et affichez la carte
      center: {lat: gon.lat, lng: gon.lng}, //Utilisez la variable définie par le contrôleur comme valeur de latitude / longitude (la valeur est dans le DB)
      zoom: 15, //Taux d'agrandissement (peut être réglé de 1 à 21)
    });

    marker = new google.maps.Marker({ //Déposer un marqueur sur Google Map
      position:  {lat: gon.lat, lng: gon.lng}, //Décidez où déposer le marqueur (la valeur est dans le DB)
      map: map //Spécifiez la carte pour déposer le marqueur
    });
  }
}

function codeAddress(){ //Fonction de rappel
  let inputAddress = document.getElementById('address').value; //'address'Obtenez la valeur de l'id (valeur)

  geocoder.geocode( { 'address': inputAddress}, function(results, status) { //Passez l'adresse que vous souhaitez géocoder en argument
    if (status == 'OK') {
      let lat = results[0].geometry.location.lat(); //Latitude des résultats géocodés
      let lng = results[0].geometry.location.lng(); //Longitude du résultat géocodée
      let mark = {
          lat: lat, //latitude
          lng: lng  //longitude
      };
      map.setCenter(results[0].geometry.location); //Latitude / longitude de l'endroit le plus proche où vous souhaitez obtenir une adresse lisible
      let marker = new google.maps.Marker({
          map: map, //Spécifiez la carte pour déposer le marqueur
          position: results[0].geometry.location //Décidez où déposer le marqueur
      });
    } else {
      alert('Il n'y a pas eu de résultat correspondant');
    }
  });   
}

Pour la description ci-dessus, voir https://qiita.com/kanato4/items/f2f3f7accd880224616a J'ai été autorisé à faire référence.

À la fin

C'est tout! J'ai passé un temps considérable à créer une application utilisant l'API google pour la première fois, j'espère donc que cela sera utile pour les futurs chercheurs.

Recommended Posts

[Rails] google maps api Comment publier et afficher des informations cartographiques
[Rails] Comment afficher Google Map
Comment afficher la carte à l'aide de l'API Google Map (Android)
Afficher l'API Google Maps avec Rails et affichage des broches
[Rails] Comment afficher plusieurs marqueurs sur Google Map et afficher une bulle lorsque vous cliquez dessus
[Rails] Comment calculer la latitude et la longitude avec une grande précision à l'aide de l'API Geocoding et l'afficher sur Google Map
[Google Maps API] La carte n'est pas affichée et devient vide [Rails]
Essayez d'afficher la carte google et la carte géographique avec python
[Rails 6 / API Google Map] Publiez une adresse et définissez plusieurs marqueurs sur la carte
[Rails] Comment obtenir des informations de localisation à l'aide de l'API de géolocalisation
[Pour les débutants] Comment afficher des cartes et des champs de recherche à l'aide de l'API Javascript GoogleMap
Comment masquer la clé API Google Maps du HTML
Les débutants de l'API Google Maps et de l'API Twitter ont créé "Tweet Map"
Présentation de l'API Google Map avec rails
Comment afficher la résolution PDF et des informations détaillées sur Linux (pdfinfo)
[Ruby on Rails] Affichage et épinglage de GoolgeMAP à l'aide de l'API Google
[Affichage de la carte] Affichez une carte à partir de l'adresse enregistrée par l'utilisateur à l'aide de l'API JavaScript de Google Maps et de l'API de géocodage!
[Rails] Comment présenter Google Analytics [Facile]
[Rails] Description de l'API Google Maps lorsque la latitude et la longitude ne peuvent pas être enregistrées
[Rails] Affichage de Google Maps à l'aide de l'API Google Maps et recherche d'itinéraires entre plusieurs points
Comment utiliser l'API Google Cloud Translation
Comment utiliser OAuth et API de compte de service avec le client API Google pour python
Comment afficher des vidéos en ligne dans Google Colab
Enregistrement facile des livres avec l'API et Rails de Google Livres
[Python] Comment créer une matrice de corrélation et une carte thermique
Comment analyser avec Google Colaboratory à l'aide de l'API Kaggle
Comment publier un ticket depuis l'API Shogun
[Super facile! ] Comment afficher le contenu des dictionnaires et des listes incluant le japonais en Python
[Ruby on Rails] Google map plusieurs broches, bulles, liens
[Django] Affichage de la carte Google des données SIG et représentation graphique des paramètres
[Google Colab] Comment interrompre l'apprentissage, puis le reprendre
Afficher l'adresse saisie à l'aide de Rails gem'geocoder 'sur Google Map
Créez un modèle pour stocker les informations de l'API Google Livres pour une manipulation et des tests intuitifs
Comment utiliser Google Colaboratory
Comment mettre à jour automatiquement la description de l'App Store dans Google Spreadsheets et Fastlane
Comment afficher des formules en latex lors de l'utilisation de Sympy (> = 1.4) dans Google Colaboratory
Obtenez des conversions et des revenus avec l'API Google Analytics et faites un rapport à Slack
Comment obtenir des abonnés et des abonnés de Python à l'aide de l'API Mastodon
Comment utiliser Google Colaboratory et exemple d'utilisation (PyTorch × DCGAN)
Comment afficher les octets de la même manière en Java et Python
[Rails 6] Intégrez Google Map dans l'application et ajoutez un marqueur à l'adresse saisie. [Confirmation des détails]