ツール:ERAlchemy2

15. ツール:ERAlchemy2#

pythonのeralchemyモジュールを使うと, SQLのshemaから直接ER図を作成できます。 ただeralchemyモジュールのメンテナンスが中断されている様で、sqlalchemyの最新バージョンでは ちょっとソースコードの修正が必要でした [1] 。eralchem2がforkされていて、いずれマージされそうです。 eralchemyのリンクで {1.N} などがつく場所が標準的な場所と逆転しているので、ersqlalchemy2 を使うのが良さそうです。

graph { graph [bb="0,0,1458,658.2", rankdir=LR ]; node [label="\N", shape=plaintext ]; edge [color=gray50, minlen=2, style=dashed ]; performedby [height=1.6333, label=<<FONT FACE="Arial;Helvetica Neue;Helvetica;"><TABLE BORDER="0" CELLBORDER="1" CELLPADDING="4" CELLSPACING="0"><TR><TD><B><FONT POINT-SIZE="16">performedby</FONT></B></TD></TR><TR><TD ALIGN="LEFT"><u><FONT>id</FONT></u> <FONT> [INTEGER]</FONT> NOT NULL</TD></TR><TR><TD ALIGN="LEFT"><FONT>name</FONT> <FONT> [VARCHAR]</FONT> NOT NULL</TD></TR><TR><TD ALIGN="LEFT"><FONT>type</FONT> <FONT> [VARCHAR]</FONT></TD></TR></TABLE></FONT>>, pos="95,261.4", width=2.6389]; artists [height=3.4944, label=<<FONT FACE="Arial;Helvetica Neue;Helvetica;"><TABLE BORDER="0" CELLBORDER="1" CELLPADDING="4" CELLSPACING="0"><TR><TD><B><FONT POINT-SIZE="16">artists</FONT></B></TD></TR><TR><TD ALIGN="LEFT"><u><FONT>id</FONT></u> <FONT> [INTEGER]</FONT> NOT NULL</TD></TR><TR><TD ALIGN="LEFT"><FONT>FamilyName</FONT> <FONT> [VARCHAR]</FONT></TD></TR><TR><TD ALIGN="LEFT"><FONT>FirstName</FONT> <FONT> [VARCHAR]</FONT></TD></TR><TR><TD ALIGN="LEFT"><FONT>MiddleName</FONT> <FONT> [VARCHAR]</FONT></TD></TR><TR><TD ALIGN="LEFT"><FONT>Na</FONT> <FONT> [VARCHAR]</FONT></TD></TR><TR><TD ALIGN="LEFT"><FONT>NickName</FONT> <FONT> [VARCHAR]</FONT></TD></TR><TR><TD ALIGN="LEFT"><FONT>Sei</FONT> <FONT> [VARCHAR]</FONT></TD></TR><TR><TD ALIGN="LEFT"><FONT>azana</FONT> <FONT> [VARCHAR]</FONT></TD></TR></TABLE></FONT>>, pos="350.5,532.4", width=2.4306]; performedby -- artists [head_lp="260.75,431.79", headlabel=<<FONT>1</FONT>>, pos="150.69,319.87 183.52,354.96 225.99,400.36 263.25,440.19", tail_lp="148.19,328.27", taillabel=<<FONT>1</FONT>>]; groups [height=1.2611, label=<<FONT FACE="Arial;Helvetica Neue;Helvetica;"><TABLE BORDER="0" CELLBORDER="1" CELLPADDING="4" CELLSPACING="0"><TR><TD><B><FONT POINT-SIZE="16">groups</FONT></B></TD></TR><TR><TD ALIGN="LEFT"><u><FONT>id</FONT></u> <FONT> [INTEGER]</FONT> NOT NULL</TD></TR><TR><TD ALIGN="LEFT"><FONT>date_from</FONT> <FONT> [DATETIME]</FONT></TD></TR></TABLE></FONT>>, pos="350.5,343.4", width=2.4306]; performedby -- groups [head_lp="260.84,323.93", headlabel=<<FONT>1</FONT>>, pos="189.67,291.7 213.79,299.5 239.63,307.86 263.34,315.53", tail_lp="192.17,283.3", taillabel=<<FONT>1</FONT>>]; tracks [height=3.1222, label=<<FONT FACE="Arial;Helvetica Neue;Helvetica;"><TABLE BORDER="0" CELLBORDER="1" CELLPADDING="4" CELLSPACING="0"><TR><TD><B><FONT POINT-SIZE="16">tracks</FONT></B></TD></TR><TR><TD ALIGN="LEFT"><u><FONT>id</FONT></u> <FONT> [INTEGER]</FONT> NOT NULL</TD></TR><TR><TD ALIGN="LEFT"><FONT>TrackTime</FONT> <FONT> [INTEGER]</FONT></TD></TR><TR><TD ALIGN="LEFT"><FONT>arranger_id</FONT> <FONT> [INTEGER]</FONT></TD></TR><TR><TD ALIGN="LEFT"><FONT>performer_id</FONT> <FONT> [INTEGER]</FONT></TD></TR><TR><TD ALIGN="LEFT"><FONT>recdate</FONT> <FONT> [DATETIME]</FONT></TD></TR><TR><TD ALIGN="LEFT"><FONT>revision</FONT> <FONT> [VARCHAR]</FONT></TD></TR><TR><TD ALIGN="LEFT"><FONT>song_id</FONT> <FONT> [INTEGER]</FONT></TD></TR></TABLE></FONT>>, pos="1075,261.4", width=2.5556]; performedby -- tracks [head_lp="971.11,261.94", headlabel=<<FONT>0..N</FONT>>, pos="189.9,253.33 237.69,252.4 296.69,252.4 349.5,252.4 349.5,252.4 349.5,252.4 798.5,252.4 860.08,252.4 929.4,252.4 983.11,253.54", tail_lp="204.9,244.93", taillabel=<<FONT>{0,1}</FONT>>]; performedby -- tracks [head_lp="971.11,277.66", headlabel=<<FONT>0..N</FONT>>, pos="189.9,269.47 237.69,270.4 296.69,270.4 349.5,270.4 349.5,270.4 349.5,270.4 798.5,270.4 860.08,270.4 929.4,270.4 983.11,269.26", tail_lp="204.9,261.07", taillabel=<<FONT>{0,1}</FONT>>]; albums [height=3.1222, label=<<FONT FACE="Arial;Helvetica Neue;Helvetica;"><TABLE BORDER="0" CELLBORDER="1" CELLPADDING="4" CELLSPACING="0"><TR><TD><B><FONT POINT-SIZE="16">albums</FONT></B></TD></TR><TR><TD ALIGN="LEFT"><u><FONT>id</FONT></u> <FONT> [INTEGER]</FONT> NOT NULL</TD></TR><TR><TD ALIGN="LEFT"><FONT>artist_id</FONT> <FONT> [INTEGER]</FONT></TD></TR><TR><TD ALIGN="LEFT"><FONT>company</FONT> <FONT> [VARCHAR]</FONT></TD></TR><TR><TD ALIGN="LEFT"><FONT>genre</FONT> <FONT> [VARCHAR]</FONT></TD></TR><TR><TD ALIGN="LEFT"><FONT>price</FONT> <FONT> [INTEGER]</FONT></TD></TR><TR><TD ALIGN="LEFT"><FONT>title</FONT> <FONT> [VARCHAR]</FONT></TD></TR><TR><TD ALIGN="LEFT"><FONT>year</FONT> <FONT> [DATETIME]</FONT></TD></TR></TABLE></FONT>>, pos="561.5,112.4", width=2.4306]; performedby -- albums [head_lp="462.09,131.72", headlabel=<<FONT>0..N</FONT>>, pos="190,231.25 273.11,204.59 393.35,166.02 474.09,140.12", tail_lp="205,222.85", taillabel=<<FONT>{0,1}</FONT>>]; groupmembers [height=1.2611, label=<<FONT FACE="Arial;Helvetica Neue;Helvetica;"><TABLE BORDER="0" CELLBORDER="1" CELLPADDING="4" CELLSPACING="0"><TR><TD><B><FONT POINT-SIZE="16">groupmembers</FONT></B></TD></TR><TR><TD ALIGN="LEFT"><u><FONT>artist_id</FONT></u> <FONT> [INTEGER]</FONT> NOT NULL</TD></TR><TR><TD ALIGN="LEFT"><u><FONT>group_id</FONT></u> <FONT> [INTEGER]</FONT> NOT NULL</TD></TR></TABLE></FONT>>, pos="797.5,373.4", width=3.125]; artists -- groupmembers [head_lp="673.08,421.61", headlabel=<<FONT>0..N</FONT>>, pos="437.83,501.55 508.35,476.36 608.51,440.57 685.08,413.21", tail_lp="440.33,493.15", taillabel=<<FONT>1</FONT>>]; songs [height=2.3778, label=<<FONT FACE="Arial;Helvetica Neue;Helvetica;"><TABLE BORDER="0" CELLBORDER="1" CELLPADDING="4" CELLSPACING="0"><TR><TD><B><FONT POINT-SIZE="16">songs</FONT></B></TD></TR><TR><TD ALIGN="LEFT"><u><FONT>id</FONT></u> <FONT> [INTEGER]</FONT> NOT NULL</TD></TR><TR><TD ALIGN="LEFT"><FONT>composer_id</FONT> <FONT> [INTEGER]</FONT></TD></TR><TR><TD ALIGN="LEFT"><FONT>lyricwriter_id</FONT> <FONT> [INTEGER]</FONT></TD></TR><TR><TD ALIGN="LEFT"><FONT>releasedate</FONT> <FONT> [DATETIME]</FONT></TD></TR><TR><TD ALIGN="LEFT"><FONT>title</FONT> <FONT> [VARCHAR]</FONT> NOT NULL</TD></TR></TABLE></FONT>>, pos="797.5,532.4", width=2.75]; artists -- songs [head_lp="686.8,518.3", headlabel=<<FONT>0..N</FONT>>, pos="437.83,526.93 512.64,525.3 620.83,525.23 698.8,526.7", tail_lp="452.83,518.53", taillabel=<<FONT>{0,1}</FONT>>]; artists -- songs [head_lp="686.8,546.5", headlabel=<<FONT>0..N</FONT>>, pos="437.83,537.87 512.64,539.5 620.83,539.57 698.8,538.1", tail_lp="452.83,546.27", taillabel=<<FONT>{0,1}</FONT>>]; groups -- groupmembers [head_lp="673.08,357.49", headlabel=<<FONT>0..N</FONT>>, pos="437.83,349.22 508.35,353.97 608.51,360.73 685.08,365.89", tail_lp="440.33,340.82", taillabel=<<FONT>1</FONT>>]; tracklists [height=1.2611, label=<<FONT FACE="Arial;Helvetica Neue;Helvetica;"><TABLE BORDER="0" CELLBORDER="1" CELLPADDING="4" CELLSPACING="0"><TR><TD><B><FONT POINT-SIZE="16">tracklists</FONT></B></TD></TR><TR><TD ALIGN="LEFT"><u><FONT>album_id</FONT></u> <FONT> [INTEGER]</FONT> NOT NULL</TD></TR><TR><TD ALIGN="LEFT"><u><FONT>track_id</FONT></u> <FONT> [INTEGER]</FONT> NOT NULL</TD></TR></TABLE></FONT>>, pos="1349,136.4", width=3.0278]; tracks -- tracklists [head_lp="1237.7,189.99", headlabel=<<FONT>0..N</FONT>>, pos="1167,219.6 1193.5,207.4 1222.7,194 1249.7,181.59", tail_lp="1169.5,211.2", taillabel=<<FONT>1</FONT>>]; albums -- tracklists [head_lp="1228.2,133.8", headlabel=<<FONT>0..N</FONT>>, pos="648.93,114.17 726.66,115.61 843.96,117.4 946,117.4 946,117.4 946,117.4 1076,117.4 1130.2,117.4 1190.3,121.2 1240.2,125.4", tail_lp="651.43,105.77", taillabel=<<FONT>1</FONT>>]; songs -- tracks [head_lp="971.07,346.22", headlabel=<<FONT>0..N</FONT>>, pos="889.73,447 896.62,440.4 903.44,433.81 910,427.4 933.91,404.05 959.45,378.51 983.07,354.62", tail_lp="874.73,438.6", taillabel=<<FONT>{0,1}</FONT>>]; }

