前提・実現したいこと
geojson形式のpropertiesのidに数値を加算し、緯度経度を反映する。
マップ上にリンクを表示しようとしています。
データベースには
link_id,start_node_id,end_node_id
1, 1, 2
2, 3, 4
3, 5, 6
……
node_id,latlng
1 | 0101000020E6100000DE1A27FC71F560409C84FFA2FE814140
2 | 0101000020E610000043C98E5F72F5604012AF29CF00824140
3 | 0101000020E610000036649C476EF560405E2C94D502824140
……
のように二つのテーブルがあります。
データベースの情報のみでは、全てのリンクがつながらず途切れ途切れになってしまいます。
そのため、途切れ途切れのリンクにともう一つリンクを用意(ソースコード部分)し、リンクをつなげようと考えています。
発生している問題・エラーメッセージ
一つ目の途切れ途切れのリンク {'link': {'link_id': 1, 'start_node_id': 1, 'end_node_id': 2}}, 'geometry': {'type': 'LineString', 'coordinates': [[135.670211581115, 35.0156496957335], [135.670164181115, 35.0155833957335]]}} 二つ目の途切れ途切れのリンク {'link': {'link_id': 1, 'start_node_id': 2, 'end_node_id': 3}}, 'geometry': {'type': 'LineString', 'coordinates': [[135.670211581115, 35.0156496957335], [135.670164181115, 35.0155833957335]]}} start_node_id,end_node_idに加算できているのですが、対応した緯度経度が反映されていない状況です。
該当のソースコード
修正前(投稿時)のソースコード
views.py class GetHalf1LinkListView(View): ##@method_decorator(login_required()) def get(self, request, *args, **kwargs): # オブジェクトの取得 link_list = Mareas_Links_Nodes.objects.all().order_by('link_id') # レスポンスの生成 features = [LinkNodeMapper1(link).as_dict() for link in link_list] print("hello") print(features) response = { 'features': features, } # レスポンス response_json = json.dumps(response) return HttpResponse(response_json, content_type='application/json') class GetHalf2LinkListView(View): ##@method_decorator(login_required()) def get(self, request, *args, **kwargs): # オブジェクトの取得 link_list = Mareas_Links_Nodes.objects.all().order_by('link_id') # レスポンスの生成 features = [LinkNodeMapper2(link).as_dict() for link in link_list] print(features) response = { 'features': features, } # レスポンス response_json = json.dumps(response) return HttpResponse(response_json, content_type='application/json') get_half1_link_list = GetHalf1LinkListView.as_view() get_half2_link_list = GetHalf2LinkListView.as_view() view_models.py class LinkNodeMapper1: """ノードマッパー""" def __init__(self, obj): self.obj = obj def as_dict(self): link = self.obj return { 'type': 'Feature', 'properties': { 'link': { 'link_id': link.link_id, 'start_node_id':link.end_node_id, 'end_node_id':link.start_node_id, }, }, 'geometry': { 'type': 'LineString', 'coordinates': [[link.start_node.latlng.x,link.start_node.latlng.y],[link.end_node.latlng.x,link.end_node.latlng.y]], }, } class LinkNodeMapper2: """ノードマッパー""" def __init__(self, obj): self.obj = obj def as_dict(self): link = self.obj return { 'type': 'Feature', 'properties': { 'link': { 'link_id': link2.link_id, 'start_node_id':link.end_node_id + 1, 'end_node_id':link.start_node_id + 1, }, }, 'geometry': { 'type': 'LineString', 'coordinates': [[link.end_node.latlng.x,link.end_node.latlng.y],[link.start_node.latlng.x,link.start_node.latlng.y]], }, }
toast_uz様に回答、説明を提示して頂いた後、修正したソースコード
views.py
1class LinkList(View): 2 ##@method_decorator(login_required()) 3 def get(self, request, *args, **kwargs): 4 # オブジェクトの取得 5 link_list = Mareas_Links_Nodes.objects.all().order_by('link_id') 6 # レスポンスの生成 7 # link_listから要素を2つずつ取り出す 8 features = [] 9 for link1, link2 in zip(link_list, link_list[1:]): 10 features.append(LinkNode().connectLinks(link1, link1)) 11 features.append(LinkNode().connectedLinks(link1, link2)) 12 #features.append(Mareas_Links_Nodes.objects.all().reverse()[0]) 13 print(features) 14 response = { 15 'features': features, 16 } 17 # レスポンス 18 response_json = json.dumps(response) 19 return HttpResponse(response_json, content_type='application/json')
views_models.py
1class LinkNode: 2 def connectLinks(self, link1, link2): 3 # 繋げられる方のリンク生成 4 return { 5 'type': 'Feature', 6 'properties': { 7 'link': { 8 'link_id': link1.link_id, 9 'start_node_id':link1.start_node_id, 10 'end_node_id':link1.end_node_id, 11 }, 12 }, 13 'geometry': { 14 'type': 'LineString', 15 'coordinates': [[link1.start_node.latlng.x,link1.start_node.latlng.y],[link2.end_node.latlng.x,link2.end_node.latlng.y]], 16 }, 17 } 18 def connectedLinks(self, link1, link2): 19 # 繋げる方のリンク生成 20 return { 21 'type': 'Feature', 22 'properties': { 23 'link': { 24 'link_id': link1.link_id, 25 'start_node_id':link1.start_node_id, 26 'end_node_id':link1.end_node_id, 27 }, 28 }, 29 'geometry': { 30 'type': 'LineString', 31 'coordinates': [[link1.end_node.latlng.x,link1.end_node.latlng.y],[link2.start_node.latlng.x,link2.start_node.latlng.y]], 32 }, 33 }
試したこと
link.start_node_id + 1 のように直接代入してみましたがエラーは出ず、緯度経度は反映されませんでした。
リサーチ不足かもしれないですが、自分の力では参考サイトを見つけることができませんでした。
補足情報(FW/ツールのバージョンなど)
初投稿のため、必要な情報が足りていないかもしれません。
回答2件
あなたの回答
tips
プレビュー