質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
Leaflet

Leafletは、Web上で地図を作成するためのJavaScriptライブラリ。人気のあるJavaScript地図ライブラリのうちの一つでオープンソースです。軽量でインタラクティブな地図を手軽に表示することができます。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Q&A

解決済

2回答

1023閲覧

javascript 半径にpixelではなく、mを用いたい

okiron9619

総合スコア5

Leaflet

Leafletは、Web上で地図を作成するためのJavaScriptライブラリ。人気のあるJavaScript地図ライブラリのうちの一つでオープンソースです。軽量でインタラクティブな地図を手軽に表示することができます。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

0グッド

1クリップ

投稿2020/09/29 05:35

編集2020/09/30 10:12

前提・実現したいこと

javascriptにて、geojsonデータからサークルを描画したいと考えています。
最終的には、geojsonのpropertiesにある半径(m)の数値をradiusに指定したいと考えています。

発生している問題・エラーメッセージ

L.CircleMarkerでは、半径はピクセルで指定する必要があるのですが、この半径をmで指定するために
どのようにすればいいか教えていただきたいです。
L.Circleでは、mで指定できるようです、、、

Lhankor_Mhy様に回答を頂いた後、該当ソースコードを変更→その後発生したエラー
Error: Invalid LatLng object: (35.0155833957335, NaN)

該当のソースコード

Lhankor_Mhy様に回答していただき、ソースコードを調整いたしました。

views_models.py(geojsonを形成しているpythonファイル)

1from math import cos, sqrt 2import numpy as np 3class NodeLatlngMapper: 4 """ノードマッパー""" 5 def as_dict(self, node1, node2): 6 def qick_distance(Lat1, Long1, Lat2, Long2): 7 #degreeからradianへ 8 Lat1 = np.deg2rad(Lat1) 9 Lat2 = np.deg2rad(Lat2) 10 Long1 = np.deg2rad(Long1) 11 Long2 = np.deg2rad(Long2) 12 x = Lat2 - Lat1 13 y = (Long2 - Long1) * cos((Lat2 + Lat1)*0.00872664626) 14 #戻り地はm 15 return 111.138 * sqrt(x*x + y*y) * 1000 16 return { 17 "type": "FeatureCollection", 18 "features": [ 19 { 20 "type": "Feature", 21 "properties": { 22 'node': { 23 'node_id': node1.node_id, 24 }, 25 'popupContent': 'これは'+ str(node1.node_id) + '番目です。', 26 "distance": qick_distance(node1.latlng.x,node1.latlng.y,node2.latlng.x,node2.latlng.y), 27 }, 28 "geometry": { 29 "type": "Point", 30 "coordinates": [node1.latlng.x,node1.latlng.y], 31 }, 32 }, 33 ]}

canvas.jsの一部

1 V.showNodesLayer = function(geojson) { 2var Marker = function(feature, latlng) { 3 return new L.Circle(latlng, { 4 radius: 3, 5 color: "#00ff00", 6 fillColor: '#00ff00', 7 fillOpacity: 0.2, 8 }) 9 }; 10 L.geoJson(geojson, {pointToLayer: Marker},).addTo(map).on( 'click', function(e) { clickEvt(e); }); 11 function onEachFeature(feature, layer) { 12 if (feature.properties && feature.properties.popupContent) { 13 layer.bindPopup(feature.properties.popupContent); 14 } 15 } 16 function clickEvt(e){ 17 alert('HelloWorld'); 18 } 19}

試したこと

mからpixelに変換する方法も試してみたのですが、上手くいきませんでした。

補足情報(FW/ツールのバージョンなど)

必要な情報が抜けているかもしれません。
こちらも教えていただけましたら幸いです。
マップのサイズは(縦,横:500pixel,500pixel)で描画しています。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Lhankor_Mhy

2020/09/29 06:17

ご自身で書かれているように、Circleであればメートルが使えると思いますが、何か不都合があるのですか?
miyabi_takatsuk

2020/09/29 06:41 編集

なぜ、mを指定したいのでしょうか? 画面上で実寸で表示したい、ということでしょうか?
Lhankor_Mhy

2020/09/29 07:21 編集

> miyabi_takatsukさん いや、たぶん、地図上のメートルだと思いますよ。
okiron9619

2020/09/29 08:46

Lhankor_Mhy様、miyabi_takatsuk様 返信遅れすみません。 m指定したい理由については、Lhankor_Mhy様の追記欄に書いていただいた通りです。。 geojsonデータ内の数値がmであるため、半径指定の際にもmにしたいと考えています。(地図上のメートルです。) L.Circleを用いる方法についても検討したのですが、自分の理解不足で、geojsonデータを用い且つL.Circleを用いる方法について分かりませんでした。 多々理解不足な点がありますが、教えた頂けましたら幸いです。
Lhankor_Mhy

