
ç§ã®WebãµãŒãã¹ã®äžéšãšããŠã æ©è¡è ã®åããã·ãã¥ã¬ãŒãããããã« ããããã®åœ¢åŒã®ãã¹ã¿ãŒãã©ã³ãã€ã³ããŒãããããšãå¿é ããªããã°ãªããŸããã§ããã ç§ã¯ä»¥åã«CADãšããžãã¹ãããŠããªãã£ãã®ã§ããããã«äœãããã®ãââãèããŠã¿ãŠãã ãã-å³é¢ãç·ãå€è§åœ¢ã®å¥ã®åœ¢åŒãããã§äœãè€éã«ãªãã®ã§ããããïŒã ãããããã®éçšã§ãããã«ã¯ååãªè€éãããããããã€ãã®ãã¥ã¢ã³ã¹ã¯æ°äžçŽã®æ·±ããã䌞ã³ãå€ä»£ã®æŸèæã«éåžžã«äŒŒãŠããŸãããå€ãã®ããšã¯åœ¢åŒèªäœã®ä»æ§ã«å®éã«ã¯ææžåãããŠããŸããïŒããšãã°ããããã¯ãæ²ç·ã§ã®äœæ¥ïŒã ã©ãããããããã¯ã©ã®è£œå³å·¥ã«ãšã£ãŠãæããã§ãããšèããããŠããŸãããå¥ã®åéããæ¥ãŠããã®ãããªç¥èããªãå Žåã¯ã©ãã§ããïŒ
äžè¬çã«ãã«ããã®äžã«ã¯ãã°ãŒã°ã«ã§æ€çŽ¢ã§ããªãã£ãã¬ãŒããšè§£æ±ºçã®ãªã¹ãããããçå€äžãŸã§ã«å³é¢ãæ¡æããå¿ èŠããããŸããã
解決ãã¹ã課é¡
Javaã¢ããªã±ãŒã·ã§ã³ã§ã¯ãå°åºãã¹ã¿ãŒãã©ã³ã®ã€ã³ããŒããæ§æãããããå éšã®åçŽåãããGeoJSONè¡šçŸã«å€æããå¿ èŠããããŸããã åæã«ãå®å šãªæ å ±ãããããçš®é¡ã®ãšã³ãã£ãã£ã¯å¿ èŠãããŸããã§ãããã·ãã¥ã¬ãŒã·ã§ã³ã§äœ¿çšãããã®ã¯ãããã®äžéšã®ã¿ã§ãã ãã®ããããã®è³æã§ã¯ãDXFã®ãã¹ãŠã®æ©èœãšéèŠãªæè¡ãœãªã¥ãŒã·ã§ã³ãç¶²çŸ ããŠããããã§ã¯ãããŸããã ãããŠããªãDWGã§ã¯ãªãDXFãªã®ãïŒ ãããŠãããã«ã€ããŠä»¥äžã
ãã©ãŒãããéžæ
ããã§ã¯ãäž»ã«ãAutoCADãããã³ããã¡ã€ã«åœ¢åŒããšããèšèã«é¢é£ä»ããããŠãããã®ã¯äœã§ããïŒ ãããŠãããã¯DWGã§ãã ããšããšAutoDeskã«ãã£ãŠäœæããããã€ããªã¯ããŒãºåœ¢åŒãšãã®ä»æ§ã¯å ¬éãããŠããŸããã§ããããäžæã¯Open Design Allianceã«ãã£ãŠå ã«æ»ãããŸããã
ãããŠã倱æã®1ã€ç®ã¯æ¬¡ã®ãšããã§ãããã®åœ¢åŒã®çŸåšã®ç¡æå®è£ ã¯ãããŸããã äžè¬çã«ã
AutoDeskãããããæäœããããã®ã©ã€ãã©ãªããããŸãã ODAã«ãã£ãŠäœæããã人æ°ã®ããTeighaã©ã€ãã©ãªããããŸãã ãããŠ...ããã ãã§ãã äž¡æ¹ãšãæ¯æãããŠãããååã«æ¯æãããŠããŸãïŒç§ãã¡ã¯æ°çŸããã³æ°åãã«ã«ã€ããŠè©±ããŠããŸãïŒã ãµãããããªãã
ç¡æã®ãªãŒãã³ãœãŒã¹ãœãªã¥ãŒã·ã§ã³ãšããŠæšæºãå®è£ ããããšããè©Šã¿ãããã€ããããŸãã ããšãã°ã jdwglibã§ãã ãããããããã¯ãã¹ãŠ5ã10幎åã«æåŸã«æŽæ°ãããé·ãéæ»ãã§ããŸãã ãããŠãé²æ©ã¯ãŸã æ¢ãŸã£ãŠããããAutoCADã®æ°ããããŒãžã§ã³ã¯DWGã«æ°ããæ©èœãè¿œå ããŸãããã®çµæãææ°ããŒãžã§ã³ã®ãã¡ã€ã«ãèªããšãã倢ãšãä¿®æ£ããããã°ã®ãµããŒããšåžæã«å¥ããåããããšãã§ããŸãã
代æ¿æ段ã¯DXFã§ãã 人æ°ã¯ããå£ããŸãããåæã«ãã¹ãŠã®CADã·ã¹ãã ã§ãµããŒããããŠãããåœåã¯ãªãŒãã³ã§ãããããçè«çã«ã¯ããäžè¬çã§ãã
æåã«ã©ã€ãã©ãªãæ€çŽ¢ããã®ããã£ããããŸã-ç¹ã«Javaã§ã¯ã5幎åã®ææ°ãªãªãŒã¹ãæšãŠããããªããžããªãæ°žé ãèŠãæ²ãããã¥ãŒã¹ãäžåœãªæ¥œèŠ³äž»çŸ©ãšçŽæã«æºã¡ãåäžã®ã©ã€ããããžã§ã¯ãã¯ãããŸããã ãã ããDWGãšã¯ç°ãªãããã©ãŒãããèªäœã¯ããã»ã©ç©æ¥µçã«éçºãããŠããªããããããªãå€ãã©ã€ãã©ãªã§ãææ°ã®å³é¢ãéãããšãã§ããŸãã
ãã®çµæãKabejaã©ã€ãã©ãªãéžæããããã®æåŸã®ãªãªãŒã¹ã¯2011幎ã§ããã ä»å±ã®ãµã³ãã«ïŒDXFããSVGãžã®å€æïŒã䜿çšããŠãçŸåšã®ãã¹ãŠã®å³é¢ãã¡ã€ã«ãæ£ããéãããšã確èªãããã®åŸã€ã³ããŒããéå§ããŸããã Stackoverflowã®CADã®ç¬¬äžäººè ããã®DXFã®è§£æã«é¢ãã質åã«ã€ããŠããDXFã¯ã·ã³ãã«ã«èŠããŸãããå®éã«ã¯äœæ¥ã«ããããããŠããããšããã³ã¡ã³ããå°ããããŸããã
ã¬ã€ã€ãŒ
DXFå³é¢ã«ã¯ãäžé£ã®ã¬ã€ã€ãŒïŒã¬ã€ã€ãŒïŒãšãããã¯ïŒãããã¯ïŒãå«ãŸããŠããŸãã ããã«ã¯ä»ã®ãšã³ãã£ãã£ããããŸãããæãåçŽãªå Žåã«ãžãªã¡ããªã®åº§æšãåŒãè£ãããã«ããããã¯å¿ èŠãããŸããã

