geovizpy 0.1.1__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- geovizpy-0.1.1/PKG-INFO +13 -0
- geovizpy-0.1.1/README.md +27 -0
- geovizpy-0.1.1/geovizpy/__init__.py +253 -0
- geovizpy-0.1.1/geovizpy.egg-info/PKG-INFO +13 -0
- geovizpy-0.1.1/geovizpy.egg-info/SOURCES.txt +7 -0
- geovizpy-0.1.1/geovizpy.egg-info/dependency_links.txt +1 -0
- geovizpy-0.1.1/geovizpy.egg-info/top_level.txt +1 -0
- geovizpy-0.1.1/setup.cfg +4 -0
- geovizpy-0.1.1/setup.py +16 -0
geovizpy-0.1.1/PKG-INFO
ADDED
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: geovizpy
|
|
3
|
+
Version: 0.1.1
|
|
4
|
+
Summary: A Python wrapper for the geoviz JavaScript library
|
|
5
|
+
Author: fbxyz
|
|
6
|
+
Classifier: Programming Language :: Python :: 3
|
|
7
|
+
Classifier: License :: OSI Approved :: MIT License
|
|
8
|
+
Classifier: Operating System :: OS Independent
|
|
9
|
+
Requires-Python: >=3.6
|
|
10
|
+
Dynamic: author
|
|
11
|
+
Dynamic: classifier
|
|
12
|
+
Dynamic: requires-python
|
|
13
|
+
Dynamic: summary
|
geovizpy-0.1.1/README.md
ADDED
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
# geovizpy
|
|
2
|
+
|
|
3
|
+
A Python wrapper for the [geoviz](https://github.com/neocarto/geoviz) JavaScript library.
|
|
4
|
+
It allows you to create thematic maps using a simple Python API and render them to HTML.
|
|
5
|
+
|
|
6
|
+
## Installation
|
|
7
|
+
|
|
8
|
+
```bash
|
|
9
|
+
pip install git+https://github.com/yourusername/geovizpy.git
|
|
10
|
+
```
|
|
11
|
+
|
|
12
|
+
## Usage
|
|
13
|
+
|
|
14
|
+
```python
|
|
15
|
+
from geovizpy import Geoviz
|
|
16
|
+
import json
|
|
17
|
+
|
|
18
|
+
# Load your GeoJSON data
|
|
19
|
+
with open("examples/world.json") as f:
|
|
20
|
+
world_data = json.load(f)
|
|
21
|
+
|
|
22
|
+
# Create a map
|
|
23
|
+
viz = Geoviz(projection="EqualEarth")
|
|
24
|
+
viz.outline()
|
|
25
|
+
viz.choro(data=world_data, var="gdppc")
|
|
26
|
+
viz.render_html("map.html")
|
|
27
|
+
```
|
|
@@ -0,0 +1,253 @@
|
|
|
1
|
+
import json
|
|
2
|
+
|
|
3
|
+
class Geoviz:
|
|
4
|
+
"""
|
|
5
|
+
A Python wrapper for the geoviz JavaScript library.
|
|
6
|
+
Allows creating maps by chaining commands and rendering them to an HTML file.
|
|
7
|
+
"""
|
|
8
|
+
def __init__(self, **kwargs):
|
|
9
|
+
self.commands = []
|
|
10
|
+
self.commands.append({"name": "create", "args": kwargs})
|
|
11
|
+
|
|
12
|
+
def _add_command(self, name, args):
|
|
13
|
+
self.commands.append({"name": name, "args": args})
|
|
14
|
+
return self
|
|
15
|
+
|
|
16
|
+
# Marks
|
|
17
|
+
def outline(self, **kwargs):
|
|
18
|
+
return self._add_command("outline", kwargs)
|
|
19
|
+
|
|
20
|
+
def graticule(self, **kwargs):
|
|
21
|
+
return self._add_command("graticule", kwargs)
|
|
22
|
+
|
|
23
|
+
def path(self, **kwargs):
|
|
24
|
+
return self._add_command("path", kwargs)
|
|
25
|
+
|
|
26
|
+
def header(self, **kwargs):
|
|
27
|
+
return self._add_command("header", kwargs)
|
|
28
|
+
|
|
29
|
+
def footer(self, **kwargs):
|
|
30
|
+
return self._add_command("footer", kwargs)
|
|
31
|
+
|
|
32
|
+
def circle(self, **kwargs):
|
|
33
|
+
return self._add_command("circle", kwargs)
|
|
34
|
+
|
|
35
|
+
def square(self, **kwargs):
|
|
36
|
+
return self._add_command("square", kwargs)
|
|
37
|
+
|
|
38
|
+
def spike(self, **kwargs):
|
|
39
|
+
return self._add_command("spike", kwargs)
|
|
40
|
+
|
|
41
|
+
def text(self, **kwargs):
|
|
42
|
+
return self._add_command("text", kwargs)
|
|
43
|
+
|
|
44
|
+
def tile(self, **kwargs):
|
|
45
|
+
return self._add_command("tile", kwargs)
|
|
46
|
+
|
|
47
|
+
def scalebar(self, **kwargs):
|
|
48
|
+
return self._add_command("scalebar", kwargs)
|
|
49
|
+
|
|
50
|
+
def north(self, **kwargs):
|
|
51
|
+
return self._add_command("north", kwargs)
|
|
52
|
+
|
|
53
|
+
def plot(self, **kwargs):
|
|
54
|
+
return self._add_command("plot", kwargs)
|
|
55
|
+
|
|
56
|
+
def tissot(self, **kwargs):
|
|
57
|
+
return self._add_command("tissot", kwargs)
|
|
58
|
+
|
|
59
|
+
def rhumbs(self, **kwargs):
|
|
60
|
+
return self._add_command("rhumbs", kwargs)
|
|
61
|
+
|
|
62
|
+
def earth(self, **kwargs):
|
|
63
|
+
return self._add_command("earth", kwargs)
|
|
64
|
+
|
|
65
|
+
def empty(self, **kwargs):
|
|
66
|
+
return self._add_command("empty", kwargs)
|
|
67
|
+
|
|
68
|
+
def halfcircle(self, **kwargs):
|
|
69
|
+
return self._add_command("halfcircle", kwargs)
|
|
70
|
+
|
|
71
|
+
def symbol(self, **kwargs):
|
|
72
|
+
return self._add_command("symbol", kwargs)
|
|
73
|
+
|
|
74
|
+
def grid(self, **kwargs):
|
|
75
|
+
return self._add_command("grid", kwargs)
|
|
76
|
+
|
|
77
|
+
# Plot shortcuts (sugar syntax for plot({type: ...}))
|
|
78
|
+
def choro(self, **kwargs):
|
|
79
|
+
return self._add_command("plot", {"type": "choro", **kwargs})
|
|
80
|
+
|
|
81
|
+
def typo(self, **kwargs):
|
|
82
|
+
return self._add_command("plot", {"type": "typo", **kwargs})
|
|
83
|
+
|
|
84
|
+
def prop(self, **kwargs):
|
|
85
|
+
return self._add_command("plot", {"type": "prop", **kwargs})
|
|
86
|
+
|
|
87
|
+
def propchoro(self, **kwargs):
|
|
88
|
+
return self._add_command("plot", {"type": "propchoro", **kwargs})
|
|
89
|
+
|
|
90
|
+
def proptypo(self, **kwargs):
|
|
91
|
+
return self._add_command("plot", {"type": "proptypo", **kwargs})
|
|
92
|
+
|
|
93
|
+
def picto(self, **kwargs):
|
|
94
|
+
return self._add_command("plot", {"type": "picto", **kwargs})
|
|
95
|
+
|
|
96
|
+
def bertin(self, **kwargs):
|
|
97
|
+
return self._add_command("plot", {"type": "bertin", **kwargs})
|
|
98
|
+
|
|
99
|
+
# Legends
|
|
100
|
+
def legend_circles_nested(self, **kwargs):
|
|
101
|
+
return self._add_command("legend.circles_nested", kwargs)
|
|
102
|
+
|
|
103
|
+
def legend_circles(self, **kwargs):
|
|
104
|
+
return self._add_command("legend.circles", kwargs)
|
|
105
|
+
|
|
106
|
+
def legend_squares(self, **kwargs):
|
|
107
|
+
return self._add_command("legend.squares", kwargs)
|
|
108
|
+
|
|
109
|
+
def legend_squares_nested(self, **kwargs):
|
|
110
|
+
return self._add_command("legend.squares_nested", kwargs)
|
|
111
|
+
|
|
112
|
+
def legend_circles_half(self, **kwargs):
|
|
113
|
+
return self._add_command("legend.circles_half", kwargs)
|
|
114
|
+
|
|
115
|
+
def legend_spikes(self, **kwargs):
|
|
116
|
+
return self._add_command("legend.spikes", kwargs)
|
|
117
|
+
|
|
118
|
+
def legend_mushrooms(self, **kwargs):
|
|
119
|
+
return self._add_command("legend.mushrooms", kwargs)
|
|
120
|
+
|
|
121
|
+
def legend_choro_vertical(self, **kwargs):
|
|
122
|
+
return self._add_command("legend.choro_vertical", kwargs)
|
|
123
|
+
|
|
124
|
+
def legend_choro_horizontal(self, **kwargs):
|
|
125
|
+
return self._add_command("legend.choro_horizontal", kwargs)
|
|
126
|
+
|
|
127
|
+
def legend_typo_vertical(self, **kwargs):
|
|
128
|
+
return self._add_command("legend.typo_vertical", kwargs)
|
|
129
|
+
|
|
130
|
+
def legend_typo_horizontal(self, **kwargs):
|
|
131
|
+
return self._add_command("legend.typo_horizontal", kwargs)
|
|
132
|
+
|
|
133
|
+
def legend_symbol_vertical(self, **kwargs):
|
|
134
|
+
return self._add_command("legend.symbol_vertical", kwargs)
|
|
135
|
+
|
|
136
|
+
def legend_symbol_horizontal(self, **kwargs):
|
|
137
|
+
return self._add_command("legend.symbol_horizontal", kwargs)
|
|
138
|
+
|
|
139
|
+
def legend_box(self, **kwargs):
|
|
140
|
+
return self._add_command("legend.box", kwargs)
|
|
141
|
+
|
|
142
|
+
# Effects
|
|
143
|
+
def effect_blur(self, **kwargs):
|
|
144
|
+
return self._add_command("effect.blur", kwargs)
|
|
145
|
+
|
|
146
|
+
def effect_shadow(self, **kwargs):
|
|
147
|
+
return self._add_command("effect.shadow", kwargs)
|
|
148
|
+
|
|
149
|
+
def effect_radialGradient(self, **kwargs):
|
|
150
|
+
return self._add_command("effect.radialGradient", kwargs)
|
|
151
|
+
|
|
152
|
+
def effect_clipPath(self, **kwargs):
|
|
153
|
+
return self._add_command("effect.clipPath", kwargs)
|
|
154
|
+
|
|
155
|
+
def get_config(self):
|
|
156
|
+
"""
|
|
157
|
+
Returns the configuration as a JSON-compatible list of commands.
|
|
158
|
+
"""
|
|
159
|
+
def process_args(args):
|
|
160
|
+
new_args = {}
|
|
161
|
+
for k, v in args.items():
|
|
162
|
+
if isinstance(v, str) and (v.strip().startswith("(") or v.strip().startswith("function") or "=>" in v):
|
|
163
|
+
new_args[k] = {"__js_func__": v}
|
|
164
|
+
elif isinstance(v, dict):
|
|
165
|
+
new_args[k] = process_args(v)
|
|
166
|
+
else:
|
|
167
|
+
new_args[k] = v
|
|
168
|
+
return new_args
|
|
169
|
+
|
|
170
|
+
processed_commands = []
|
|
171
|
+
for cmd in self.commands:
|
|
172
|
+
processed_commands.append({"name": cmd["name"], "args": process_args(cmd["args"])})
|
|
173
|
+
|
|
174
|
+
return processed_commands
|
|
175
|
+
|
|
176
|
+
def to_json(self):
|
|
177
|
+
"""
|
|
178
|
+
Returns the configuration as a JSON string.
|
|
179
|
+
"""
|
|
180
|
+
return json.dumps(self.get_config())
|
|
181
|
+
|
|
182
|
+
def render_html(self, filename="map.html"):
|
|
183
|
+
"""
|
|
184
|
+
Renders the map to an HTML file.
|
|
185
|
+
"""
|
|
186
|
+
json_commands = self.to_json()
|
|
187
|
+
|
|
188
|
+
html_content = f"""
|
|
189
|
+
<!DOCTYPE html>
|
|
190
|
+
<html>
|
|
191
|
+
<head>
|
|
192
|
+
<meta charset="UTF-8" />
|
|
193
|
+
<link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Tangerine"/>
|
|
194
|
+
<script src="https://cdn.jsdelivr.net/npm/d3@7"></script>
|
|
195
|
+
<script src="https://cdn.jsdelivr.net/npm/geoviz@0.9.8"></script>
|
|
196
|
+
</head>
|
|
197
|
+
<body>
|
|
198
|
+
<script>
|
|
199
|
+
const commands = {json_commands};
|
|
200
|
+
let svg;
|
|
201
|
+
|
|
202
|
+
// Helper to revive functions
|
|
203
|
+
function revive(obj) {{
|
|
204
|
+
if (typeof obj === 'object' && obj !== null) {{
|
|
205
|
+
if (obj.hasOwnProperty('__js_func__')) {{
|
|
206
|
+
try {{
|
|
207
|
+
return eval(obj['__js_func__']);
|
|
208
|
+
}} catch (e) {{
|
|
209
|
+
console.error("Failed to eval function:", obj['__js_func__'], e);
|
|
210
|
+
return null;
|
|
211
|
+
}}
|
|
212
|
+
}} else {{
|
|
213
|
+
for (let key in obj) {{
|
|
214
|
+
obj[key] = revive(obj[key]);
|
|
215
|
+
}}
|
|
216
|
+
}}
|
|
217
|
+
}}
|
|
218
|
+
return obj;
|
|
219
|
+
}}
|
|
220
|
+
|
|
221
|
+
const revivedCommands = revive(commands);
|
|
222
|
+
|
|
223
|
+
revivedCommands.forEach(cmd => {{
|
|
224
|
+
if (cmd.name === "create") {{
|
|
225
|
+
svg = geoviz.create(cmd.args);
|
|
226
|
+
}} else {{
|
|
227
|
+
const parts = cmd.name.split(".");
|
|
228
|
+
if (parts.length === 1) {{
|
|
229
|
+
if (svg[parts[0]]) {{
|
|
230
|
+
svg[parts[0]](cmd.args);
|
|
231
|
+
}} else {{
|
|
232
|
+
console.warn("Method " + parts[0] + " not found");
|
|
233
|
+
}}
|
|
234
|
+
}} else if (parts.length === 2) {{
|
|
235
|
+
if (svg[parts[0]] && svg[parts[0]][parts[1]]) {{
|
|
236
|
+
svg[parts[0]][parts[1]](cmd.args);
|
|
237
|
+
}} else {{
|
|
238
|
+
console.warn("Method " + cmd.name + " not found");
|
|
239
|
+
}}
|
|
240
|
+
}}
|
|
241
|
+
}}
|
|
242
|
+
}});
|
|
243
|
+
|
|
244
|
+
if (svg) {{
|
|
245
|
+
document.body.appendChild(svg.render());
|
|
246
|
+
}}
|
|
247
|
+
</script>
|
|
248
|
+
</body>
|
|
249
|
+
</html>
|
|
250
|
+
"""
|
|
251
|
+
with open(filename, "w") as f:
|
|
252
|
+
f.write(html_content)
|
|
253
|
+
print(f"Map saved to {filename}")
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: geovizpy
|
|
3
|
+
Version: 0.1.1
|
|
4
|
+
Summary: A Python wrapper for the geoviz JavaScript library
|
|
5
|
+
Author: fbxyz
|
|
6
|
+
Classifier: Programming Language :: Python :: 3
|
|
7
|
+
Classifier: License :: OSI Approved :: MIT License
|
|
8
|
+
Classifier: Operating System :: OS Independent
|
|
9
|
+
Requires-Python: >=3.6
|
|
10
|
+
Dynamic: author
|
|
11
|
+
Dynamic: classifier
|
|
12
|
+
Dynamic: requires-python
|
|
13
|
+
Dynamic: summary
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
geovizpy
|
geovizpy-0.1.1/setup.cfg
ADDED
geovizpy-0.1.1/setup.py
ADDED
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
from setuptools import setup, find_packages
|
|
2
|
+
|
|
3
|
+
setup(
|
|
4
|
+
name="geovizpy",
|
|
5
|
+
version="0.1.1",
|
|
6
|
+
description="A Python wrapper for the geoviz JavaScript library",
|
|
7
|
+
author="fbxyz",
|
|
8
|
+
packages=find_packages(),
|
|
9
|
+
install_requires=[],
|
|
10
|
+
classifiers=[
|
|
11
|
+
"Programming Language :: Python :: 3",
|
|
12
|
+
"License :: OSI Approved :: MIT License",
|
|
13
|
+
"Operating System :: OS Independent",
|
|
14
|
+
],
|
|
15
|
+
python_requires='>=3.6',
|
|
16
|
+
)
|