-
Notifications
You must be signed in to change notification settings - Fork 0
/
index.html
225 lines (217 loc) · 77.9 KB
/
index.html
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
<!doctype html>
<html>
<head>
<meta charset='UTF-8'><meta name='viewport' content='width=device-width initial-scale=1'>
<title>Truck Simulator Concept Maps</title><link href='http://fonts.googleapis.com/css?family=Open+Sans:400italic,700italic,700,400&subset=latin,latin-ext' rel='stylesheet' type='text/css' /><style type='text/css'>html {overflow-x: initial !important;}:root { --bg-color: #ffffff; --text-color: #333333; --code-block-bg-color: inherit; }
html { font-size: 14px; background-color: var(--bg-color); color: var(--text-color); font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; -webkit-font-smoothing: antialiased; }
body { margin: 0px; padding: 0px; height: auto; bottom: 0px; top: 0px; left: 0px; right: 0px; font-size: 1rem; line-height: 1.42857; overflow-x: hidden; background: inherit; }
a:active, a:hover { outline: 0px; }
.in-text-selection, ::selection { background: rgb(181, 214, 252); text-shadow: none; }
#write { margin: 0px auto; height: auto; width: inherit; word-break: normal; word-wrap: break-word; position: relative; padding-bottom: 70px; white-space: pre-wrap; overflow-x: visible; }
.for-image #write { padding-left: 8px; padding-right: 8px; }
body.typora-export { padding-left: 30px; padding-right: 30px; }
@media screen and (max-width: 500px) {
body.typora-export { padding-left: 0px; padding-right: 0px; }
.CodeMirror-sizer { margin-left: 0px !important; }
.CodeMirror-gutters { display: none !important; }
}
.typora-export #write { margin: 0px auto; }
#write > p:first-child, #write > ul:first-child, #write > ol:first-child, #write > pre:first-child, #write > blockquote:first-child, #write > div:first-child, #write > table:first-child { margin-top: 30px; }
#write li > table:first-child { margin-top: -20px; }
img { max-width: 100%; vertical-align: middle; }
input, button, select, textarea { color: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; font-size: inherit; line-height: inherit; font-family: inherit; }
input[type="checkbox"], input[type="radio"] { line-height: normal; padding: 0px; }
::before, ::after, * { box-sizing: border-box; }
#write p, #write h1, #write h2, #write h3, #write h4, #write h5, #write h6, #write div, #write pre { width: inherit; }
#write p, #write h1, #write h2, #write h3, #write h4, #write h5, #write h6 { position: relative; }
h1 { font-size: 2rem; }
h2 { font-size: 1.8rem; }
h3 { font-size: 1.6rem; }
h4 { font-size: 1.4rem; }
h5 { font-size: 1.2rem; }
h6 { font-size: 1rem; }
p { -webkit-margin-before: 1rem; -webkit-margin-after: 1rem; -webkit-margin-start: 0px; -webkit-margin-end: 0px; }
.typora-export p { white-space: normal; }
.mathjax-block { margin-top: 0px; margin-bottom: 0px; -webkit-margin-before: 0rem; -webkit-margin-after: 0rem; }
.hidden { display: none; }
.md-blockmeta { color: rgb(204, 204, 204); font-weight: bold; font-style: italic; }
a { cursor: pointer; }
sup.md-footnote { padding: 2px 4px; background-color: rgba(238, 238, 238, 0.7); color: rgb(85, 85, 85); border-radius: 4px; }
#write input[type="checkbox"] { cursor: pointer; width: inherit; height: inherit; margin: 4px 0px 0px; }
figure { max-width: 100%; overflow-x: auto; margin: 0px; }
tr { break-inside: avoid; break-after: auto; }
thead { display: table-header-group; }
table { border-collapse: collapse; border-spacing: 0px; width: 100%; overflow: auto; break-inside: auto; text-align: left; }
table.md-table td { min-width: 80px; }
.CodeMirror-gutters { border-right: 0px; background-color: inherit; }
.CodeMirror { text-align: left; }
.CodeMirror-placeholder { opacity: 0.3; }
.CodeMirror pre { padding: 0px 4px; }
.CodeMirror-lines { padding: 0px; }
div.hr:focus { cursor: none; }
pre { white-space: pre-wrap; }
.CodeMirror-gutters { margin-right: 4px; }
.md-fences { font-size: 0.9rem; display: block; break-inside: avoid; text-align: left; overflow: visible; white-space: pre; background: var(--code-block-bg-color); position: relative !important; }
.md-diagram-panel { width: 100%; margin-top: 10px; text-align: center; padding-top: 0px; padding-bottom: 8px; overflow-x: auto; }
.md-fences .CodeMirror.CodeMirror-wrap { top: -1.6em; margin-bottom: -1.6em; }
.md-fences.mock-cm { white-space: pre-wrap; }
.show-fences-line-number .md-fences { padding-left: 0px; }
.show-fences-line-number .md-fences.mock-cm { padding-left: 40px; }
.CodeMirror-line { break-inside: avoid; }
.footnotes { opacity: 0.8; font-size: 0.9rem; padding-top: 1em; padding-bottom: 1em; }
.footnotes + .footnotes { margin-top: -1em; }
.md-reset { margin: 0px; padding: 0px; border: 0px; outline: 0px; vertical-align: top; background: transparent; text-decoration: none; text-shadow: none; float: none; position: static; width: auto; height: auto; white-space: nowrap; cursor: inherit; -webkit-tap-highlight-color: transparent; line-height: normal; font-weight: normal; text-align: left; box-sizing: content-box; direction: ltr; }
li div { padding-top: 0px; }
blockquote { margin: 1rem 0px; }
li p, li .mathjax-block { margin: 0.5rem 0px; }
li { margin: 0px; position: relative; }
blockquote > :last-child { margin-bottom: 0px; }
blockquote > :first-child { margin-top: 0px; }
.footnotes-area { color: rgb(136, 136, 136); margin-top: 0.714rem; padding-bottom: 0.143rem; }
@media print {
html, body { border: 1px solid transparent; height: 99%; break-after: avoid; break-before: avoid; }
.typora-export * { -webkit-print-color-adjust: exact; }
h1, h2, h3, h4, h5, h6 { break-after: avoid-page; orphans: 2; }
p { orphans: 4; }
html.blink-to-pdf { font-size: 13px; }
.typora-export #write { padding-left: 1cm; padding-right: 1cm; padding-bottom: 0px; break-after: avoid; }
.typora-export #write::after { height: 0px; }
@page { margin: 20mm 0mm; }
}
.footnote-line { margin-top: 0.714em; font-size: 0.7em; }
a img, img a { cursor: pointer; }
pre.md-meta-block { font-size: 0.8rem; min-height: 2.86rem; white-space: pre-wrap; background: rgb(204, 204, 204); display: block; overflow-x: hidden; }
p > img:only-child { display: block; margin: auto; }
p .md-image:only-child { display: inline-block; width: 100%; text-align: center; }
#write .MathJax_Display { margin: 0.8em 0px 0px; }
.mathjax-block { white-space: pre; overflow: hidden; width: 100%; }
p + .mathjax-block { margin-top: -1.143rem; }
.mathjax-block:not(:empty)::after { display: none; }
[contenteditable="true"]:active, [contenteditable="true"]:focus { outline: none; box-shadow: none; }
.task-list { list-style-type: none; }
.task-list-item { position: relative; padding-left: 1em; }
.task-list-item input { position: absolute; top: 0px; left: 0px; }
.math { font-size: 1rem; }
.md-toc { min-height: 3.58rem; position: relative; font-size: 0.9rem; border-radius: 10px; }
.md-toc-content { position: relative; margin-left: 0px; }
.md-toc::after, .md-toc-content::after { display: none; }
.md-toc-item { display: block; color: rgb(65, 131, 196); }
.md-toc-item a { text-decoration: none; }
.md-toc-inner:hover { }
.md-toc-inner { display: inline-block; cursor: pointer; }
.md-toc-h1 .md-toc-inner { margin-left: 0px; font-weight: bold; }
.md-toc-h2 .md-toc-inner { margin-left: 2em; }
.md-toc-h3 .md-toc-inner { margin-left: 4em; }
.md-toc-h4 .md-toc-inner { margin-left: 6em; }
.md-toc-h5 .md-toc-inner { margin-left: 8em; }
.md-toc-h6 .md-toc-inner { margin-left: 10em; }
@media screen and (max-width: 48em) {
.md-toc-h3 .md-toc-inner { margin-left: 3.5em; }
.md-toc-h4 .md-toc-inner { margin-left: 5em; }
.md-toc-h5 .md-toc-inner { margin-left: 6.5em; }
.md-toc-h6 .md-toc-inner { margin-left: 8em; }
}
a.md-toc-inner { font-size: inherit; font-style: inherit; font-weight: inherit; line-height: inherit; }
.footnote-line a:not(.reversefootnote) { color: inherit; }
.md-attr { display: none; }
.md-fn-count::after { content: "."; }
.md-tag { opacity: 0.5; }
.md-comment { color: rgb(162, 127, 3); opacity: 0.8; font-family: monospace; }
code { text-align: left; }
h1 .md-tag, h2 .md-tag, h3 .md-tag, h4 .md-tag, h5 .md-tag, h6 .md-tag { font-weight: initial; opacity: 0.35; }
a.md-print-anchor { border-width: initial !important; border-style: none !important; border-color: initial !important; display: inline-block !important; position: absolute !important; width: 1px !important; right: 0px !important; outline: none !important; background: transparent !important; text-decoration: initial !important; text-shadow: initial !important; }
.md-inline-math .MathJax_SVG .noError { display: none !important; }
.mathjax-block .MathJax_SVG_Display { text-align: center; margin: 1em 0em; position: relative; text-indent: 0px; max-width: none; max-height: none; min-height: 0px; min-width: 100%; width: auto; display: block !important; }
.MathJax_SVG_Display, .md-inline-math .MathJax_SVG_Display { width: auto; margin: inherit; display: inline-block !important; }
.MathJax_SVG .MJX-monospace { font-family: monospace; }
.MathJax_SVG .MJX-sans-serif { font-family: sans-serif; }
.MathJax_SVG { display: inline; font-style: normal; font-weight: normal; line-height: normal; zoom: 90%; text-indent: 0px; text-align: left; text-transform: none; letter-spacing: normal; word-spacing: normal; word-wrap: normal; white-space: nowrap; float: none; direction: ltr; max-width: none; max-height: none; min-width: 0px; min-height: 0px; border: 0px; padding: 0px; margin: 0px; }
.MathJax_SVG * { transition: none; }
.md-diagram-panel > svg { max-width: 100%; }
[lang="flow"] svg, [lang="mermaid"] svg { max-width: 100%; }
:root { --side-bar-bg-color: #fafafa; --control-text-color: #777; }
@font-face { font-family: "Open Sans"; font-style: normal; font-weight: normal; src: local("Open Sans Regular"), url("./github/400.woff") format("woff"); }
@font-face { font-family: "Open Sans"; font-style: italic; font-weight: normal; src: local("Open Sans Italic"), url("./github/400i.woff") format("woff"); }
@font-face { font-family: "Open Sans"; font-style: normal; font-weight: bold; src: local("Open Sans Bold"), url("./github/700.woff") format("woff"); }
@font-face { font-family: "Open Sans"; font-style: italic; font-weight: bold; src: local("Open Sans Bold Italic"), url("./github/700i.woff") format("woff"); }
html { font-size: 16px; }
body { font-family: "Open Sans", "Clear Sans", "Helvetica Neue", Helvetica, Arial, sans-serif; color: rgb(51, 51, 51); line-height: 1.6; }
#write { max-width: 860px; margin: 0px auto; padding: 20px 30px 100px; }
#write > ul:first-child, #write > ol:first-child { margin-top: 30px; }
body > :first-child { margin-top: 0px !important; }
body > :last-child { margin-bottom: 0px !important; }
a { color: rgb(65, 131, 196); }
h1, h2, h3, h4, h5, h6 { position: relative; margin-top: 1rem; margin-bottom: 1rem; font-weight: bold; line-height: 1.4; cursor: text; }
h1:hover a.anchor, h2:hover a.anchor, h3:hover a.anchor, h4:hover a.anchor, h5:hover a.anchor, h6:hover a.anchor { text-decoration: none; }
h1 tt, h1 code { font-size: inherit; }
h2 tt, h2 code { font-size: inherit; }
h3 tt, h3 code { font-size: inherit; }
h4 tt, h4 code { font-size: inherit; }
h5 tt, h5 code { font-size: inherit; }
h6 tt, h6 code { font-size: inherit; }
h1 { padding-bottom: 0.3em; font-size: 2.25em; line-height: 1.2; border-bottom: 1px solid rgb(238, 238, 238); }
h2 { padding-bottom: 0.3em; font-size: 1.75em; line-height: 1.225; border-bottom: 1px solid rgb(238, 238, 238); }
h3 { font-size: 1.5em; line-height: 1.43; }
h4 { font-size: 1.25em; }
h5 { font-size: 1em; }
h6 { font-size: 1em; color: rgb(119, 119, 119); }
p, blockquote, ul, ol, dl, table { margin: 0.8em 0px; }
li > ol, li > ul { margin: 0px; }
hr { height: 4px; padding: 0px; margin: 16px 0px; background-color: rgb(231, 231, 231); border-width: 0px 0px 1px; border-style: none none solid; border-top-color: initial; border-right-color: initial; border-left-color: initial; border-image: initial; overflow: hidden; box-sizing: content-box; border-bottom-color: rgb(221, 221, 221); }
body > h2:first-child { margin-top: 0px; padding-top: 0px; }
body > h1:first-child { margin-top: 0px; padding-top: 0px; }
body > h1:first-child + h2 { margin-top: 0px; padding-top: 0px; }
body > h3:first-child, body > h4:first-child, body > h5:first-child, body > h6:first-child { margin-top: 0px; padding-top: 0px; }
a:first-child h1, a:first-child h2, a:first-child h3, a:first-child h4, a:first-child h5, a:first-child h6 { margin-top: 0px; padding-top: 0px; }
h1 p, h2 p, h3 p, h4 p, h5 p, h6 p { margin-top: 0px; }
li p.first { display: inline-block; }
ul, ol { padding-left: 30px; }
ul:first-child, ol:first-child { margin-top: 0px; }
ul:last-child, ol:last-child { margin-bottom: 0px; }
blockquote { border-left: 4px solid rgb(221, 221, 221); padding: 0px 15px; color: rgb(119, 119, 119); }
blockquote blockquote { padding-right: 0px; }
table { padding: 0px; word-break: initial; }
table tr { border-top: 1px solid rgb(204, 204, 204); margin: 0px; padding: 0px; }
table tr:nth-child(2n) { background-color: rgb(248, 248, 248); }
table tr th { font-weight: bold; border: 1px solid rgb(204, 204, 204); text-align: left; margin: 0px; padding: 6px 13px; }
table tr td { border: 1px solid rgb(204, 204, 204); text-align: left; margin: 0px; padding: 6px 13px; }
table tr th:first-child, table tr td:first-child { margin-top: 0px; }
table tr th:last-child, table tr td:last-child { margin-bottom: 0px; }
.CodeMirror-gutters { border-right: 1px solid rgb(221, 221, 221); }
.md-fences, code, tt { border: 1px solid rgb(221, 221, 221); background-color: rgb(248, 248, 248); border-radius: 3px; font-family: Consolas, "Liberation Mono", Courier, monospace; padding: 2px 4px 0px; font-size: 0.9em; }
.md-fences { margin-bottom: 15px; margin-top: 15px; padding: 8px 1em 6px; }
.task-list { padding-left: 0px; }
.task-list-item { padding-left: 32px; }
.task-list-item input { top: 3px; left: 8px; }
@media screen and (min-width: 914px) {
}
@media print {
html { font-size: 13px; }
table, pre { break-inside: avoid; }
pre { word-wrap: break-word; }
}
.md-fences { background-color: rgb(248, 248, 248); }
#write pre.md-meta-block { padding: 1rem; font-size: 85%; line-height: 1.45; background-color: rgb(247, 247, 247); border: 0px; border-radius: 3px; color: rgb(119, 119, 119); margin-top: 0px !important; }
.mathjax-block > .code-tooltip { bottom: 0.375rem; }
#write > h3.md-focus::before { left: -1.5625rem; top: 0.375rem; }
#write > h4.md-focus::before { left: -1.5625rem; top: 0.285714rem; }
#write > h5.md-focus::before { left: -1.5625rem; top: 0.285714rem; }
#write > h6.md-focus::before { left: -1.5625rem; top: 0.285714rem; }
.md-image > .md-meta { border: 1px solid rgb(221, 221, 221); border-radius: 3px; font-family: Consolas, "Liberation Mono", Courier, monospace; padding: 2px 4px 0px; font-size: 0.9em; color: inherit; }
.md-tag { color: inherit; }
.md-toc { margin-top: 20px; padding-bottom: 20px; }
.sidebar-tabs { border-bottom: none; }
#typora-quick-open { border: 1px solid rgb(221, 221, 221); background-color: rgb(248, 248, 248); }
#typora-quick-open-item { background-color: rgb(250, 250, 250); border-color: rgb(254, 254, 254) rgb(229, 229, 229) rgb(229, 229, 229) rgb(238, 238, 238); border-style: solid; border-width: 1px; }
#md-notification::before { top: 10px; }
.on-focus-mode blockquote { border-left-color: rgba(85, 85, 85, 0.12); }
header, .context-menu, .megamenu-content, footer { font-family: "Segoe UI", Arial, sans-serif; }
.file-node-content:hover .file-node-icon, .file-node-content:hover .file-node-open-state { visibility: visible; }
.mac-seamless-mode #typora-sidebar { background-color: var(--side-bar-bg-color); }
.md-lang { color: rgb(180, 101, 77); }
</style>
</head>
<body class='typora-export' >
<div id='write' class = 'is-node show-fences-line-number'><h1><a name='header-n0' class='md-header-anchor '></a>Truck Simulator Concept Maps</h1><p>This is a guide to making concept maps for <a href='https://americantrucksimulator.com/'>American Truck Simulator</a> and <a href='https://eurotrucksimulator2.com/'>Euro Truck Simulator 2</a>. I will keep the instructions fairly generic but this guide will focus on creating concept maps for American Truck Simulator, specifically for <a href='https://www.ny.gov/'>New York State</a>. The goal of this guide will be to produce a plausible and accurate map for NYS that mimics the style of the maps found in-game.</p><h2><a name='header-n4' class='md-header-anchor '></a>Software Installation</h2><p>In order to make these maps we need to install some software. Luckily all the software we need are <a href='https://en.wikipedia.org/wiki/Free_and_open-source_software'>FOSS</a> and available for Windows, macOS, and Linux. Specifically we need:</p><ul><li><a href='https://qgis.org/'><strong>QGIS</strong></a> (<a href='http://docs.qgis.org/2.18/en/docs/user_manual/introduction/getting_started.html#installation'>Installation</a>) — An application for working with <a href='https://en.wikipedia.org/wiki/Geographic_information_system'>Graphical Information System (GIS)</a> data. This is where we will be doing most of our work. (<em>Note:</em> This guide was written using QGIS 2.18.14, 64-bit on Windows)</li><li><a href='https://inkscape.org/'><strong>Inkscape</strong></a> (<a href='http://wiki.inkscape.org/wiki/index.php/Installing_Inkscape'>Installation</a>) — An application for working with <a href='https://en.wikipedia.org/wiki/Vector_graphics'>vector graphics</a>. This will allow us to work with some files necessary to match the style of the in-game maps. (<em>Note:</em> This guide was written using Inkscape 0.92.2, 64-bit on Windows)</li></ul><p>The actual process of installing these programs is outside the scope of this guide. Follow the documented instructions for each application as linked to above.</p><p>You will also need software that can extract <a href='https://en.wikipedia.org/wiki/Zip_(file_format)'>ZIP</a> archives. I have no specific recommendation since such software is readily available for all systems and is often built-in.</p><p>In addition to software, we need some additional resources:</p><ul><li><a href='https://pagure.io/liberation-fonts'><strong>Liberation fonts</strong></a> — A set of FOSS fonts. Install the fonts using the appropriate steps for your system.</li><li><a href='https://github.com/sammdot/roadgeek-fonts/releases'><strong>Roadgeek 2014</strong></a> — A set of FOSS fonts. Install the fonts using the appropriate steps for your system.</li><li><a href='files/styles.zip'><strong>Custom QGIS styles</strong></a> — A set of prebuilt styles for QGIS we will be using to mimic the style of the in-game maps.</li></ul><h2><a name='header-n24' class='md-header-anchor '></a>Data Acquisition</h2><p>After you have installed the necessary software, the next step is to acquire the GIS data necessary to make an accurate map. There are three general classes of GIS data you need:</p><ul><li>Region boundary data — Polygon data that defines the boundaries of countries (ETS2) or states (ATS).</li><li>Road centerline data — Line data that defines the centerlines of roads.</li><li>Place area data — Polygon data that defines the area of named locations (municipalities).</li></ul><p>In the United States, both the individual states and the federal government maintain such data online. For consistency and ease of use, we will use the data provided by the <a href='https://www.census.gov/'>United States Census Bureau</a>. As works of the United States federal government all data we acquire from the Census Bureau is in the <a href='https://en.wikipedia.org/wiki/Public_domain'>public domain</a> and we are free to do with it as we wish.</p><p>The data we wish to acquire is part of the Census Bureau's <a href='https://www.census.gov/geo/maps-data/data/tiger.html'>Topologically Integrated Geographic Encoding and Referencing</a> (TIGER) dataset.</p><p><img src='images/census-tiger.png' alt='US Census Bureau TIGER Homepage' /></p><h3><a name='header-n43' class='md-header-anchor '></a>Region Boundaries</h3><p>The first piece of data we will acquire is the boundary data for the states and territories. This can be found by navigating to the <a href='https://www.census.gov/geo/maps-data/data/tiger-cart-boundary.html'>Cartographic Boundary Shapefiles</a> product from the TIGER homepage linked above.</p><p><img src='images/census-tiger-boundaries.png' alt='US Census Bureau TIGER Cartographic Boundary Shapefiles' /></p><p>The specific files we want are found through the <strong>State</strong> link under <strong>Nation-based Files</strong>.</p><p><img src='images/census-tiger-boundaries-state.png' alt='' /></p><p>Here we're given the option to choose between various years and resolutions. Let's choose the most recent (2016) and highest resolution (500k, the lower the number the higher the resolution) with the file <strong>cb_2016_us_state_500k.zip</strong> (3.14MB). Save this file in a safe location.</p><h3><a name='header-n54' class='md-header-anchor '></a>Road Centerlines</h3><p>The next piece of data we need to acquire is road centerline data. This data can be found by navigating to the <a href='https://www.census.gov/geo/maps-data/data/tiger-line.html'>TIGER/Line Shapefiles</a> product from the TIGER homepage as linked above.</p><p><img src='images/census-tiger-line.png' alt='' /></p><p>From there we need to choose a year; again, let's just use the most recent (2017), and then select the <strong>Web interface</strong> option from the <strong>Download</strong> menu.</p><p><img src='images/census-tiger-line-download.png' alt='' /></p><p>In the select boxes on the left, choose <strong>2017</strong> for <strong>Select year</strong> and <strong>Roads</strong> for <strong>Select a layer type</strong>, and then click <strong>Submit</strong>.</p><p><img src='images/census-tiger-line-roads.png' alt='' /></p><p>We are then given the choice of the granularity of the road data we want. We can choose either:</p><ul><li>Only primary roads at a national level.</li><li>Primary and secondary roads at a state level.</li><li>All roads at a county level.</li></ul><p>Let's choose the second option, primary and secondary roads. This won't give us every one-lane road in the country, but it's sufficient detail for what we want to accomplish. For this level, we need to choose a specific state or territory, so let's choose <strong>New York</strong> and then press <strong>Download</strong>. This should now download the file <strong>tl_2017_36_prisecroads.zip</strong> (8.77MB). Again, save this file someplace safe.</p><h3><a name='header-n81' class='md-header-anchor '></a>Place Areas</h3><p>The final piece of data we need to acquire is not critical but is useful nonetheless. Repeat the previous steps that you used to acquire the road data, except instead of selecting <strong>Roads</strong> for <strong>Select a layer type</strong>, select <strong>Places</strong> and press <strong>Submit</strong>.</p><p><img src='images/census-tiger-line-places.png' alt='' /></p><p>Again, we need to choose a specific state or territory, so let's choose <strong>New York</strong> again and press <strong>Download</strong>. This should now download the file <strong>tl_2017_36_place.zip</strong> (2.66MB). Again, save this file someplace safe.</p><h2><a name='header-n88' class='md-header-anchor '></a>Data Import</h2><p>Now that we have acquired all the requisite data, we can turn our attention to setting up our project and importing the data.</p><p>Firstly, start <strong>QGIS Desktop</strong> (<em>not</em> <strong>QGIS Browser</strong>).</p><p><img src='images/qgis.png' alt='' /></p><p>From the menu click <strong>Project > New</strong>. You'll be met with an uninspiring blank window.</p><p><img src='images/qgis-new.png' alt='' /></p><p>Immediately save this project by click <strong>Project > Save</strong>. You will be prompted for a location and name to save the project under. Create a new directory somewhere specifically for this project and save the project file there. I've named my directory <strong>trucksim-concepts</strong> and have named my project likewise. From here on out, I will refer to this directory as <strong>PROJECT_ROOT</strong>.</p><p>Next, navigate to <strong>PROJECT_ROOT</strong> in whatever file explorer your system uses and create a new directory <strong>data</strong> inside of it. In this directory create three more directories: <strong>raw</strong>, <strong>prepared</strong>, and <strong>cooked</strong>. These directories are where we will store all the data we will need for the project. The <strong>raw</strong> directory will store unmodified versions of the data we retrieved from the Census Bureau (or other source), the <strong>prepared</strong> directory will store modified versions of the data we retrieved but which isn't used to generate the final map, and the <strong>cooked</strong> directory will store the data that will produce the final map. These particular names are arbitrary, but they are the convention we will follow for this tutorial.</p><p>Inside the <strong>raw</strong> directory create three additional directories:</p><ul><li><strong>uscb-us-boundaries-2016</strong></li><li><strong>uscb-us-ny-roads-2017</strong></li><li><strong>uscb-us-ny-places-2017</strong></li></ul><p>Again, these names are arbitrary but when dealing with a lot of data organization is important. The scheme for each of these directories is <strong><source>-<country>[-<subdivison>]-<type>-<version></strong>. The source is this case indicates the data is from the United States Census Bureau. Country codes are <a href='https://en.wikipedia.org/wiki/ISO_3166-1_alpha-2'>ISO 3166-1 alpha-2</a> codes, while subdivision codes are <a href='https://en.wikipedia.org/wiki/ISO_3166-2'>ISO 3166-2</a> codes. For Americans, state and territory ISO 3166-2 codes are equivalent to two-letter United States Postal Service abbreviations. Type indicates the basic kind of data that is stored, while version is some string which allows multiple iterations of the same data to be distinguished.</p><p>Now, extract the contents of <strong>cb_2016_us_state_500k.zip</strong> to <strong>uscb-us-boundaries-2016</strong>, the contents of <strong>tl_2017_36_prisecroads.zip</strong> to <strong>uscb-us-ny-roads-2017</strong>, and the contents of <strong>tl_2017_36_place.zip</strong> to <strong>uscb-us-ny-places-2017</strong>. Once extracted, each directory should contain eight files. At this point it is a good idea to make all these files read-only using whatever means your operating system has available to you. This should prevent you for accidentally modifying the data in QGIS.</p><p>Now in QGIS, click <strong>Layer > Add Layer > Add Vector Layer...</strong> from the menu.</p><p><img src='images/qgis-layer-vector-add.png' alt='' /></p><p>Click the <strong>Browse</strong> button and navigate to your <strong>uscb-us-boundaries-2016</strong> directory. Select the <code>.shp</code> file and click the <strong>Open</strong> button in the <strong>Add vector layer</strong> dialog. You should now see an image of the United States with all its states and territories in your main window.</p><p><img src='images/qgis-import-01.png' alt='' /></p><p>(Don't worry if your colors differ from the ones in the screenshots in this guide, QGIS assigns them randomly).</p><p>One thing that you may immediately notice is that the United States looks <em>weird</em>, specifically, you likely think the United States looks stretched horizontally, especially Alaska. Welcome to the world of <a href='https://en.wikipedia.org/wiki/Map_projection'>map projections</a>. Due to how the math works, it's impossible to perfectly render the surface of a sphere (like a planet) onto a two dimensional surface (like a computer monitor). Therefore there are a variety of map projections which take the spherical coordinates and translate them onto a plane. However, because it's impossible to do this perfectly, each projection does things differently and you get different results. No result is really more "correct" than any other, they all make various tradeoffs, but the above looks "wrong" to us, because it's not what we're used to. So in order to fix this we need to make QGIS use a projection that is more like what we are used to. By default, QGIS will use the <a href='https://epsg.io/4269'>EPSG:4269</a> projection, we're going to change it to the <a href='https://epsg.io/3857'>EPSG:3857</a> projection, which is used by most online mapping sites like <a href='https://www.openstreetmap.org/'>OpenStreetMap</a>. In order to do that select <strong>Project > Project Properties...</strong> from the menu and go to the <strong>CRS</strong> tab.</p><p><img src='images/qgis-project-properties.png' alt='' /></p><p>Enable the <strong>Enable 'on the fly' CRS transformation (OTF)</strong> checkbox and in the <strong>Filter</strong> input, enter <strong>EPSG:3857</strong>. Only a single result should remain, <strong>WGS 84 / Psuedo Mercator</strong>.</p><p><img src='images/qgis-project-properties-epsg3857.png' alt='' /></p><p>Select it, and click the <strong>OK</strong> button. The United States should now look more like we're used to.</p><p><img src='images/qgis-import-02.png' alt='' /></p><p>The map is currently zoomed out to show the entire world. However, since we'll be focusing on New York, let's zoom in on it. Click <strong>View > Select > Select Feature(s)</strong> from the menu and then click on New York.</p><p><img src='images/qgis-import-03.png' alt='' /></p><p>Now click <strong>View > Zoom to Selection</strong> to have QGIS zoom the map to have NYS fill the screen.</p><p><img src='images/qgis-import-04.png' alt='' /></p><p>Now click <strong>View > Select > Deselect Features from All Layers</strong> to clear your selection.</p><p><img src='images/qgis-import-05.png' alt='' /></p><p>Next let's add the place data. Again, click <strong>Layer > Add Layer > Add Vector Layer...</strong>, click the <strong>Browse</strong> button and navigate to the <strong>uscb-us-ny-places-2017</strong> directory and select the <strong>.shp</strong> file in that directory. Click the <strong>Open</strong> button in the <strong>Add vector layer</strong> dialog to add it to the map.</p><p><img src='images/qgis-import-06.png' alt='' /></p><p>Finally, let's add the road data. Repeat the above steps, but now navigate to <strong>uscb-us-ny-roads-2017</strong> and select the <strong>.shp</strong> file in that directory.</p><p><img src='images/qgis-import-07.png' alt='' /></p><p>We now have all the data we need in QGIS to start working in earnest but before we get to that, let's do some house cleaning. On the left of QGIS should be a <strong>Layers Panel</strong>. Each layer represents the data we just imported. Right now each layer is named based on the file its data came from. To make things more consistent, right click on each layer and choose <strong>Rename</strong>. Then rename each layer to match the directory that contains it:</p><ul><li><strong>tl_2017_36_prisecroads</strong> becomes <strong>raw/uscb-us-ny-roads-2017</strong></li><li><strong>tl_2017_36_place</strong> becomes <strong>raw/uscb-us-ny-places-2017</strong></li><li><strong>cb_2016_us_state_500k</strong> becomes <strong>raw/uscb-us-boundaries-2016</strong></li></ul><p>Finally, let's select some consistent styling for these layers. Since it is often very involved and there are so many options, we will not be going over the specifics of how layers are styled. Instead, I will provide you with an existing style that you can import into your project. However, I still encourage you to investigate yourself how to change and alter styles.</p><p>First, create a directory within your <strong>PROJECT_ROOT</strong> named <strong>styles</strong> and then extract the contents of the <strong>styles.zip</strong> you previously downloaded into it. The <strong>styles</strong> directory should now contain the following 14 files directly under it:</p><ul><li><strong>cooked-boundaries.qml</strong></li><li><strong>cooked-places.qml</strong></li><li><strong>cooked-roads.qml</strong></li><li><strong>cooked-shields.qml</strong></li><li><strong>prepared-places.qml</strong></li><li><strong>raw-boundaries.qml</strong></li><li><strong>raw-places.qml</strong></li><li><strong>raw-roads.qml</strong></li><li><strong>Shield-I.svg</strong></li><li><strong>Shield-I-wide.svg</strong></li><li><strong>Shield-NY.svg</strong></li><li><strong>Shield-NY-wide.svg</strong></li><li><strong>Shield-U.svg</strong></li><li><strong>Shield-U-wide.svg</strong></li></ul><p>Then, right click on the <strong>raw/uscb-us-boundaries-2016</strong> layer and select <strong>Properties</strong>.</p><p><img src='images/qgis-import-08.png' alt='' /></p><p>The <strong>Style</strong> tab should be automatically selected. Click on the <strong>Style</strong> button at the bottom and click on the <strong>Load Style</strong> option. Then navigate to the <strong>raw-boundaries.qml</strong> file and open it. Finally, click the <strong>OK</strong> button in the <strong>Layer Properties</strong> dialog to apply the new style. </p><p><img src='images/qgis-import-10.png' alt='' /></p><p>Repeat the same operation for the places and roads layers.</p><p><img src='images/qgis-import-11.png' alt='' /></p><p>Finally, let's set the background of the entire map to black to mimic the style of the in-game maps. From the menu, select <strong>Project > Project Properties...</strong>.</p><p><img src='images/qgis-import-12.png' alt='' /></p><p>and then under the <strong>General</strong> tab click the <strong>Background color</strong> select box and in the <strong>HTML notation</strong> input enter <em>#000000</em> and press <strong>OK</strong> and <strong>OK</strong> again.</p><p><img src='images/qgis-import-13.png' alt='' /></p><h2><a name='header-n207' class='md-header-anchor '></a>Data Preparation</h2><p>Before we can really begin working we need to prepare some data layers that will make our work easier.</p><h3><a name='header-n210' class='md-header-anchor '></a>Boundary</h3><p>The first thing we need to do is create a layer which contains only our New York State boundary. To do so, make sure the <strong>raw/uscb-us-boundaries-2016</strong> layer is selected in the <strong>Layers Panel</strong> and then click <strong>View > Select > Select Features by Value...</strong>.</p><p><img src='images/qgis-features-select-boundaries.png' alt='' /></p><p>For the <strong>STUSPS</strong> field enter <strong>NY</strong> and enable <strong>Case sensitive</strong> and select <strong>Equal to (=)</strong> in the rightmost select input.</p><p><img src='images/qgis-features-select-boundaries-ny.png' alt='' /></p><p>Then click the <strong>Select features</strong> button. You may now click the <strong>Close</strong> button to dismiss the dialog. New York State (and only New York State) should be highlighted to indicate it is selected.</p><p><img src='images/qgis-prepare-01.png' alt='' /></p><p>Technically, we could have accomplished the same by simply clicking on NYS, but the above operation of selecting features based on some specific attribute is something we're going to be using a lot, so we might as well get used to it now.</p><p>Now that NYS is selected, right click on the <strong>raw/uscb-us-boundaries-2016</strong> layer and click <strong>Save As...</strong>.</p><p><img src='images/qgis-layer-vector-save.png' alt='' /></p><p>We need to change a few options before saving:</p><ul><li>Leave <strong>Format</strong> as <strong>ESRI Shapefile</strong>.</li><li>For <strong>File name</strong> click the <strong>Browse</strong> button and navigate to your <strong>cooked</strong> directory. Create a new directory inside of it named <strong>us-ny-boundary</strong>. And specify the file name as the same thing inside the directory.</li><li>For <strong>CRS</strong> change it to <strong>Project CRS (EPSG:3857 - WGS 84 / Pseudo Mercator)</strong>.</li><li>Enable the checkbox <strong>Save only selected features</strong>.</li></ul><p><img src='images/qgis-prepare-02.png' alt='' /></p><p>Leave all other options as is and click the <strong>OK</strong> button. You should now have an additional layer named <strong>us-ny-boundary</strong>.</p><p><img src='images/qgis-prepare-03.png' alt='' /></p><p>For consistency's sake, rename this layer to <strong>cooked/us-ny-boundary</strong>. Now click the <strong>X</strong> next to each <strong>raw/</strong> layer to hide it from view. You should now have a map that contains <em>only</em> the outline of New York State.</p><p><img src='images/qgis-prepare-04.png' alt='' /></p><p>A brief note on our naming conventions: since the data in this layer was produced by us, derived from other data, it is not <strong>raw</strong> and since it will be in our final map it is <strong>cooked</strong>.</p><p>Since this layer will be in our final map, we should try to make it appear like how it would in-game. Start American Truck Simulator or Euro Truck Simulator, open the world map, and take a screenshot for reference.</p><p><img src='images/ats-map.png' alt='' /></p><p>The design of each state/country on the map is fairly simple: a dark gray background with a light gray border.</p><p>Now, right click on the <strong>cooked/us-ny-boundary</strong> layer, click <strong>Properties</strong>, and then click on the <strong>Style</strong> tab. Click on the <strong>Style</strong> button at the bottom of the dialog window and click <strong>Load Style</strong>. Open the <strong>cooked-boundaries.qml</strong> file that you previously saved and click <strong>OK</strong> in the <strong>Layer Properties</strong> dialog to apply it.</p><p><img src='images/qgis-prepare-07.png' alt='' /></p><p>Remember to save your project before moving on.</p><h3><a name='header-n272' class='md-header-anchor '></a>Places</h3><p>The next thing we want to do is prepare our place data. The Census Bureau provides the place data as polygons which cover the area of the places, which is useful in general, but not particularly useful to us. More useful data to us would be points which represent the center of such areas, since that's basically all we care about for the purposes of our map. Luckily, deriving this data is relatively easy in QGIS.</p><p>First click the <strong>X</strong> next to the <strong>raw/uscb-us-ny-places-2017</strong> layer to make it visible once again and click on it to make it the selected layer.</p><p><img src='images/qgis-prepare-08.png' alt='' /></p><p>With this layer selected, from the menu click on <strong>Vector > Geometry Tools > Polygon centroids</strong>. This will open a new dialog.</p><p><img src='images/qgis-prepare-09.png' alt='' /></p><p>For <strong>Input layer</strong> select <strong>raw/uscb-us-ny-places-2017 [EPSG:4269]</strong>. For <strong>Centroids</strong> click the <strong>...</strong> button on the right side and click <strong>Save to file...</strong>. Navigate to your <strong>prepared</strong> directory and create a new directory within it named <strong>us-ny-places</strong>. Save the file inside this directory with the same name.</p><p><img src='images/qgis-prepare-10.png' alt='' /></p><p>Now click the <strong>Run</strong> to let QGIS work its magic. Once done (it shouldn't take more than a couple of seconds), you should have a new layer named <strong>Centroids</strong> which produces a bunch of dots on top of our map.</p><p><img src='images/qgis-prepare-11.png' alt='' /></p><p>The dots are point data which represent the <a href='https://en.wikipedia.org/wiki/Centroid'>centroids</a> of the place polygons we got from the Census Bureau. For consistency's sake, let's rename the <strong>Centroids</strong> layer to <strong>prepared/us-ny-places</strong>. Apply the <strong>prepared-places.qml</strong> style to this new layer.</p><p>Also disable the visibility of the <strong>raw/uscb-us-ny-places-2017</strong> layer.</p><p><img src='images/qgis-prepare-12.png' alt='' /></p><p>Note that since this layer contains data we derived ourselves, but which won't appear in the final map, it is <strong>prepared</strong>. Therefore we still need to create the <strong>cooked</strong> version of this data. In order to do so right click on the <strong>prepared/us-ny-places</strong> and click <strong>Save As...</strong>. Use the following options:</p><ul><li>Set <strong>Format</strong> to <strong>ESRI Shapefile</strong>.</li><li>For <strong>File name</strong> click the <strong>Browse</strong> button and navigate to your <strong>cooked</strong> directory. Create a new directory within it named <strong>us-ny-places</strong>, then set the filename to the same name within that directory.</li><li>Set <strong>CRS</strong> to <strong>Project CRS (EPSG:3857 - WGS 84 / Pseudo Mercator)</strong>.</li><li>Since no features should be selected, the <strong>Save only selected features</strong> checkbox should be disabled.</li></ul><p><img src='images/qgis-prepare-14.png' alt='' /></p><p>Click the <strong>OK</strong> button. You should now have a new layer named <strong>us-ny-places</strong>. Again, for consistency, rename it to <strong>cooked/us-ny-places</strong>.</p><p><img src='images/qgis-prepare-15.png' alt='' /></p><p>Since this is suppose to be our final data, we don't want those points, so let's delete them. Select the <strong>cooked/us-ny-places</strong> layer, click <strong>View > Select > Select All Features</strong>, then click <strong>Layer > Toggle Editing</strong>.</p><p><img src='images/qgis-prepare-16.png' alt='' /></p><p>Now click <strong>Edit > Delete Selected</strong> and <strong>Layer > Toggle Editing</strong>. QGIS should prompt you to save changes, click <strong>Save</strong>. The <strong>cooked/us-ny-places</strong> layer should now be empty and ready for us to add our own data when we're ready. Click the <strong>X</strong> next to the <strong>prepared/us-ny-places</strong> layer to disable its visibility.</p><p><img src='images/qgis-prepare-17.png' alt='' /></p><h3><a name='header-n330' class='md-header-anchor '></a>Roads</h3><p>The final and most important piece of data we need to prepare for are roads. In order to do so, enable the visibility of the <strong>raw/uscb-us-ny-roads-2017</strong> layer.</p><p><img src='images/qgis-prepare-13.png' alt='' /></p><p>Similar to what we did with the place data above, right click on the <strong>raw/uscb-us-ny-roads-2017</strong> and click <strong>Save As...</strong>. Follow similar steps to what we did above, except save the layer to <strong>cooked/us-ny-roads.shp</strong>. Make sure you use the Project CRS, instead of the default. Rename the new <strong>us-ny-roads</strong> layer to <strong>cooked/us-ny-roads</strong>. Repeat the steps above to delete all the features in this new layer. When complete you should have an empty <strong>cooked/us-ny-roads</strong> layer. Click the <strong>X</strong> next to the <strong>raw/uscb-us-ny-roads-2017</strong> to disable its visibility. Now the only layers visible should be the <strong>cooked/</strong> layers which represent the final map. Since we have added no places nor roads the map should just be the outline of New York.</p><p><img src='images/qgis-prepare-18.png' alt='' /></p><p>We are now ready to begin constructing our map in earnest.</p><h2><a name='header-n341' class='md-header-anchor '></a>Map Construction</h2><h3><a name='header-n342' class='md-header-anchor '></a>Places</h3><p>Probably the first thing we need to decide is what cities our map will include. Our choice of cities will dictate which routes we should use. Selecting cities is more of an art than a science, but things to consider are:</p><ul><li><strong>Population</strong> — Obviously the most populous cities are good candidates to select. In our case, New York City is an obvious candidate, being not only the most populous city in New York State, but the most populous city in all of the United States.</li><li><strong>Proximity</strong> — You should probably avoid cities that are too close together. American Truck Simulator and Euro Truck Simulator 2 maps are on a 1:20 scale with real life. Therefore cities that are close together in real life will be virtually indistinguishable from one another in-game. In our case, this means we should probably not include Yonkers, even though it is the fourth most populous city in New York State, because it is directly adjacent to New York City.</li><li><strong>Location</strong> — Cities that might not otherwise be considered but are near major routes are also good candidates. In our case, the city of Newburgh is the 22nd most populous city in New York State, but is also near the intersection of two major thoroughfares: Interstate 84 and 87.</li><li><strong>Scenery</strong> — Cities near especially scenic areas should also be considered. In our case, even if Buffalo weren't the second most populous city in New York, we would probably include it simply for its proximity to Niagara Falls.</li><li><strong>Notability</strong> — Some cities are just notable for whatever reason. Roswell, NM is an excellent example of this. In New York, Cooperstown, home of the Baseball Hall of Fame would be another example.</li><li><strong>Number</strong> — The last thing we should consider is what is a reasonable number of cities for our state or country. This is complicated because it needs to be "reasonable" compared to existing states and countries. For instance, it would probably not be reasonable for NYS to include 50 cities while California has only 22. Therefore, a good strategy is to compute the number of cities per area for existing states and countries and multiply that number by the area of our state or country to arrive at a value. Doing for that existing states in American Truck Simulator we find: California, 1.4; Nevada, 0.9; Arizona, 1.3 , and New Mexico 1.2, where each measurement is in cities per thousand square miles. Using the values for New York, we find that New York should have a minimum of 5 cities and a maximum of 7 with an average of 6. However, another metric we should consider is density. New York State, is nearly twice as dense as California at 420 people/square mile versus 251 people/square mile. It is also <em>24</em> times more dense than New Mexico at a mere 17 people/square miles. In general, the northeastern United States is significantly more densely populated than the the southwest. Therefore it would make sense to increase the number of cities to reflect this increase in population density. At this point, we return to more art than science. The formula I've chosen to compute an "expected" number of cities is in a state or country is: <span class="MathJax_Preview"></span><span class="MathJax_SVG" id="MathJax-Element-1-Frame" tabindex="-1" style="font-size: 100%; display: inline-block;"><svg xmlns:xlink="http://www.w3.org/1999/xlink" width="14.867ex" height="4.884ex" viewBox="0 -1347.5 6400.9 2103" role="img" focusable="false" style="vertical-align: -1.755ex;"><defs><path stroke-width="1" id="E1-MJMATHI-6E" d="M21 287Q22 293 24 303T36 341T56 388T89 425T135 442Q171 442 195 424T225 390T231 369Q231 367 232 367L243 378Q304 442 382 442Q436 442 469 415T503 336T465 179T427 52Q427 26 444 26Q450 26 453 27Q482 32 505 65T540 145Q542 153 560 153Q580 153 580 145Q580 144 576 130Q568 101 554 73T508 17T439 -10Q392 -10 371 17T350 73Q350 92 386 193T423 345Q423 404 379 404H374Q288 404 229 303L222 291L189 157Q156 26 151 16Q138 -11 108 -11Q95 -11 87 -5T76 7T74 17Q74 30 112 180T152 343Q153 348 153 366Q153 405 129 405Q91 405 66 305Q60 285 60 284Q58 278 41 278H27Q21 284 21 287Z"></path><path stroke-width="1" id="E1-MJMAIN-3D" d="M56 347Q56 360 70 367H707Q722 359 722 347Q722 336 708 328L390 327H72Q56 332 56 347ZM56 153Q56 168 72 173H708Q722 163 722 153Q722 140 707 133H70Q56 140 56 153Z"></path><path stroke-width="1" id="E1-MJMAIN-2308" d="M174 734Q178 746 190 750H298H369Q400 750 411 747T422 730T411 713T372 709Q365 709 345 709T310 710H214V-235Q206 -248 196 -250Q192 -250 189 -249T184 -247T180 -244T178 -241T176 -237T174 -234V734Z"></path><path stroke-width="1" id="E1-MJMATHI-61" d="M33 157Q33 258 109 349T280 441Q331 441 370 392Q386 422 416 422Q429 422 439 414T449 394Q449 381 412 234T374 68Q374 43 381 35T402 26Q411 27 422 35Q443 55 463 131Q469 151 473 152Q475 153 483 153H487Q506 153 506 144Q506 138 501 117T481 63T449 13Q436 0 417 -8Q409 -10 393 -10Q359 -10 336 5T306 36L300 51Q299 52 296 50Q294 48 292 46Q233 -10 172 -10Q117 -10 75 30T33 157ZM351 328Q351 334 346 350T323 385T277 405Q242 405 210 374T160 293Q131 214 119 129Q119 126 119 118T118 106Q118 61 136 44T179 26Q217 26 254 59T298 110Q300 114 325 217T351 328Z"></path><path stroke-width="1" id="E1-MJMATHI-63" d="M34 159Q34 268 120 355T306 442Q362 442 394 418T427 355Q427 326 408 306T360 285Q341 285 330 295T319 325T330 359T352 380T366 386H367Q367 388 361 392T340 400T306 404Q276 404 249 390Q228 381 206 359Q162 315 142 235T121 119Q121 73 147 50Q169 26 205 26H209Q321 26 394 111Q403 121 406 121Q410 121 419 112T429 98T420 83T391 55T346 25T282 0T202 -11Q127 -11 81 37T34 159Z"></path><path stroke-width="1" id="E1-MJMATHI-64" d="M366 683Q367 683 438 688T511 694Q523 694 523 686Q523 679 450 384T375 83T374 68Q374 26 402 26Q411 27 422 35Q443 55 463 131Q469 151 473 152Q475 153 483 153H487H491Q506 153 506 145Q506 140 503 129Q490 79 473 48T445 8T417 -8Q409 -10 393 -10Q359 -10 336 5T306 36L300 51Q299 52 296 50Q294 48 292 46Q233 -10 172 -10Q117 -10 75 30T33 157Q33 205 53 255T101 341Q148 398 195 420T280 442Q336 442 364 400Q369 394 369 396Q370 400 396 505T424 616Q424 629 417 632T378 637H357Q351 643 351 645T353 664Q358 683 366 683ZM352 326Q329 405 277 405Q242 405 210 374T160 293Q131 214 119 129Q119 126 119 118T118 106Q118 61 136 44T179 26Q233 26 290 98L298 109L352 326Z"></path><path stroke-width="1" id="E1-MJMATHI-44" d="M287 628Q287 635 230 637Q207 637 200 638T193 647Q193 655 197 667T204 682Q206 683 403 683Q570 682 590 682T630 676Q702 659 752 597T803 431Q803 275 696 151T444 3L430 1L236 0H125H72Q48 0 41 2T33 11Q33 13 36 25Q40 41 44 43T67 46Q94 46 127 49Q141 52 146 61Q149 65 218 339T287 628ZM703 469Q703 507 692 537T666 584T629 613T590 629T555 636Q553 636 541 636T512 636T479 637H436Q392 637 386 627Q384 623 313 339T242 52Q242 48 253 48T330 47Q335 47 349 47T373 46Q499 46 581 128Q617 164 640 212T683 339T703 469Z"></path><path stroke-width="1" id="E1-MJSZ2-221A" d="M1001 1150Q1017 1150 1020 1132Q1020 1127 741 244L460 -643Q453 -650 436 -650H424Q423 -647 423 -645T421 -640T419 -631T415 -617T408 -594T399 -560T385 -512T367 -448T343 -364T312 -259L203 119L138 41L111 67L212 188L264 248L472 -474L983 1140Q988 1150 1001 1150Z"></path><path stroke-width="1" id="E1-MJMAIN-2309" d="M21 717T21 730T32 746T75 750H147H256Q266 742 269 735V-235Q262 -248 251 -250Q247 -250 244 -249T239 -247T235 -244T233 -241T231 -237T229 -234V710H133Q119 710 99 710T71 709Q43 709 32 713Z"></path><path stroke-width="1" id="E1-MJSZ2-2308" d="M224 -649V1150H511V1099H275V-649H224Z"></path><path stroke-width="1" id="E1-MJSZ2-2309" d="M16 1099V1150H303V-649H252V1099H16Z"></path></defs><g stroke="currentColor" fill="currentColor" stroke-width="0" transform="matrix(1 0 0 -1 0 0)"><use xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="#E1-MJMATHI-6E" x="0" y="0"></use><use xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="#E1-MJMAIN-3D" x="878" y="0"></use><g transform="translate(1934,0)"><use xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="#E1-MJSZ2-2308"></use><use xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="#E1-MJMATHI-61" x="778" y="0"></use><use xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="#E1-MJMATHI-63" x="1308" y="0"></use><g transform="translate(1741,0)"><use xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="#E1-MJSZ2-221A" x="0" y="27"></use><rect stroke="none" width="945" height="60" x="1000" y="1118"></rect><g transform="translate(1000,0)"><g transform="translate(120,0)"><rect stroke="none" width="705" height="60" x="0" y="220"></rect><use transform="scale(0.707)" xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="#E1-MJMATHI-64" x="237" y="592"></use><use transform="scale(0.707)" xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="#E1-MJMATHI-44" x="84" y="-559"></use></g></g></g><use xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="#E1-MJSZ2-2309" x="3937" y="-1"></use></g></g></svg></span><script type="math/tex" id="MathJax-Element-1">n=\left\lceil\hspace{0.25em}ac\sqrt{\frac{d}{D}}\hspace{0.25em}\right\rceil</script> where <span class="MathJax_Preview"></span><span class="MathJax_SVG" id="MathJax-Element-2-Frame" tabindex="-1" style="font-size: 100%; display: inline-block;"><svg xmlns:xlink="http://www.w3.org/1999/xlink" width="1.395ex" height="1.509ex" viewBox="0 -540.2 600.5 649.8" role="img" focusable="false" style="vertical-align: -0.255ex;"><defs><path stroke-width="1" id="E2-MJMATHI-6E" d="M21 287Q22 293 24 303T36 341T56 388T89 425T135 442Q171 442 195 424T225 390T231 369Q231 367 232 367L243 378Q304 442 382 442Q436 442 469 415T503 336T465 179T427 52Q427 26 444 26Q450 26 453 27Q482 32 505 65T540 145Q542 153 560 153Q580 153 580 145Q580 144 576 130Q568 101 554 73T508 17T439 -10Q392 -10 371 17T350 73Q350 92 386 193T423 345Q423 404 379 404H374Q288 404 229 303L222 291L189 157Q156 26 151 16Q138 -11 108 -11Q95 -11 87 -5T76 7T74 17Q74 30 112 180T152 343Q153 348 153 366Q153 405 129 405Q91 405 66 305Q60 285 60 284Q58 278 41 278H27Q21 284 21 287Z"></path></defs><g stroke="currentColor" fill="currentColor" stroke-width="0" transform="matrix(1 0 0 -1 0 0)"><use xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="#E2-MJMATHI-6E" x="0" y="0"></use></g></svg></span><script type="math/tex" id="MathJax-Element-2">n</script> is the expected number of cities, <span class="MathJax_Preview"></span><span class="MathJax_SVG" id="MathJax-Element-3-Frame" tabindex="-1" style="font-size: 100%; display: inline-block;"><svg xmlns:xlink="http://www.w3.org/1999/xlink" width="1.23ex" height="1.509ex" viewBox="0 -540.2 529.5 649.8" role="img" focusable="false" style="vertical-align: -0.255ex;"><defs><path stroke-width="1" id="E3-MJMATHI-61" d="M33 157Q33 258 109 349T280 441Q331 441 370 392Q386 422 416 422Q429 422 439 414T449 394Q449 381 412 234T374 68Q374 43 381 35T402 26Q411 27 422 35Q443 55 463 131Q469 151 473 152Q475 153 483 153H487Q506 153 506 144Q506 138 501 117T481 63T449 13Q436 0 417 -8Q409 -10 393 -10Q359 -10 336 5T306 36L300 51Q299 52 296 50Q294 48 292 46Q233 -10 172 -10Q117 -10 75 30T33 157ZM351 328Q351 334 346 350T323 385T277 405Q242 405 210 374T160 293Q131 214 119 129Q119 126 119 118T118 106Q118 61 136 44T179 26Q217 26 254 59T298 110Q300 114 325 217T351 328Z"></path></defs><g stroke="currentColor" fill="currentColor" stroke-width="0" transform="matrix(1 0 0 -1 0 0)"><use xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="#E3-MJMATHI-61" x="0" y="0"></use></g></svg></span><script type="math/tex" id="MathJax-Element-3">a</script> is the area of the state or country, <span class="MathJax_Preview"></span><span class="MathJax_SVG" id="MathJax-Element-4-Frame" tabindex="-1" style="font-size: 100%; display: inline-block;"><svg xmlns:xlink="http://www.w3.org/1999/xlink" width="1.007ex" height="1.509ex" viewBox="0 -540.2 433.5 649.8" role="img" focusable="false" style="vertical-align: -0.255ex;"><defs><path stroke-width="1" id="E4-MJMATHI-63" d="M34 159Q34 268 120 355T306 442Q362 442 394 418T427 355Q427 326 408 306T360 285Q341 285 330 295T319 325T330 359T352 380T366 386H367Q367 388 361 392T340 400T306 404Q276 404 249 390Q228 381 206 359Q162 315 142 235T121 119Q121 73 147 50Q169 26 205 26H209Q321 26 394 111Q403 121 406 121Q410 121 419 112T429 98T420 83T391 55T346 25T282 0T202 -11Q127 -11 81 37T34 159Z"></path></defs><g stroke="currentColor" fill="currentColor" stroke-width="0" transform="matrix(1 0 0 -1 0 0)"><use xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="#E4-MJMATHI-63" x="0" y="0"></use></g></svg></span><script type="math/tex" id="MathJax-Element-4">c</script> is the average city density, <span class="MathJax_Preview"></span><span class="MathJax_SVG" id="MathJax-Element-5-Frame" tabindex="-1" style="font-size: 100%; display: inline-block;"><svg xmlns:xlink="http://www.w3.org/1999/xlink" width="1.216ex" height="2.009ex" viewBox="0 -755.5 523.5 865.1" role="img" focusable="false" style="vertical-align: -0.255ex;"><defs><path stroke-width="1" id="E5-MJMATHI-64" d="M366 683Q367 683 438 688T511 694Q523 694 523 686Q523 679 450 384T375 83T374 68Q374 26 402 26Q411 27 422 35Q443 55 463 131Q469 151 473 152Q475 153 483 153H487H491Q506 153 506 145Q506 140 503 129Q490 79 473 48T445 8T417 -8Q409 -10 393 -10Q359 -10 336 5T306 36L300 51Q299 52 296 50Q294 48 292 46Q233 -10 172 -10Q117 -10 75 30T33 157Q33 205 53 255T101 341Q148 398 195 420T280 442Q336 442 364 400Q369 394 369 396Q370 400 396 505T424 616Q424 629 417 632T378 637H357Q351 643 351 645T353 664Q358 683 366 683ZM352 326Q329 405 277 405Q242 405 210 374T160 293Q131 214 119 129Q119 126 119 118T118 106Q118 61 136 44T179 26Q233 26 290 98L298 109L352 326Z"></path></defs><g stroke="currentColor" fill="currentColor" stroke-width="0" transform="matrix(1 0 0 -1 0 0)"><use xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="#E5-MJMATHI-64" x="0" y="0"></use></g></svg></span><script type="math/tex" id="MathJax-Element-5">d</script> is the population density of the state or country, and <span class="MathJax_Preview"></span><span class="MathJax_SVG" id="MathJax-Element-6-Frame" tabindex="-1" style="font-size: 100%; display: inline-block;"><svg xmlns:xlink="http://www.w3.org/1999/xlink" width="1.924ex" height="2.009ex" viewBox="0 -755.5 828.5 865.1" role="img" focusable="false" style="vertical-align: -0.255ex;"><defs><path stroke-width="1" id="E6-MJMATHI-44" d="M287 628Q287 635 230 637Q207 637 200 638T193 647Q193 655 197 667T204 682Q206 683 403 683Q570 682 590 682T630 676Q702 659 752 597T803 431Q803 275 696 151T444 3L430 1L236 0H125H72Q48 0 41 2T33 11Q33 13 36 25Q40 41 44 43T67 46Q94 46 127 49Q141 52 146 61Q149 65 218 339T287 628ZM703 469Q703 507 692 537T666 584T629 613T590 629T555 636Q553 636 541 636T512 636T479 637H436Q392 637 386 627Q384 623 313 339T242 52Q242 48 253 48T330 47Q335 47 349 47T373 46Q499 46 581 128Q617 164 640 212T683 339T703 469Z"></path></defs><g stroke="currentColor" fill="currentColor" stroke-width="0" transform="matrix(1 0 0 -1 0 0)"><use xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="#E6-MJMATHI-44" x="0" y="0"></use></g></svg></span><script type="math/tex" id="MathJax-Element-6">D</script> is the average population density of all states or countries. Using this formula for New York State, produces a value of 14.</li></ul><p>With the above considerations, the 14 cities I've chosen for New York State are:</p><ol start='' ><li>Albany</li><li>Binghamton</li><li>Buffalo</li><li>Corning</li><li>Glens Falls</li><li>Islip</li><li>New York</li><li>Newburgh</li><li>Plattsburgh</li><li>Riverhead</li><li>Rochester</li><li>Syracuse</li><li>Utica</li><li>Watertown</li></ol><p>Now that we've chosen our cities, we need to add them to a final, cooked, map. First enable visibility for our <strong>prepared/us-ny-places</strong> layer.</p><p><img src='images/qgis-construct-01.png' alt='' /></p><p>Now select the layer and click <strong>Layer > Open Attribute Table</strong>.</p><p><img src='images/qgis-construct-02.png' alt='' /></p><p>The attribute table lists all the <em>features</em> (individual elements) that make up the map layer and the data associated with each other. Our goal is to identify any fields that can help us select specific features that we're interested in. Luckily for us one such field is readily apparently: <strong>NAME</strong>, which appears to contain the common name for each place location. Now that we've established that, close the attribute table dialog. Now with the layer still selected, click <strong>View > Select > Select Features by Value...</strong>.</p><p><img src='images/qgis-construct-03.png' alt='' /></p><p>In the <strong>Select features by value</strong>, in the <strong>NAME</strong> field, enter <strong>Albany</strong>, and change the filter type to <strong>Equal to (=)</strong>.</p><p><img src='images/qgis-construct-04.png' alt='' /></p><p>Now click the <strong>Select features</strong> button. You should get a blue notification at the top of the map window indicating that exactly one feature was selected.</p><p><img src='images/qgis-construct-05.png' alt='' /></p><p>Close the <strong>Select features by value</strong> dialog and you should see a dot near the eastern middle section of the state highlighted, this is Albany.</p><p><img src='images/qgis-construct-06.png' alt='' /></p><p>Now we want to copy this to our cooked layer. In order to do so, click <strong>Edit > Copy Features</strong>. Now we need to paste it in our cooked layer. Select the <strong>cooked/us-ny-places</strong> layer, and click <strong>Layer > Toggle Editing</strong>. Now click <strong>Edit > Paste Features</strong>. You should get a blue notification that exactly one feature was pasted. The Albany marker should also have a red <strong>X</strong> over it, indicating that it is editable.</p><p><img src='images/qgis-construct-07.png' alt='' /></p><p>Click <strong>Layer > Toggle Editing</strong>, QGIS should prompt you to save changes to the layer, click <strong>Save</strong> to do so. Now disable the visibility of the <strong>prepared/us-ny-places</strong> layer. You should now have a single marker on your map from the <strong>cooked/us-ny-places</strong> layer for Albany.</p><p><img src='images/qgis-construct-08.png' alt='' /></p><p>All good so far, but remember that this is supposed to be our <em>final</em> map, and place markers in the in-game map certainly don't look like that. Let's try to modify the style of the layer to make it more like the in-game map. First by looking at the in-game map, we notice that place markers appear like large circles with a orange radial gradient that transitions to white near the center. The markers also feature the name of the city above it in orange sans-serif letters with a black outline. Apply the premade style <strong>cooked-places.qml</strong> to this layer.</p><p><img src='images/qgis-construct-09.png' alt='' /></p><p>Now let's repeat the steps to copy our all of our chosen cities from the <strong>prepared</strong> layer to the <strong>cooked layer</strong>.</p><p><img src='images/qgis-construct-10.png' alt='' /></p><p>Looking good!</p><h3><a name='header-n455' class='md-header-anchor '></a>Roads</h3><p>Now that we have our cities in place, we need to add roads to connect them. In the case of the United States, there are three main kinds of roads we care about: <a href='https://en.wikipedia.org/wiki/Interstate_Highway_System'>interstates</a>, <a href='https://en.wikipedia.org/wiki/United_States_Numbered_Highway_System'>US highways</a>, and <a href='https://en.wikipedia.org/wiki/Numbered_highways_in_the_United_States#State_highways'>state highways</a>. Also, specifically for New York State, we want to avoid any road that is designated as a <a href='https://en.wikipedia.org/wiki/Parkway'>parkway</a> since trucks are not permitted on them.</p><p>Building out our road network is more art than science, but we generally want to have a robust network that would enable players to travel between any city pairs without going significantly out of their way. Where to begin is up to you, but let's say we want to start with connecting the state's largest city (New York) to its capital (Albany). If we open <a href='https://www.openstreetmap.org/'>OpenStreetMap</a> we'll see that there's a pretty obvious route connecting New York to Albany.</p><p><img src='images/osm-nys.png' alt='' /></p><p>Zooming in further reveals this route to be I-87, Interstate 87.</p><p><img src='images/osm-nys-i87.png' alt='' /></p><p>Therefore, let's see if we can add I-87 to our map. In order to do so, however, we first need to <em>find</em> I-87 on our map. Therefore, enable the visibility of the <strong>raw/uscb-ny-roads-2017</strong> layer. Select it, right click, and click on <strong>Open Attribute Table</strong>.</p><p><img src='images/qgis-construct-11.png' alt='' /></p><p>Scan through the attributes to get a sense of what the data looks like. From a brief look, it appears the following facts are true:</p><ul><li><strong>RTTYP</strong> indicates the route type using a single letter mnemonic. Of interest to us is <strong>I</strong> for <em>interstates</em>, <strong>U</strong> for <em>US highways</em>, and <strong>S</strong> for <em>state highways</em>.</li><li><strong>FULLNAME</strong> is what specifies the route number. In particular, interstates come in the form: <strong>I- #</strong> (note the space between the hyphen and the number). US highways come in the form: <strong>US Hwy #</strong>. State highways come in the form: <strong>State Rte #</strong>.</li></ul><p>We can use this information to filter down all the roads to only those that represent I-87. Therefore, close the attribute table, select the <strong>raw/uscb-us-ny-roads-2017</strong> layer and click on <strong>View > Select > Select Features by Value...</strong>. In the <strong>Select features by value</strong> dialog, for the <strong>FULLNAME</strong> row, enter <strong>I- 87</strong> (note the space), enable <strong>Case sensitive</strong>, and change the filter option to <strong>Equal to (=)</strong>.</p><p><img src='images/qgis-construct-12.png' alt='' /></p><p>Now select the <strong>Select features</strong> button. You should see a blue notification informing you that 29 features have been selected and you should also see the route of I-87 highlighted in yellow, spanning the north-south length of NYS.</p><p><img src='images/qgis-construct-13.png' alt='' /></p><p>Click <strong>Edit > Copy Features</strong>. Select the <strong>cooked/us-ny-roads</strong> layer and click <strong>Layer > Toggle Editing</strong>. Now click <strong>Edit > Paste Features</strong>. The route of I-87 should now be copied into the <strong>cooked/us-ny-roads</strong> layer.</p><p><img src='images/qgis-construct-14.png' alt='' /></p><p>Click on <strong>Layer > Toggle Editing</strong> and click <strong>Save</strong> when prompted to save the layer. Click on <strong>View > Select > Deselect Features from All Layers</strong>. Disable visibility of the <strong>raw/uscb-us-ny-roads-2017</strong> layer.</p><p><img src='images/qgis-construct-15.png' alt='' /></p><p>Great, we now have I-87 on our <strong>cooked</strong> layer connecting New York, Newburgh, Albany, Glens Falls, and Plattsburgh (and Canada further north). However, this is our <strong>cooked</strong> layer, the expectation is that it should look like the in-game map. However, styling roads is complicated by the fact that there are two road styles: a thick one for major routes like interstates and a thin one for more minor routes like state highways. Luckily, QGIS's styling system is robust enough to change styles based on the attribute of the feature, so we'll style all interstates in the thick style and all US and state highways in the minor style. Apply the <strong>cooked-roads.qml</strong> style to this layer.</p><p><img src='images/qgis-construct-16.png' alt='' /></p><p>Let's add a state highway to make sure our rule-based styling works correctly. Repeat the previous steps, except this time select <strong>State Rte 12</strong>.</p><p><img src='images/qgis-construct-17.png' alt='' /></p><p>Great, we now have NY-12 which connects Binghamton, Utica, and Watertown. It also appears our rule-based styling is working correctly as it appears thinner than I-87.</p><p>However, there is one problem. NY-12 continues beyond Watertown to an empty area on our map. Now, while I'm sure such areas are great in real life, we simply have no room for them, thus making this northern extent of NY-12 extraneous. Luckily, we can trim it down.</p><p>First, zoom into the area so that Watertown is at the bottom of the viewport.</p><p><img src='images/qgis-construct-18.png' alt='' /></p><p>Now select the <strong>cooked/us-ny-roads</strong> layer and click on <strong>Layer > Toggle Editing</strong>.</p><p><img src='images/qgis-construct-19.png' alt='' /></p><p>Now click <strong>View > Select > Select Feature(s)</strong> and draw a box around the road segments north of Watertown to select them.</p><p><img src='images/qgis-construct-20.png' alt='' /></p><p>Now click <strong>Edit > Delete Selected</strong>. Then click <strong>Layer > Toggle Editing</strong> and click <strong>Save</strong> when prompted. NY-12 should now terminate in Watertown.</p><p><img src='images/qgis-construct-21.png' alt='' /></p><p>Click on <strong>View > Zoom Full</strong> to go back to a view which encompasses the entire state.</p><p><img src='images/qgis-construct-22.png' alt='' /></p><p>Now continue adding and trimming roads in this manner to build your desired road network.</p><p>At some point you may need to trim your road network but there is not a useful split in the features where you would like to make the split. For example, I wish to smoothly connect I-495 on Long Island to NY-27. But where the split occurs would not allow that smooth connection to occur:</p><p><img src='images/qgis-construct-23.png' alt='' /></p><p>If this occurs, make sure the <strong>cooked/us-ny-roads</strong> layer is selected and click <strong>View > Select > Select Feature(s)</strong> and draw a box around the road segments that you wish to split like in the example image above. Then click on <strong>Layer > Toggle Editing</strong>.</p><p><img src='images/qgis-construct-24.png' alt='' /></p><p>Then click on <strong>Edit > Split Features</strong>, now click somewhere near where you wish the road segment to be split, as you move your mouse around you should see a dashed red line, click again across the road segment where you want it to be split, like you're slicing a loaf of bread.</p><p><img src='images/qgis-construct-25.png' alt='' /></p><p>Now <strong>right</strong> click to complete the action. Now click <strong>View > Select > Deselect Features from All Layers</strong> to clear your selection.</p><p><img src='images/qgis-construct-26.png' alt='' /></p><p>Now use <strong>View > Select > Select Feature(s)</strong> to draw a box around the segments you want to remove. You should now see that the road segments are split at the point you cut them.</p><p><img src='images/qgis-construct-27.png' alt='' /></p><p>Now click on <strong>Edit > Delete Selected</strong> to remove those segments.</p><p><img src='images/qgis-construct-28.png' alt='' /></p><p>Finally, click <strong>Layer > Toggle Editing</strong> and save the project when prompted. </p><p>Continue adding and trimming road segments in this manner until you satisfied with the results. In my case, this is what I produced:</p><p><img src='images/qgis-construct-29.png' alt='' /></p><p>This looks pretty, the only thing really missing are the highway shields.</p><h3><a name='header-n648' class='md-header-anchor '></a>Shields</h3><p>Highway shields are the signs which indicate the type and number of the different roads. In our case, we need three different shield types: interstate, US highway, and NY state route. We also need standard and wide versions of each, which are used for single/two digit and three digit numbers respectively.</p><p>While the interstate and US highway shields will be basically identical everywhere in the US, the state route shields will vary for each state. Therefore I will walkthrough how to make the shields for NY state routes and provide you with style files for the interstates and US highways.</p><p>First, we need the background image, specifically a <em>vector</em> image like SVG, not a <em>raster</em> image like PNG, BMP, or JPG. A good source for these is Wikipedia, which also provides them under a Creative Commons license.</p><p>First, search for "List of state routes in New York" on Wikipedia, which will bring you to this page: <a href='https://en.wikipedia.org/wiki/List_of_state_routes_in_New_York'>List of state routes in New York</a>. Open the shield images for a single/two digit route and a three digit route in new tabs. In this case, I will open the shield image for <a href='https://en.wikipedia.org/wiki/File:NY-2.svg'>NY-2</a> and <a href='https://en.wikipedia.org/wiki/File:NY-100.svg'>NY-100</a>. Find the <em>Original file</em> link, right click and save the files someplace where you can easily find them. Rename the <strong>NY-2.svg</strong> file to <strong>Shield-NY.svg</strong> and the <strong>NY-100.svg</strong> file to <strong>Shield-NY-wide.svg</strong>. Open <strong>Shield-NY.svg</strong> in Inkscape, which you installed earlier.</p><p><img src='images/inkscape-shield-01.png' alt='' /></p><p>In Inkscape, click <strong>View > Zoom > Page</strong>.</p><p><img src='images/inkscape-shield-02.png' alt='' /></p><p>Click <strong>Edit > Select All</strong> then click <strong>Object > Ungroup</strong> still will allow the components of the shield to be selected individually.</p><p><img src='images/inkscape-shield-03.png' alt='' /></p><p>Now click on <strong>Edit > Deselect</strong>, then click on the number two in the image, then click <strong>Edit > Delete</strong>.</p><p><img src='images/inkscape-shield-04.png' alt='' /></p><p>You now have a blank shield. Click <strong>File > Save</strong> to save it. Repeat the same operation for <strong>Shield-NY-wide.svg</strong>. Once you are done, you may close Inkscape. At this point you would move <strong>Shield-NY.svg</strong> and <strong>Shield-NY-wide.svg</strong> into your <strong>styles</strong> directory, but they should already be there from earlier.</p><p>Now we need to add some shields to map. We will use a dedicated layer for shields which we will need to create. So in QGIS, click on <strong>Layer > Create Layer > New Shapefile Layer...</strong>. Set <strong>Type</strong> to <strong>Point</strong> and select <strong>Project CRS (EPSG:3857 - WGS 84 / Pseudo Mercator)</strong> from the dropdown. In the <strong>New field</strong> options set <strong>Name</strong> to <strong>type</strong>, set <strong>Type</strong> to <strong>Text data</strong> and, set <strong>Length</strong> to <strong>2</strong>, then click the <strong>Add to fields list</strong> button. Repeat the previous step with <strong>number</strong> for <strong>Name</strong>, <strong>Text data</strong> for <strong>Type</strong>, and <strong>4</strong> for <strong>Length</strong>. Then click on the <strong>id</strong> field in the <strong>Fields list</strong> and click <strong>Remove field</strong>.</p><p><img src='images/qgis-construct-30.png' alt='' /></p><p>Then click <strong>OK</strong>. You will now be prompted to save the new layer. Navigate to your <strong>data/cooked</strong> directory and create a new directory named <strong>us-ny-shields</strong>, save the layer inside this directory with the same name. You should now have a new layer named <strong>us-ny-shields</strong> in your <strong>Layers Panel</strong>, for consistency rename it to <strong>cooked/us-ny-shields</strong> and drag it down to just below <strong>cooked/us-ny-places</strong>. Save the project.</p><p>Let's place our first shield. I'm going to place it on NY-25, at the northern tip of Long Island in the southeast of the map. Make sure the <strong>cooked/us-ny-shields</strong> layer is selected and click <strong>Layer > Toggle Editing</strong>. Then click <strong>Edit > Add Feature</strong>. Your cursor should change to a reticle looking shape, click on the tip of NY-25 to place a marker at that location. You will now be prompted to set the feature attributes. We will follow the following convention: <strong>type</strong> should be set to <strong>I</strong> for interstate shields, <strong>U</strong> for US highway shields, and the two digit state abbreviation for state routes, in the case of New York, that would be <strong>NY</strong>. <strong>number</strong> is simply the number of the route, in this case <strong>25</strong>. Enter the appropriate information.</p><p><img src='images/qgis-construct-31.png' alt='' /></p><p>Finally, click <strong>OK</strong> to add the marker to the layer. Then click <strong>Layer > Toggle Editing</strong>. You should see the marker added to the map, but it is quite unimpressive as a small colored circle. We need to make it look like a shield. Apply the <strong>cooked-shields.qml</strong> style to this layer. The premade style already includes styles for interstates, US highways, and NY state routes including both standard and wide variants. If you need to create your own, investigate how the existing ones are done and copy new rules. The main things you'll need to change are the <strong>type</strong> value in the <strong>Filter</strong> and the path to the SVG image to use.</p><p><img src='images/qgis-construct-34.png' alt='' /></p><p>Now following the previous steps add shield markers wherever you deem it appropriate. This is my result:</p><p><img src='images/qgis-construct-35.png' alt='' /></p><p>With that, we're pretty much done. Now we only need to export our map into a usable format.</p><h2><a name='header-n860' class='md-header-anchor '></a>Map Export</h2><p>Click on <strong>View > Zoom Full</strong>, then click on <strong>Project > New Print Composer</strong>. For the title enter <strong>Image Export</strong>, and click <strong>OK</strong>.</p><p><img src='images/qgis-export-01.png' alt='' /></p><p>Click on <strong>View > Zoom Full</strong>.</p><p><img src='images/qgis-export-02.png' alt='' /></p><p>On the right column, change the page size as appropriate. Since I'm in the US, I'll change it to <strong>ANSI A (Letter; 8.5x11in)</strong>. Click on <strong>Layout > Add Map</strong> and drag a rectangle to fill most of the page.</p><p><img src='images/qgis-export-03.png' alt='' /></p><p>Drag the sides of the map to perfectly cover the entire page.</p><p><img src='images/qgis-export-04.png' alt='' /></p><p>You may need to click <strong>View > Refresh</strong> to get an updated look after changing the size. Click on the map and select the <strong>Item properties</strong> tab on the right. Click on the <strong>Set to map canvas extent</strong> button.</p><p><img src='images/qgis-export-05.png' alt='' /></p><p>Play with the <strong>Scale</strong> field under <strong>Main properties</strong> until the state fills most of the page. Use the <strong>Update preview</strong> button to see its effects. I got good results with a <strong>Scale</strong> of <strong>3300000</strong>.</p><p><img src='images/qgis-export-06.png' alt='' /></p><p>Now click <strong>Edit > Deselect All</strong>.</p><p>Now, click on <strong>Composer > Export as Image...</strong>. Save the file in a convenient location with a convenient name. In the <strong>Image export options</strong> set the size to something reasonable (I used with width of 4096px), and <strong><em>finally</em></strong> click <strong>Save</strong>. This is our final result:</p><p><img src='images/finale.png' alt='' /></p></div>
</body>
</html>