ã¬ã€ã€ãŒã®ãã¹ãŠã¯æããã§ãPhotoshopã®å Žåãšåãããã«æ©èœããŸãã ã¬ã€ã€ãŒã®ãªã³ãšãªããåãæ¿ããããã¬ã€ã€ãŒã®ããã©ã«ãã®ã°ã©ãã£ãã¯ã¹ãã©ã¡ãŒã¿ãŒãèšå®ãããã§ããŸãïŒã€ãŸããããšãã°ããã®ã¬ã€ã€ãŒã®ããã©ã«ãã§ã¯ãã¹ãŠã®ç·ã«ãã®ãããªå€ªããèšå®ã§ããŸãïŒã ç§ã®ã¿ã¹ã¯ã¯åº§æšãçµãã ããªã®ã§ã衚瀺ã®åé¡ã«ã¯å¯ŸåŠããŸããã§ããã
ããŠããã¹ãŠãã·ã³ãã«ã«æããŸããåã¬ã€ã€ãŒã«ã€ããŠãã¬ã€ã€ãŒã®ãªã¹ããå®è¡ããŸãããªããžã§ã¯ãã®ãªã¹ãã䜿çšããŠã座æšãå€æããŸãã ãã ãããã§ã«ããã§æåã®ã¬ãŒããèžãã§ããŸããCADã«è¡šç€ºããããã¡ã€ã«ã«å«ãŸããŠããäžé£ã®ã¬ã€ã€ãŒã¯åããã®ã§ã¯ãããŸãã ã çªç¶éè·¯ã®äžéšã倱ã£ãçç±ãé ãçããã ãããã¯NanoCADã«ãããŸãããç§ã®ãšã¯ã¹ããŒãã«ã¯ãããŸããã ãããã¬ãŒã«å ¥ããŸãã-Kabejaãè¿ãæ§é äœã«ããããŸããã ãã ãããµã³ãã«ãšãšãã«ãã¡ã€ã«å šäœããšã¯ã¹ããŒãããå Žåã¯ããã§ãã äžè¬ã«ããã¡ã€ã«å ã®ãšãã£ã¿ãŒã®1ã€ã®ã¬ã€ã€ãŒã¯ããlayerNameãããlayerName @ 1ããªã©ã®ååãæã€è€æ°ã®ã¬ã€ã€ãŒã§è¡šãããšãã§ããããšãå€æããŸããã ãªããããè¡ãããã©ãããæ¥ãã®ã-æªéã¯ãããç¥ã£ãŠããŸãããäºå®-ã¬ã€ã€ãŒã®ååãšå®å šã«äžèŽãããã®ãæ€çŽ¢ããïŒã©ã€ãã©ãªã³ãŒãæ§é ã§ãããååããŒã§Mapã«ã¬ã€ã€ãŒãä¿åããããšã瀺åããŸãïŒãã³ãã
ãããã¯
ãããã¯ã¯ãäžåºŠæç»ãããšè€æ°åæ¿å ¥ã§ãããã³ãã¬ãŒãã§ãã ãã®å ŽåãããŒã¹ãŠããããå€æŽãããšããã¹ãŠã®æ¿å ¥ãå€æŽãããŸãã 䟿å©ã«ã ããã«ã¯ãŒã«ãªã®ã¯ããããã¯ã«è€æ°ã®ã¬ã€ã€ãŒã®ãªããžã§ã¯ããå«ããããšãã§ããããšã§ãã ãã®å Žåãæ¿å ¥ã¯ããã€ãã®ã¬ã€ã€ãŒã«ãå±ããŸãã ãã®å Žåããããã¯ã«ã¯ä»ã®ãããã¯ã®æ¿å ¥ãå«ãŸããå ŽåããããŸãã ã€ãŸãããããŠã¹ã»ã¯ã·ã§ã³ããããã¯ãäœæããããããããããŠã¹ããããã¯ãäœæããŠãã«ãŒãã«æ°åæ¿å ¥ããããšãã§ããŸãã ãã®å Žåãæçµãªããžã§ã¯ãã«ã¯ãå ã®ãããã¯ã ãã§ãªããããã€ãã®ã¬ã€ã€ãŒïŒåå¥ã®å¡ãã€ã¶ããåå¥ã®èŒªéãåå¥ã®ç¹æ®ããŒã¯ïŒãå«ãŸããŸãã ãããã¯ãã¹ãŠãŠãŒã¶ãŒã®èŠ³ç¹ããèŠããšéåžžã«ã¯ãŒã«ã§ãããããã°ã©ããŒã«äœæ¥ãè¿œå ãããŸãã
ããã«ããããã¯ã¯1åã ãã§ãªããé·æ¹åœ¢ã®ãããªãã¯ã¹ã®åœ¢ã§ç¹°ãè¿ãæ¿å ¥ã§ããŸãã ãããè¡ãããã«ãæ¿å ¥ãªããžã§ã¯ãã«ã¯ãè¡æ°ãåæ°ãããã³ãããã®éã®è·é¢ãæã€ãã©ã¡ãŒã¿ãŒããããŸãã
ãã®çµæããããŸã§ã®æ¿å ¥åŠçã³ãŒãã¯æ¬¡ã®ããã«ãªããŸãã
for (int row = 0; row < insert.getRows(); ++row) { for (int col = 0; col < insert.getColumns(); ++col) { // , . AffineTransform transform = new AffineTransform(); transform.translate( insert.getPoint().getX() - (insert.getColumns() - col) * insert.getColumnSpacing() , insert.getPoint().getY() - (insert.getRows() - row) * insert.getRowSpacing()); transform.rotate(Math.toRadians(insert.getRotate())); transform.scale(insert.getScaleX(), insert.getScaleY()); // Feature , GeoJSON for (Feature f : block.features) { // , . Feature inserted = cloneFeatureWithTransform(f, transform); features.add(inserted); } } } return block.features.size();
ãã¡ã€ã«å ã®ãããã¯ãšã¬ã€ã€ãŒãé åºä»ããããŠããªãããšãç¥ãããšãéèŠã§ãã ã€ãŸããåŠçãããã¯ã¯ããŸã åŠçãããŠããªãå¥ã®ãããã¯ããã®æ¿å ¥ã§ã€ãŸããããšããããŸãã æ£çŽãªãšãããç§ã¯ããããªããšããµã€ã¯ã«ãäœãããšãã§ãããã©ããããããŠãã®å Žåã«äœãèµ·ãããããããŸããã
è¡
ç§ã®ä»äºã¯ãDXFãGeoJSONã«å€æããããšã§ãããã¹ãŠã®ã¿ã€ãã®ãžãªã¡ããªã¯ãç Žç·ãšå€è§åœ¢ã®ã¿ãèªèããå匧ãšæ²ç·ã¯èªèããŸããã
DXFã¯ãããŸããŸãªåç·ãªãã·ã§ã³ããµããŒãããŠããŸãã
- ãã§ã«2çš®é¡ã®ç Žç·-ããªã©ã€ã³ãšLWPolylineã ç§ã®åçŽãª2Då³é¢ã®å Žåããããã®éã«éãã¯ãããŸãã
- å匧ãããã«ã¯æ¥åãšå圢ã®2ã€ã®ã¿ã€ãã 幞ããªããšã«ãKabejaã¯ã©ã¹ã«ã¯æ¢ã«ãããã®ãã€ã³ãã®åº§æšãååŸããããã®æ¢è£œã®ã¡ãœããããããããå¿ èŠãªç²ŸåºŠã§ã¢ãŒã¯ãããªã©ã€ã³ã«å€æããããšã¯é£ãããããŸãã
- ã¹ãã©ã€ã³-ç¹°ãè¿ããŸãããã«ããžã£èªèº«ã¯ããªã©ã€ã³ã«å€æããæ¹æ³ãç¥ã£ãŠããŸã
- ã¡ããã©ç·åœ¢ã»ã°ã¡ã³ã
ãã¹ãŠãã·ã³ãã«ã«æããŸãããéããŸãã äžèŠåçŽãªããªã©ã€ã³ã¿ã€ãã§ãã2次æ²ç·ã衚瀺ããããã«äœ¿çšã§ããŸãïŒç Žç·ã ãã§ãªãïŒã ãããè¡ãã«ã¯ãé ç¹ãbulgeã«èšå®ã§ããŸãã ããã瀺ãããŠããå Žåã2ã€ã®é ç¹ã¯çŽç·ã§ã¯ãªãããããã®é ç¹ãééããåã®å匧ã§æ¥ç¶ããããã®äžå¿ã¯ããããšãã®ãã©ã¡ãŒã¿ãŒã§è¡šçŸã§ããŸãã

ããã¯ãåã®äžå¿ãç¹å®ã§ããã³ãŒãã§ãã
private Point getCenterByVerticesAndBulge(DXFVertex a, DXFVertex b, double bulge) { double norm = Math.sqrt(Math.pow(b.getX() - a.getX(), 2) + Math.pow(b.getY() - a.getY(), 2)); double s = norm / 2; double d = s * (1 - bulge * bulge) / (bulge * bulge); // "direction" double u = (b.getX() - a.getX()) / norm; double v = (b.getY() - a.getY()) / norm; //"center" double c1 = Math.signum(bulge) * -v * d + (a.getX() + b.getX()) / 2; double c2 = Math.signum(bulge) * u * d + (a.getY() + b.getY()) / 2; return new Point(c1, c2, 0); }
ç§ã¯é·ãéãããã®åŒ§ãããã£ãŠæŠããŸããããæçµçã«ç§ã¯åãåºãããããããªãã«ããŠãé ç¹ãçŽæ¥æ¥ç¶ããŸããã äžè¬çãªèšç»ã§ã¯ããã®ãããªå匧ã¯éåžžã亀差ç¹ã®è§ãäžžãããããã«äœ¿çšããããããããããå®å šã«ã¹ã³ã¢ãªã³ã°ããããšãã§ããŸã-ã·ãã¥ã¬ãŒã·ã§ã³ã®èŠ³ç¹ããã®éãã¯ãããã§ãã
å¡ãã€ã¶ã/ãããïŒãããïŒ
ããã¯ç§ã®ã·ãã¥ã¬ãŒã¿ãçŽæ¥åäœãããã®ã§ãã ãšãããããç§ã¯å»ºç©ãéè·¯ãçºé»æ©ãè©°ãç©ã§æ£ç¢ºã«æå®ããããšãèŠæ±ããŸãïŒããã§ãªããã°ãåã ã®ç·ã®ããã·ã¥ããã·ã¥ã®ã©ããå åŽã§ãã©ããå€åŽã§ãããã¯æ確ã§ã¯ãããŸããïŒã
ãããŠãããã«ããã¥ã¢ã³ã¹ããããŸãïŒ
- å¡ãã€ã¶ãã®å¢çç·ã¯ãç·ãªããžã§ã¯ãã®ä»»æã®çµã¿åããã«ããããšãã§ããŸãã å¢çç·ã®äžéšãå£ããŠãããããã€ãã®åŒ§ãæããŠãããããŸããŸãªç·åã ãã®ã»ã°ã¡ã³ããå£ãããšãã§ããŸã
- 1ã€ã®å¡ãã€ã¶ããªããžã§ã¯ãã«ã¯ãä»»æã®æ°ã®åãé¢ãããé åïŒããªãŽã³ã«å€éšå¢çã1ã€ãããªãä»ã®å€ãã®åœ¢åŒãšã¯ç°ãªããŸãïŒãå«ããããšãã§ããŸãã
- å¡ãã€ã¶ãã¯ç¹°ãè¿ããã¹ãããããšãã§ããŸããã€ãŸããç©Žå¡ãã€ã¶ãã®äžã«å¥ã®å¡ãã€ã¶ãããããããã«åã³ç©ŽããããDXFã®ãã¹ãŠã¯è€æ°ã®å¢çãæã€1ã€ã®HATCHãªããžã§ã¯ãã«ãã£ãŠæå®ãããŸãã
- å¡ãã€ã¶ããšãã®å¢çã®é¢ä¿ã«ã¯ããã«ãšããŸããã¯ãªãªãã·ã§ã³ããããŸãïŒåçãåç §ïŒãããããŸã§ã®ãšããç§ã«ã¯åºäŒã£ãŠããªããç¥ã«æè¬

äžè¬ã«ãå¡ãã€ã¶ãçšã®DXFãããå€éšãŸãã¯å éšããã©ã°ãä»ããäžé£ã®å¢çç·ãååŸããããããäžè¬çã«ã©ã®ããã«äœæãããGeoJSONã®ãããªããªãŽã³ã«æ²¿ã£ãŠããããåæ£ããæ¹æ³ãç解ããå¿ èŠããããŸãããã¹ãããããŸãã
ç§ã¯ããã€ãã®æ¹æ³ã§è¡ããŸããããåã¢ã«ãŽãªãºã ã«ã€ããŠããã®ã¢ã«ãŽãªãºã ãæ©èœããªãå³é¢ãããã«å ¥æããŸããã ããšãã°ãããã¯ããã«ãããŸãïŒãã¿ã®äœå® å°ã®éè·¯ãšç§éã®å³ããããã¯ãã¹ãŠæåéãéåžžã«è€éãªæ§é ãæã€HATCHãªããžã§ã¯ãã®ãã¢ã«ãã£ãŠå®çŸ©ãããäœããã®çç±ã§ãã¹ãŠã®å¢çãå€éšãšããŠããŒã¯ãããŠããŸãïŒã«ããžã£ã«ã¯äœããã®ãã°ããããšæããŠããŸãDXFãå€éšãšå€éšã®2ã€ã®åæ§ã®ãã©ã°ãããã«å®çŸ©ããæ¹æ³ã§ãããã©ã€ãã©ãªèªäœã«ã¯1ã€ãããããŸããïŒïŒ

ãã®çµæãåäœããå¯äžã®ã¢ã«ãŽãªãºã ã¯æ¬¡ã®ããã«ãªããŸãã
- å€åŽã®å¢çç·ããšã«ããªãŽã³ãäœæããŸã
- å€éšãŸãã¯å éšã®ã©ã¡ãã§ããŒã¯ãããŠãããã«é¢ä¿ãªããä»ã®ãã¹ãŠã®å¢çãæžç®ããŸã
- èããããåé¡ãä¿®æ£ããŸãïŒããªãŽã³ã空ã§ããããšãå€æãããç©Žãå€åŽã®èŒªéã®å¢çãè¶ããŠè¡ããããªãŽã³ãåæãããé åã«ã¯ã©ãã·ã¥ãããªã©ïŒ
3çªç®ã®ãã€ã³ãïŒããã³å®éã«æ¢ã«ã·ãã¥ã¬ãŒã·ã§ã³ã¢ã«ãŽãªãºã èªäœã®å éšã«ãããžãªã¡ããªãæäœããããïŒã§ã¯ãJTSã©ã€ãã©ãªã§ããJava Topology Suiteã䜿çšããŸããã ããã«ã¯ããããã¡ã®æ§ç¯ãªã©ã®æäœããååæšãªã©ã®ããŒã¿æ§é ãŸã§ããžãªã¡ããªãæäœããããã«å¿ èŠãªãã¹ãŠã®ããªããã£ããšæäœãéåžžã«å€ãå«ãŸããŠããŸãã
åå©
æŸèæã§ã§ããããšãã¹ãŠãèŠåŽããŠæ¯ããåŸãå¿ èŠãªDXFãµãã»ããã®ãµããŒããäœæããå³é¢ãã·ãã¥ã¬ãŒã¿ã«çŽæ¥ããŒãããŠããã¶ã€ããŒã®åŠæ ¡ã決å®ããããã«äœ¿çšã§ããŸããã ç§ã¯äžèšã®æ å ±ã®ã»ãšãã©ãæŠãã§2æ©ãŸã§NanoCADã®äžã«åº§ããªããã°ãªããªãã£ãããïŒåºåã§ã¯ãããŸããããããã¯ç§ãèŠã€ããå¯äžã®ç°¡åã«ã¢ã¯ã»ã¹ã§ããç¡æã§é«å質ã®DXFãšãã£ã¿ãŒã§ãããããåãLibreCADã¯æåã®å³é¢ãæ£ããéãããšãã§ããŸããã§ããïŒåœŒã«åŒãæž¡ãããŸããïŒãç§ããããhabrasocietyãšå ±æããããšã«ããŸãã-çªç¶ç§ã®çµéšã®ãã¹ãŠã誰ãã®æéãç¯çŽããŸãã
ãããã¯ããäžèšã®ã¹ã¯ãªãŒã³ã·ã§ããããã®é åã®ã¢ã«ãŽãªãºã ã®äºæž¬ã®ãããªãã®ã§ãïŒ

æãããªçµè«ã¯ãæ£ããè§åºŠã§ãã©ãã¯ãäœæããå¿ èŠã¯ãªãããå¿ èŠã®ãªãå¥åŠãªæ²ç·ãäœæããããšããå¿ èŠã¯ãªããšããããšã§ãã ãã®å°åã建èšããããšãã«ç§ã®äºæž¬ãå®çŸãããã©ãããæ°å¹ŽåŸã«èŠãŠã¿ãŸãããã
æäŸãããå°åºèšç»ã«ã€ããŠã¯ãå æ¬çãªå»ºç¯ããã³å»ºèšèšèšã¯ãŒã¯ã·ã§ããã®ãããã§