図 15.1 ERAlchemy2で作成したER図(dot)をsphinx-graphvizで表示(graphviz ディレクティブ)#

@startuml
title Translated from .gv file to .puml by hand

entity albums {
    *id  : INTEGER
    --
    artist_id  : INTEGER
    company  : VARCHAR
    genre  : VARCHAR
    price  : INTEGER
    title  : VARCHAR
    year  : DATETIME
    }
    
entity performedby {
    *id  : INTEGER
    --
    name  : VARCHAR
    type  : VARCHAR
    }
    
entity artists {
    *id  : INTEGER
    --
    FamilyName  : VARCHAR
    FirstName  : VARCHAR
    MiddleName  : VARCHAR
    Na  : VARCHAR
    NickName  : VARCHAR
    Sei  : VARCHAR
    azana  : VARCHAR
    }
    
entity groupmembers {
    *artist_id  : INTEGER
    --
    *group_id  : INTEGER
    }
    
entity groups {
    *id  : INTEGER
    --
    date_from  : DATETIME
    }
    
entity songs {
    *id  : INTEGER
    --
    composer_id  : INTEGER
    lyricwriter_id  : INTEGER
    releasedate  : DATETIME
    title  : VARCHAR
    }
    
entity tracklists {
    *album_id  : INTEGER
    --
    *track_id  : INTEGER
    }
    
