commit 210791f96daf710272184a86ffa26db04f54f68c Author: Herbert Kruitbosch Date: Thu Sep 27 15:37:18 2018 +0200 first version diff --git a/Readme.md b/Readme.md new file mode 100644 index 0000000..20d41bf --- /dev/null +++ b/Readme.md @@ -0,0 +1,188 @@ +# gabmap tools + +Gabmap is a tool to crate linguistics maps, found here [https://www.gabmap.nl/](https://www.gabmap.nl/). + +This package provides tools to prepare gabmap data needed by the above website. + +(Currently) Only supports conversion from geojson to gabmap-supported kml. Tested on Python3.6, probably also works in 2.7 and 3.x + +## Installation + +pip install gabmap + +## Example + + from gabmap import as_gabmap_kml + + example_geojson = { + 'features': [ + { + 'type': 'Feature', + 'properties': {'ignored_property': 9000, 'name': 'Just a point'}, + 'geometry': { + 'type': 'Point', + 'coordinates': [5.97218371298345, 53.321051722346], + } + }, { + 'type': 'Feature', + 'properties': {'ignored_property': 9000, 'name': 'Dongeradeel, Dokkum'}, + 'geometry': { + 'type': 'Polygon', + 'coordinates': [[ + [5.972183712989529, 53.321051729937366], + [5.972649444783667, 53.323459310428774], + [5.974617105244615, 53.323094551891245], + [5.971118458390794, 53.33136874824667], + [5.97290140328097, 53.33401217805459], + [5.988828240487099, 53.33466079566186], + [5.989652143461869, 53.336091863094985], + [5.995516626556427, 53.3347625832367], + [6.013581255175037, 53.33771098627605], + [6.014977791112734, 53.33648059762006], + [6.017554860173514, 53.337095328467285], + [6.019363005880393, 53.3350016111794], + [6.024782600074181, 53.33467072960145], + [6.024756446131901, 53.33273031950157], + [6.026498893390842, 53.332221897746145], + [6.023034030721839, 53.32918544731246], + [6.022876144124088, 53.32602381606865], + [6.024719847213362, 53.32464644597469], + [6.022437903780341, 53.32403096499117], + [6.022954478786472, 53.32210829964382], + [6.02124132025574, 53.320333445464456], + [6.020151965590102, 53.30822359787938], + [5.998101020604852, 53.310500200623295], + [5.975852806584123, 53.30692731635925], + [5.970668783608778, 53.31367328171959], + [5.97429990442482, 53.31599867168855], + [5.972183712989529, 53.321051729937366] + ]] + } + }, { + 'type': 'Feature', + 'properties': {'yet_another_ignored_property': 12, 'name': 'Dongeradeel, Metslawier'}, + 'geometry': { + 'type': 'Polygon', + 'coordinates': [[ + [6.046967750144655, 53.371937895154524], + [6.0549222966439515, 53.371918076451], + [6.059352072721314, 53.36890643371235], + [6.062417104803104, 53.37132443327753], + [6.067905957583034, 53.371022203976416], + [6.0687084280154, 53.374887587170115], + [6.073009736850938, 53.3788555365375], + [6.078403346142309, 53.374857801982635], + [6.072748066948085, 53.37023019614317], + [6.075265557823207, 53.36579886593933], + [6.086521267398217, 53.363239356148796], + [6.082574229596272, 53.35279822069439], + [6.094621430086393, 53.353315989005495], + [6.080085673717988, 53.34335756890432], + [6.08081474997191, 53.34237156076051], + [6.066679950835733, 53.33685889893402], + [6.065234168475946, 53.33835014728265], + [6.062546118146774, 53.3376267442749], + [6.063205060821552, 53.33530061406535], + [6.066655308724881, 53.33344964672852], + [6.065649785255536, 53.331609521110835], + [6.067338586918196, 53.330997322012905], + [6.065897005115673, 53.33004223482746], + [6.067404400613272, 53.327763855588465], + [6.066227593986628, 53.32751948129203], + [6.071219889834814, 53.32470721385325], + [6.066774308653418, 53.32363525036028], + [6.052876005968958, 53.32492390130383], + [6.035816537863838, 53.324268920519664], + [6.03296256575084, 53.325630418778424], + [6.024599190974769, 53.32459415257276], + [6.022839175519536, 53.32764410733526], + [6.023531219120203, 53.330156874845095], + [6.026498893390842, 53.332221897746145], + [6.024756446131901, 53.33273031950157], + [6.024782600074181, 53.33467072960145], + [6.019363005880393, 53.3350016111794], + [6.017554860173514, 53.337095328467285], + [6.014977791112734, 53.33648059762006], + [6.014092972385168, 53.33765968957119], + [5.995516626556427, 53.3347625832367], + [5.993100803235959, 53.3362054938723], + [5.989652143461869, 53.336091863094985], + [5.988828240487099, 53.33466079566186], + [5.982843753781665, 53.33523634257272], + [5.9827015425321495, 53.338134792094905], + [5.987148944429796, 53.338733894585175], + [5.991707200958003, 53.34276042605685], + [5.98904704189495, 53.34456541977238], + [5.9898349659695755, 53.34834022603107], + [6.0062691176055925, 53.3511085885891], + [6.011797802445011, 53.34664176084195], + [6.018332928979364, 53.347611115387366], + [6.023471458821317, 53.352392212983766], + [6.021372827495325, 53.35663887555595], + [6.020588676561126, 53.365296580714286], + [6.029768573248898, 53.368983093660454], + [6.0392376282345115, 53.369450978110535], + [6.045416701652879, 53.37286274340197], + [6.046967750144655, 53.371937895154524] + ]] + }, + } + ] + } + + print(as_gabmap_kml(example_geojson, document_name='Happy KML', name_property='name')) + +## Result + + + + + Happy KML + 1 + + Just a point + 1 + + 5.972184,53.321052 + + + + Dongeradeel, Dokkum + 1 + + 5.997798,53.322503 + + + + Dongeradeel, Dokkum + 1 + + + + 5.972184,53.321052 5.972649,53.323459 5.974617,53.323095 5.971118,53.331369 5.972901,53.334012 5.988828,53.334661 5.989652,53.336092 5.995517,53.334763 6.013581,53.337711 6.014978,53.336481 6.017555,53.337095 6.019363,53.335002 6.024783,53.334671 6.024756,53.332730 6.026499,53.332222 6.023034,53.329185 6.022876,53.326024 6.024720,53.324646 6.022438,53.324031 6.022954,53.322108 6.021241,53.320333 6.020152,53.308224 5.998101,53.310500 5.975853,53.306927 5.970669,53.313673 5.974300,53.315999 5.972184,53.321052 + + + + + + Dongeradeel, Metslawier + 1 + + 6.044516,53.348356 + + + + Dongeradeel, Metslawier + 1 + + + + 6.046968,53.371938 6.054922,53.371918 6.059352,53.368906 6.062417,53.371324 6.067906,53.371022 6.068708,53.374888 6.073010,53.378856 6.078403,53.374858 6.072748,53.370230 6.075266,53.365799 6.086521,53.363239 6.082574,53.352798 6.094621,53.353316 6.080086,53.343358 6.080815,53.342372 6.066680,53.336859 6.065234,53.338350 6.062546,53.337627 6.063205,53.335301 6.066655,53.333450 6.065650,53.331610 6.067339,53.330997 6.065897,53.330042 6.067404,53.327764 6.066228,53.327519 6.071220,53.324707 6.066774,53.323635 6.052876,53.324924 6.035817,53.324269 6.032963,53.325630 6.024599,53.324594 6.022839,53.327644 6.023531,53.330157 6.026499,53.332222 6.024756,53.332730 6.024783,53.334671 6.019363,53.335002 6.017555,53.337095 6.014978,53.336481 6.014093,53.337660 5.995517,53.334763 5.993101,53.336205 5.989652,53.336092 5.988828,53.334661 5.982844,53.335236 5.982702,53.338135 5.987149,53.338734 5.991707,53.342760 5.989047,53.344565 5.989835,53.348340 6.006269,53.351109 6.011798,53.346642 6.018333,53.347611 6.023471,53.352392 6.021373,53.356639 6.020589,53.365297 6.029769,53.368983 6.039238,53.369451 6.045417,53.372863 6.046968,53.371938 + + + + + + + + diff --git a/gabmap/__init__.py b/gabmap/__init__.py new file mode 100644 index 0000000..a33ace1 --- /dev/null +++ b/gabmap/__init__.py @@ -0,0 +1,56 @@ +from fastkml import kml +from shapely.geometry import shape, Polygon, MultiPolygon, Point + + +__version__ = '0.0.1' +__author__ = 'Herbert Kruitbosch' + + +def as_gabmap_kml(geojson, document_name='Python Generated gabmap KML', name_property='gemeente_en_wijk_naam'): + """Creates a string with kml, accepted by gabmap, based on the (multi)polygons and points in a GeoJSON. + If a feature in the geojson is a (Multi)Polygon, then both the (multi)polygon and the centroid point are + added to the KML output. `name_property` is used as the key in `'properties'` of the geojson to determine + the name used in the Placemarks of the KML. `document_name` is the name used in the Document element of the + KML.""" + document = kml.Document(name=document_name, ns='') + + illigal_symbols = set('"\'&') + intersection = set(document_name).intersection(illigal_symbols) == set() + assert intersection, ( + "Gabmap cannot deal with some symbols ({}) in the document_name: {}".format(intersection, document_name)) + + names = set() + for feature in geojson['features']: + shape_ = shape(feature['geometry']) + name = feature['properties'][name_property] + + assert isinstance(shape_, Polygon) or isinstance(shape_, MultiPolygon) or isinstance(shape_, Point), ( + "gabmap.as_gabmap_kml was only tested on Polygons, Multipolygons and " + "Points, not on {}: ".format(type(shape_), name) + ) + + assert name not in names, "Gabmap cannot deal with duplicate names: {}".format(name) + + intersection = set(name).intersection(illigal_symbols) == set() + assert intersection, ( + "Gabmap cannot deal with some symbols ({}) in a name: {}".format(intersection, name)) + + if isinstance(shape_, Polygon) or isinstance(shape_, MultiPolygon): + names.add(name) + point_placemark = kml.Placemark(name=name, ns='') + point_placemark.geometry=shape_.centroid + document.append(point_placemark) + + polygon_placemark = kml.Placemark(name=name, ns='') + polygon_placemark.geometry=shape_ + document.append(polygon_placemark) + + k = kml.KML() + k.append(document) + return ( + """ +""" + + k.to_string(prettyprint=True) + # prettyprint is important, as gabmap requires the name-attributes of (multi)polygon-placemarkers to have a newline after the closing tag. + ) + diff --git a/gabmap/__pycache__/__init__.cpython-36.pyc b/gabmap/__pycache__/__init__.cpython-36.pyc new file mode 100644 index 0000000..1b4ae89 Binary files /dev/null and b/gabmap/__pycache__/__init__.cpython-36.pyc differ diff --git a/setup.py b/setup.py new file mode 100644 index 0000000..0a21299 --- /dev/null +++ b/setup.py @@ -0,0 +1,28 @@ +from setuptools import setup + +setup( + name='gabmap', + version=__import__('gabmap').__version__, + url='https://www.gabmap.nl/', + author='Martijn Wieling, Herbert Kruitbosch, Research and Innovation Support', + author_email='H.T.Kruitbosch@rug.nl', + description='Python module with tools to prepare gabmap data. (Currently) Only supports conversion from geojson to gabmap-supported kml. Tested on Python3.6, probably also works in 2.7 and 3.x', + license='BSD', + packages=[ + 'gabmap', + ], + include_package_data=True, + install_requires=[ + 'fastkml>=0.11,<2', + 'shapely>=1.5.17,<2' + ], + extras_require={}, + zip_safe=True, + classifiers=[ + 'Intended Audience :: Developers', + 'Programming Language :: Python', + 'Programming Language :: Python :: 3', + 'Programming Language :: Python :: 3.6', + 'Topic :: Software Development :: Libraries :: Python Modules', + ], +)