2020/09/29 09:42

>geojsonデータを用い且つL.Circleを用いる方法について分かりませんでした。 ご提示のコードにはgeojsonの部分がありませんでしたが、つまり、ここに書かれていない問題があってCircleが利用できない、という理解で合っていますか?
okiron9619

2020/09/29 10:26

Lhankor_Mhy様 仰る通りです。geojsonを形成している部分のコードとjavascript全体について、修正いたしました。 posgresqlデータベースにある緯度経度とidの情報を用いて、python上でgeojsonデータを形成しています。 この時に、idとid+1の緯度経度を用い、距離をdistanceに格納しています。(単位はmです) Ajax通信を使い、python上のgeojsonデータをjavascriptにて扱っています。(V.showNodesLayer = function(geojson)の引数であるgeojsonに当たります) 返答していただいた内容でほぼあっていますが、おそらく自分の理解不足でL.Circle()が利用できないのではなく、利用方法がわからないのだと思います。
okiron9619

2020/09/29 10:27

すみません、日本語がおかしい記述がありますが、ご容赦ください。
Lhankor_Mhy

2020/09/29 10:34

手元の環境で、GeoJSONを読み込んで circle で書くコードを書いてみましたが、問題なく動作しました。 ドキュメントを見ても、CircleMarkerの子クラスと書いてあったので、使えないということはないと思うんですよね。 お試しになった時に、どのような問題が発生しましたか?
okiron9619

2020/09/29 11:08

Lhankor_Mhy様 不甲斐ないのですが、自分で調べた限りで、geojson用い、L.Circleメソッドを用いて、描画する方法を見つけることができませんでした。そのため、L.Circleを用いて描画してみること自体試していませんでした。(添付していただいたドキュメントは拝見済みでした) L.Circleであれば、半径にmを用いることができるため、一度以下のように記述して試してみたのですが上手くいかなかったため、断念していました。(書き方に問題あると思います。) var Marker = function(feature, latlng) { return new L.Circle(latlng, { radius: feature.properties.distance * 3, color: "#00ff00", fillColor: '#00ff00', fillOpacity: 0.2, }) }; 上記のコードの時に、出たエラーは Error: Invalid LatLng object: (35.0155833957335, NaN) leaflet.js:6:13842 というものです。 お手数ですが、記述方法を教えていただけましたら幸いです。
guest

回答2

0

ベストアンサー

試してみましたが、やはり問題なくL.circleで動作しますね。

サンプル

js

1var geojson = { 2 "type": "FeatureCollection", 3 "features": [ 4 { 5 "geometry": { 6 "type": "Point", 7 "coordinates": [ 8 139.70215,35.65831 // teratailを運営してくれているレバレジーズ様本社 9 ] 10 }, 11 "type": "Feature", 12 "properties": { 13 "distance": 20, 14 15 }, 16 }, 17]}; 18 19//... 20 21var Marker = function(feature, latlng) { 22 return new L.circle(latlng, { 23 radius: feature.properties.distance * 3, 24 color: "#00ff00", 25 fillColor: '#00ff00', 26 fillOpacity: 0.2, 27 }) 28 }; 29 L.geoJson(geojson, {pointToLayer: Marker},).addTo(map).on( 'click', function(e) { clickEvt(e); });

投稿2020/09/30 01:18

Lhankor_Mhy

総合スコア36960

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

okiron9619

2020/09/30 10:16

回答ありがとうございます。 質問文の変更を致しました。 変更後も先日と同じようなエラーが出ました。 Leafletのversionなどによる影響なのでしょうか、、、 一応ですが、leaflet-0.7.3を使用しています。
Lhankor_Mhy

2020/09/30 10:17

ずいぶん古いものを使ってますね……
Lhankor_Mhy

2020/09/30 10:18

バージョンを0.7.3に代えてみたところ、同じエラーが出ました。
okiron9619

2020/09/30 10:54

versionを変更したところ、エラーが消えました。ポイントによって、mの指定もできているかと思います。(詳しい数値の部分までは、まだわからないです) 丁寧に教えていただき、ありがとうございます。 一つ質問なのですが、l.Circleメソッドにて指定できる半径には、最小値なるものが存在するのでしょうか。(5m以上ではないと、描画できない、のような事を言いたいです。)
okiron9619

2020/10/02 06:18

やはりそうですよね。 丁寧且つ詳しい回答ありがとうございます。
guest

0

いやこの場合m指定の意味がないような...
もしかして画面の表示とgeojsonデータ内の単位で
表示結果で縮尺合わせようとか考えていますか?
1m = 100cm
1m / 100 = 1cm
画面で測ると1cm(1/100)とか?

投稿2020/09/29 05:41

kuma_kuma_

総合スコア2506

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問