前提・実現したいこと
Leafetを用いて、円を描画し、円をクリックした時に、各円の情報をアラートとして表示させたいです。
geojson形式の中に緯度経度や今回表示させたい情報(id)が格納されています。
pythonにてgeojsonデータを作成し、ajax通信を用い、javascript内にて扱っています。
■■な機能を実装中に以下のエラーメッセージが発生しました。
発生している問題・エラーメッセージ
クリックイベントの中にどのようにコードを書けばよいかわからない状況です。
function clickEvt(e){ alert('この部分が該当します'); }
該当のソースコード
connection.js(ajax通信部分)
1if (typeof C === 'undefined'){ 2 var C = {}; 3} 4/** 5 * 全ノードを取得する. 6 */ 7C.getAllNodeList = function() { 8 $.ajax({ 9 url: 'get_all_node_list/', 10 method: 'GET', 11 data: { 12 }, 13 timeout: 10000, 14 dataType: "json", 15 }).done(function(response) { 16 var nodeListGeojson = response; 17 V.showNodesLayer(nodeListGeojson); 18 }).fail(function(response) { 19 alert('Error!'); 20 }); 21}
canvas.js(マーカー描画部分)
1if (typeof V === 'undefined'){ 2 var V = {}; 3} 4 $('#index_page').ready(function() { 5 C.getAllNodeList(); 6 }); 7 if (typeof V === 'undefined'){ 8 var V = {}; 9 } 10 var map = L.map('map').setView([35.016689, 135.674900], 16); 11 12 var tileLayer = new L.tileLayer('https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png',{ 13 attribution: '© <a href="http://osm.org/copyright">OpenStreetMap</a> contributors, <a href="http://creativecommons.org/licenses/by-sa/2.0/">CC-BY-SA</a>', 14 maxZoom: 19 15 }); 16 tileLayer.addTo(map); 17 V.showNodesLayer = function(geojson) {//←'geojson'がpythonから受け取ったデータです。 18 var hidingMarker = function(feature, latlng) { 19 if(feature.properties.hide == 'true'){ 20 return new L.CircleMarker(latlng, { 21 radius: 30, 22 color: "#00ff00", 23 fillColor: '#00ff00', 24 fillOpacity: 0.2, 25 }) 26 } 27 }; 28 L.geoJson(geojson, {pointToLayer: hidingMarker},).addTo(map).on( 'click', function(e) { clickEvt(e); }); 29 function onEachFeature(feature, layer) { 30 if (feature.properties && feature.properties.popupContent) { 31 layer.bindPopup(feature.properties.popupContent); 32 } 33 } 34 L.geoJson(geojson, { 35 onEachFeature: onEachFeature 36 }).addTo(map); 37 function clickEvt(e){ 38 alert(); 39 } 40 41 }
views_models.py(geojsonデータの作成部分)の一部
1from math import cos, sqrt 2import numpy as np 3class NodeLatlngMapper: 4 """ノードマッパー""" 5 def as_dict(self, node1, node2): 6 return { 7 "type": "FeatureCollection", 8 "features": [ 9 { 10 "type": "Feature", 11 "properties": { 12 'node': { 13 'node_id': node1.node_id, 14 }, 15 'hide': 'true', 16 'popupContent': 'これは'+ str(node1.node_id) + '番目です。', 17 }, 18 "geometry": { 19 "type": "Point", 20 "coordinates": [node1.latlng.x,node1.latlng.y], 21 }, 22 }, 23 ]}
views.py
1from django.shortcuts import render, get_object_or_404 2from django.views.generic import View 3from .models import Mareas_Nodes_Latlng 4from .models import Mareas_Links_Nodes 5from .view_models import NodeLatlngMapper 6from .view_models import LinkNode 7from django.utils.decorators import method_decorator 8from django.http.response import HttpResponse 9import json 10class GetAllNodeListView(View): 11 ##@method_decorator(login_required()) 12 def get(self, request, *args, **kwargs): 13 # オブジェクトの取得 14 node_list = Mareas_Nodes_Latlng.objects.all().order_by('node_id') 15 # レスポンスの生成 16 features = [] 17 #features = [NodeLatlngMapper(node).as_dict() for node in node_list] 18 for node1, node2 in zip(node_list, node_list[1:]): 19 features.append(NodeLatlngMapper().as_dict(node1, node2)) 20 response = { 21 'features': features, 22 } 23 # レスポンス 24 response_json = json.dumps(response) 25 return HttpResponse(response_json, content_type='application/json') 26get_all_node_list = GetAllNodeListView.as_view()
from django.urls import path from . import views app_name = 'rsl_road' urlpatterns = [ path('', views.index, name='index'), path('get_all_node_list/', views.get_all_node_list, name='get_all_node_list'), ]
htmlコード(冗長部分があるかもしれません)
1index.html 2{% extends "base.html" %} 3{% load static %} 4{% block extra_css %}{% endblock %} 5{% block content %} 6{% endblock %} 7 8{% block extra_js %} 9{% endblock %} 10 11base.html 12<!doctype html> 13{% load static %} 14<html lang="ja"> 15<head> 16 <meta charset="utf-8"> 17 <title>{{ page_title }}</title> 18 {# --- css --- #} 19 <link rel="stylesheet" href="https://unpkg.com/leaflet@1.7.1/dist/leaflet.css" /> 20 <script src="https://unpkg.com/leaflet@1.7.1/dist/leaflet.js"></script> 21 <script src="http://code.jquery.com/jquery-latest.js"></script> 22 <link rel="stylesheet" href="{% static 'rsl_road/css/main.css' %}"> 23 {% block extra_css %}{% endblock %} 24</head> 25<body> 26 <div class="container"> 27 <div id="map"></div> 28 </div> 29 {% block content %}{% endblock %} 30 <script type="text/javascript" src="{% static 'rsl_road/js/canvas.js' %}"></script> 31 <script type="text/javascript" src="{% static 'rsl_road/js/connection.js' %}"></script> 32</body> 33</html>
試したこと
以下のコードを打つことで、クリックではありませんが、idの表示をすることはできました。
console.log(geojson.features[0].features[0].properties.node.node_id);
補足情報(FW/ツールのバージョンなど)
leaflet1.7.1を使用しています。(このversionではないといけない理由は特にありません)
python3.8,
LinuxMint,にて実行しています
必要な情報が抜けている可能性があります。教えていただけましたら幸いです。
回答1件
あなたの回答
tips
プレビュー