entity tracks {
    *id  : INTEGER
    --
    TrackTime  : INTEGER
    arranger_id  : INTEGER
    performer_id  : INTEGER
    recdate  : DATETIME
    revision  : VARCHAR
    * song_id  : INTEGER
    }
    
artists     |o-o{ songs
artists     |o-o{ songs
artists     ||--o{ groupmembers
groups      ||--o{ groupmembers
performedby |o--o{ albums
performedby |o--o{ tracks
performedby |o--o{ tracks
performedby ||--|| artists
performedby ||--|| groups
songs       |o-o{ tracks
albums      ||--o{ tracklists
tracks      ||--o{ tracklists

@enduml

図 15.2 ERAlchemy2で作成したER図(erd)をPlantUMLに(手作業で)書き換える。#

リスト 15.1 eralchemy2で作成した erd ファイル#
[performedby]
    *id {label:"INTEGER"}
    name {label:"VARCHAR"}
    type {label:"VARCHAR"}
[groupmembers]
    *artist_id {label:"INTEGER"}
    *group_id {label:"INTEGER"}
[artists]
    *id {label:"INTEGER"}
    FamilyName {label:"VARCHAR"}
    FirstName {label:"VARCHAR"}
    MiddleName {label:"VARCHAR"}
    Na {label:"VARCHAR"}
    NickName {label:"VARCHAR"}
    Sei {label:"VARCHAR"}
    azana {label:"VARCHAR"}
[groups]
    *id {label:"INTEGER"}
    date_from {label:"DATETIME"}
[songs]
    *id {label:"INTEGER"}
    composer_id {label:"INTEGER"}
    lyricwriter_id {label:"INTEGER"}
    releasedate {label:"DATETIME"}
    title {label:"VARCHAR"}
[tracklists]
    *album_id {label:"INTEGER"}
    *track_id {label:"INTEGER"}
[tracks]
    *id {label:"INTEGER"}
    TrackTime {label:"INTEGER"}
    arranger_id {label:"INTEGER"}
    performer_id {label:"INTEGER"}
    recdate {label:"DATETIME"}
    revision {label:"VARCHAR"}
    song_id {label:"INTEGER"}
[albums]
    *id {label:"INTEGER"}
    artist_id {label:"INTEGER"}
    company {label:"VARCHAR"}
    genre {label:"VARCHAR"}
    price {label:"INTEGER"}
    title {label:"VARCHAR"}
    year {label:"DATETIME"}

artists 1--* groupmembers
groups 1--* groupmembers
performedby 1--1 artists
performedby 1--1 groups
artists ?--* songs
artists ?--* songs
tracks 1--* tracklists
albums 1--* tracklists
performedby ?--* tracks
performedby ?--* tracks
songs ?--* tracks
performedby ?--* albums
リスト 15.2 eralchemy2で作成した erd ファイルを手作業で書き換えたpumlファイル(IE記法)#
@startuml
title Translated from .gv file to .puml by hand

entity albums {
    *id  : INTEGER
    --
    artist_id  : INTEGER
    company  : VARCHAR
    genre  : VARCHAR
    price  : INTEGER
    title  : VARCHAR
    year  : DATETIME
    }
    
entity performedby {
    *id  : INTEGER
    --
    name  : VARCHAR
    type  : VARCHAR
    }
    
entity artists {
    *id  : INTEGER
    --
    FamilyName  : VARCHAR
    FirstName  : VARCHAR
    MiddleName  : VARCHAR
    Na  : VARCHAR
    NickName  : VARCHAR
    Sei  : VARCHAR
    azana  : VARCHAR
    }
    
entity groupmembers {
    *artist_id  : INTEGER
    --
    *group_id  : INTEGER
    }
    
entity groups {
    *id  : INTEGER
    --
    date_from  : DATETIME
    }
    
entity songs {
    *id  : INTEGER
    --
    composer_id  : INTEGER
    lyricwriter_id  : INTEGER
    releasedate  : DATETIME
    title  : VARCHAR
    }
    
entity tracklists {
    *album_id  : INTEGER
    --
    *track_id  : INTEGER
    }
    
entity tracks {
    *id  : INTEGER
    --
    TrackTime  : INTEGER
    arranger_id  : INTEGER
    performer_id  : INTEGER
    recdate  : DATETIME
    revision  : VARCHAR
    * song_id  : INTEGER
    }
    
artists     |o-o{ songs
artists     |o-o{ songs
artists     ||--o{ groupmembers
groups      ||--o{ groupmembers
performedby |o--o{ albums
performedby |o--o{ tracks
performedby |o--o{ tracks
performedby ||--|| artists
performedby ||--|| groups
songs       |o-o{ tracks
albums      ||--o{ tracklists
tracks      ||--o{ tracklists

@enduml
_images/SongsDB_ER2.png

図 15.3 ERAlchemy2で作成したER図(png)#

_images/Songs.db.png

図 15.4 DBeaverから書き出したER図(IDEF1X記法)#

15.1. 改良版eralchemy2#

オリジナルのeralchemy2はPlantUMLに対応していません。しかし、PlantUMLに対応した改良版eralchemyが githubに 投稿 されています。

このバージョンで出力のファイル拡張子を".puml", ".uml", ".pu" のいずれかにすると、PlantUMLのインプットが生成されます。

図 12.2 のデータベースを実際に構築し、そのデータベースのER図を eralchemy2とplantUMLで作成してみました。

N対MのリレーションはそのままではRDBに実装できませんので、リンクテーブル course_takerを作成しています。

@startuml
entity  institute{
 * name : VARCHAR NOT NULL
--
}
entity  course_taker{
 * course_id : INTEGER NOT NULL
--
   * student : VARCHAR NOT NULL
--
    grade : INTEGER
}
entity  student{
 * institute : VARCHAR NOT NULL
--
   * name : VARCHAR NOT NULL
--
    grade : INTEGER
    number : INTEGER
}
entity  course{
 * id : INTEGER NOT NULL
--
    code : VARCHAR
    institute : VARCHAR NOT NULL
    name : VARCHAR NOT NULL
}
student  ||--o{ course_taker
course  ||--o{ course_taker
institute  ||--o{ student
institute  ||--o{ course
footer [[https://www.plantuml.com/plantuml/svg/VP1D2i8m48NtESMiXLp0NP6YGebGgbkfPf0WJI4_2sbxTsEIsXRIxf9vyzutCoYDC1y08RLxM8CTWHt8ka7Omoqh3wUi17QfW5sBWb1A1eBHycojqdWtzHkLTyM2uCvwPbL-p9TM0DUaZUKkOINTjS1BrHodY1anUZtiF_1wqkOUATAl9ctpG9N4X_q2VMD7ryTdL5_QdDPZLoOTo7Wmw7jAssvnTX8-QMrYZdACIYZ1-0K={link to PlantUML server} Link to PlantUML server]]
@enduml

DBeaverで表示されるおなじデータベースのER図がこちらです。

_images/Classes_ER_DBeaver.png

この章で先ほど紹介した SongsDBのeralchemy2で作成したER図はこちらです。位置の調整は行っていません。

@startuml
title generated by ERALCHEMY2
entity  albums{
 * id : INTEGER NOT NULL
--
    artist_id : INTEGER
    company : VARCHAR
    genre : VARCHAR
    price : INTEGER
    title : VARCHAR
    year : DATETIME
}
entity  performedby{
 * id : INTEGER NOT NULL
--
    name : VARCHAR NOT NULL
    type : VARCHAR
}
entity  artists{
 * id : INTEGER NOT NULL
--
    FamilyName : VARCHAR
    FirstName : VARCHAR
    MiddleName : VARCHAR
    Na : VARCHAR
    NickName : VARCHAR
    Sei : VARCHAR
    azana : VARCHAR
}
entity  groupmembers{
 * artist_id : INTEGER NOT NULL
--
   * group_id : INTEGER NOT NULL
--
}
entity  groups{
 * id : INTEGER NOT NULL
--
    date_from : DATETIME
}
entity  songs{
 * id : INTEGER NOT NULL
--
    composer_id : INTEGER
    lyricwriter_id : INTEGER
    releasedate : DATETIME
    title : VARCHAR NOT NULL
}
entity  tracklists{
 * album_id : INTEGER NOT NULL
--
   * track_id : INTEGER NOT NULL
--
}
entity  tracks{
 * id : INTEGER NOT NULL
--
    TrackTime : INTEGER
    arranger_id : INTEGER
    performer_id : INTEGER
    recdate : DATETIME
    revision : VARCHAR
    song_id : INTEGER
}
performedby  |o--o{ albums
performedby  ||--|| artists
artists  ||--o{ groupmembers
groups  ||--o{ groupmembers
performedby  ||--|| groups
artists  |o--o{ songs
artists  |o--o{ songs
albums  ||--o{ tracklists
tracks  ||--o{ tracklists
performedby  |o--o{ tracks
performedby  |o--o{ tracks
songs  |o--o{ tracks
footer [[https://www.plantuml.com/plantuml/png/ZLJBRi8m4BpxAtn6ogN7tX1D2nAa4aqhzOISP8aiOZlQc5OfuT-Rs422SMcuH9fPx-nZ5irr0JG72SWqP3IfQRYUBcVpSFNvG2X8pNLDAIkIlQWEX4uep-WZNKHn-1AkQVGQq-XzkIH1413Q_XXgNkdDCCZWgH8batMBVapNi_dKegqkWeELo5DmNcjJvNLS3GnRw6aQX_5Y5P8ZEHTR0cuL2iYIUaJ5aeb1wfutkdKvbEqbR9jZ1lBC12_gw4h44XmhxS5NFCiAy10HSm6UxZnnRy0TXFqmoRnzvAZsfG2H0DfcFFkxwMbYdzq9SWJ6p2bhxRVPeXB-dLPAvcFIT3vJ5U2j0ukwDTOtSkqZ4GfW5NH53FKztkib--8qidHNN0nXZkM_4PeteqPe8iVq7dU1CHVkzJ149dDVs-TByKuazKq3uOjNN4d7OTrwhdCSoU0CAMrK4AZ3wN_4ePeWQ9hpIP7Jr-Bjaw55YRMJd_CbjV63dBOCuwQ_K5FYHQBVBR6By36-LctqFSheEU0l{link to PlantUML server} Link to PlantUML server]]
@enduml

図 15.5 改良版ersqlalchemy2で生成したPlantUMLのER図#

15.1.1. image map#

eralchemy2で作成した図には、リンクが表示されています。pngファイルと同時に生成される .cmapx ファイルを利用することで、 HTMLのイメージ マップとして動作させることが可能です。 以下の例では同じER図をplantUMLサーバーを使ってブラウザ上に表示します。 PlantUMLでsvgを作成して、クリック可能なwebページとすることも可能ですね。

<img src="_images/Classes_ER2_UML.png" USEMAP="#Classes_ER2_UML_map" />
<map id="Classes_ER2_UML_map" name="Classes_ER2_UML_map">
<area shape="rect" id="id1" href="https://www.plantuml.com/plantuml/svg/IyqhoIofL538p2i6CafBKgkv5BGKyX9pKnMi5C8SWvmz78CK_Fn35Fn2VNouT7MvQhbIeLgIyqkBYbFZInApKul0ka02oRZqAIW0LHINbAO0jUDMef1Ub9W2CiBJByJLtJK8oJgeNaBkmsO8I0pkGMpwG0hoIdEJKekmMWtnAJ4s9-UJPd4j5yHi1OMQ6btT_6gKGEM21HTMIOIvC6ceSYmo48q0" title="link to PlantUML server" alt="" coords="181,416,295,428"/>
</map>