[PYTHON] Objectif GIS Master # 3 J'ai examiné la méthode de géocodage de type maillage

J'essaierai de devenir un maître SIG après un long moment. Je ne suis pas mon travail principal, alors j'ai l'impression que je vais le foutre si j'en ai l'occasion.

Je pensais que Geohash était le seul et le plus fort

Depuis que j'ai appris l'existence de Geohash, je l'utilise en profitant de ses fonctionnalités pratiques.

■ Raison pratique

Créez un groupe de chaînes de caractères Geohash couvrant le Japon et collectez des données pour chaque maillage. J'ai rien fait. Si la quantité de données est importante, vous devez récupérer des données dans une certaine plage, donc Il était trop pratique d'utiliser Geohash comme standard.

Il a également été proposé de profiter de ces caractéristiques et de les utiliser pour l'anonymisation. Avec k anonymisation + Geohash, on dit utiliser un maillage Geohash à un niveau qui satisfait k sous certaines conditions Quelque chose comme. → Je n'ose pas mettre de lien.

■ Bien sûr, il y a des faiblesses

■ En fait, il y a beaucoup de choses similaires

Récemment, il a été question d'utiliser quelque chose comme un maillage. Puis j'ai pensé à pousser Geohash http://qiita.com/kochizufan/items/2fe5f4c9f74636d22ddb Quadkey est meilleur que Geohash! J'ai trouvé un article à cet effet.

Donc, dans cet article, je parlerai de Quadkey et du code de localisation ouvert décrit plus loin. En utilisant réellement la bibliothèque Décrivez du point de vue "s'il peut être utilisé comme un maillage".

Quadkey, existe-t-il une telle chose?

Le style Inoto Goro Il semble être utilisé pour l'index des tuiles de Bing Maps. C'est l'apparence officielle de MS. https://msdn.microsoft.com/en-us/library/bb259689.aspx

Bien qu'il s'agisse d'un index de mosaïque, si vous prenez les positions des quatre coins de la mosaïque, cela devient un maillage. Comme Geohash, vous pouvez générer une clé par maillage, Un personnage clé est un niveau. Je vois. Il semble qu'il puisse être utilisé à peu près de la même manière. La clé est générée à partir de l'index de la vignette, qui se trouve également sur le site ci-dessus. En d'autres termes, la clé est générée en convertissant une fois les informations de position en index de tuile. De même, la plage peut être prise en convertissant la clé en index de tuile. Par conséquent, même les utilisateurs qui disent "tuile? Je ne sais pas, ce que tu recherches est un maillage" sont une fois informés de l'index des tuiles. C'est un peu ennuyeux.

Mais Quadkey est carré et divisé en quatre

C'est fantastique. Puisqu'il est divisé en quatre, il est exprimé en nombres quaternaires. La clé est également composée de 0-3. Le niveau maximum est de 20. Je pense que la granulométrie n'est pas mauvaise. En tant que croyant Geohash, j'ai pensé: "Oh, j'ai perdu." En termes de polyvalence, j'ai eu l'impression que c'était complètement Quadkey.

■ Actuellement utilisé dans Bing Maps

L'URL de cette image est 13300211231022.jfif @2017 Microsoft Au dessous de. https://t0.ssl.ak.dynamic.tiles.virtualearth.net/comp/ch/13300211231022?mkt=ja-JP&it=G,BX,L,LA&shading=hill&og=94&n=z&c4w=1 13300211231022 Il s'agit de la touche Quad pour cette tuile. Il est également fermement intégré dans l'URL.

La résidence impériale n'a pas de sens profond. Félicitations pour votre engagement, le cas échéant. C'est tout.

■ Essayez d'obtenir la plage de latitude et de longitude à partir de Quadkey

Python a un package appelé quadkey, mais il ne fonctionne pas dans mon environnement, probablement à cause de Python3. J'ai utilisé ceci parce que cela fonctionne avec le package mercantile.

Je vais l'écrire brièvement.

#Importer du mercantile
import mercantile

#Obtenez la position dans 4 directions à partir de la touche quad
def make_bounds_by_quadkey(t_quadkey):
    #Obtenir l'index des tuiles de quadkey
    t_tile = mercantile.quadkey_to_tile(t_quadkey)
    #Obtenez les points de terminaison dans 4 directions à partir de l'index des tuiles
    t_box = mercantile.bounds(t_tile.x, t_tile.y,t_tile.z)
    
    return t_box

if __name__ == "__main__":
    out_str=[]
    #Ligne d'en-tête
    out_str.append("south,east,north,west,Quadkey,zoom")
    
    #Tableau parent à quatre touches pour récupérer la plage
    #L'enfant est zoom_append_Générer et ajouter automatiquement avec la longueur de la plage
    t_quadkeys=[
        "13300211231022"
    ]
    
    #Calculez la plage de latitude et de longitude à partir de Quadkey
    for t_quadkey in t_quadkeys:
        t_box = make_bounds_by_quadkey(t_quadkey)
        print([t_quadkey,t_box])
        #Tu peux le prendre comme ça
        #['13300211231022',
        # LngLatBbox(west=139.74609375, south=35.67514743608467,
        #            east=139.76806640625, north=35.6929946320988)]
        
        #Parce que c'est un principe d'écrire de manière facile à comprendre
        bounds_str = str(t_box.south) + "," + str(t_box.east) + "," + str(t_box.north) + ","+ str(t_box.west)

        #Le niveau de zoom=Nombre de caractères dans Quadkey
        t_zoom=len(t_quadkey)
    
        out_str.append(bounds_str+","+t_quadkey+","+str(t_zoom))
    
    #production
    f = open("quadkey_bounds.csv", 'w')
    f.write("\n".join(out_str) + "\n")
    f.close()

Visualisons le CSV qui est sorti. Vous pouvez le visualiser en faisant 4 points du sud, de l'est, du nord et de l'ouest. → La méthode de visualisation est omise. J'ai créé mon propre outil OSM + Openlayers.

La cible est le code ci-dessus 13300211231022.

BingMap Convertissez à partir de Quadkey et visualisez
13300211231022.jfif@2017 Microsoft qiita.png @OpenStreetMap

La gauche est pour une tuile, et la droite est la plage convertie à partir de la touche Quad par le cadre vert. Il ne fait aucun doute que les fourchettes sont les mêmes lorsqu'on les compare. BingMaps, niveau Quadkey 14. Je l'utilise ~~.

■ Voir aussi le niveau de l'enfant

C'est ce qui se passe lorsque vous réglez le niveau sur 15. Réécrivez la partie t_quadkeys = ~ de la source ci-dessus.

    t_quadkeys=[
        "133002112310220",
        "133002112310221",
        "133002112310222",
        "133002112310223"
    ]

Ajoutez simplement 0 à 3 à la fin. La figure ci-dessous est visualisée. qiita2.png

De cette façon, il est divisé en quatre. Avec Geohash, lors de l'élévation du niveau, il est difficile de le monter manuellement, Si vous divisez Quadkey en 4 parties, vous pouvez vous le permettre manuellement. Il y a des cas comme "Je veux élever un autre niveau et je veux un maillage pour cette partie!" Parce qu'il s'agit d'une éventuelle demande d'analyse de données Je pense que pouvoir le faire intuitivement n'est pas un petit mérite.

Quadkey, c'est bien. J'étais content, mais Google développe également une méthode de GeoCoding, Il s'avère que cela ne peut pas être ignoré.

Le code de localisation ouvert de Google, alors viens

Le style Inoto Goro

Open Location Code (OLC), un code qui repère chaque point du globe plus+codes https://plus.codes/ → Allumons la grille depuis le menu Et Google Map. https://japan.cnet.com/article/35068908/

■ Qu'est-ce que c'est?

La position peut être codée en la spécifiant au niveau de la position de la porte. La hiérarchie des codes est déterminée ci-dessous.

hiérarchie intervalle
region code Identifiez une plage d'environ 100 km carrés
city code Identifiez une zone carrée de 5 km
neighbourhood code Identifier une superficie de 250 m2
building cod Identifier une surface de 14m carrés
door Gamme plus petite

5 étapes. Grossier que les 20 étapes de Quadkey, Si vous approfondissez une couche, elle sera divisée en 400, donc elle sera moins polyvalente. Mais

Il vaut peut-être mieux avoir décidé si rapidement si vous vous inquiétez du niveau à réduire.

La manière de l'utiliser dépend de la nature du service. Lorsque Google dit "code de ville dans cette plage", cela peut être "OK".

■ Essayez quand même de l'utiliser.

La bibliothèque d'OLC est ouverte au public sur Github. https://github.com/google/open-location-code

Vérifions l'opération facilement à l'aide de la bibliothèque python. Obtenez openlocationcode.py à partir du github ci-dessus et Créez et exécutez le script suivant. → Un maillage d'une ville à proximité du palais impérial et de son quartier enfant C'est le processus à acquérir.

import openlocationcode
if __name__ == "__main__":
    #Emplacement près du palais impérial
    latitude=35.68407104
    longitude=139.7570801

    PAIR_CODE_LENGTH_=10
    #Utilisé lors de la génération de code enfant
    CODE_ALPHABET_ = '23456789CFGHJMPQRVWX'

    out_str=[]
    out_str.append("south,east,north,west,Quadkey,zoom")
    
    #Moins de 10 entraînera une erreur
    length_list = [10]
    code_list = []
    for ll in length_list:
        tcode = openlocationcode.encode(latitude, longitude, ll)
        print(tcode)
        code_list.append(tcode)
    
    #décoder la liste de codes cibles
    neighbourhood_list= []
    use_child = True
    for cl in code_list:
        #Couper le bâtiment
        split_tcode = cl.split("+")
        
        #Si vous coupez avec la ville, définissez les deux derniers caractères sur 00
        city_code = split_tcode[0][0:6]
        neighbourhood_list.append(city_code +"00+")

        #CODE pour obtenir tout le quartier_ALPHABET_ * CODE_ALPHABET_Pour générer et ajouter
        if use_child:
            for ca1 in range(len(CODE_ALPHABET_)):
                for ca2 in range(len(CODE_ALPHABET_)):
                    neighbourhoodcode=city_code +CODE_ALPHABET_[ca1]+CODE_ALPHABET_[ca2]
                    neighbourhood_list.append(neighbourhoodcode+"+")
    
    #décoder
    for nc in neighbourhood_list:
        decode = openlocationcode.decode(nc)
        print(decode)
    
        #Obtenez les données requises de la classe CodeArea et sortez-les
        bounds_str = str(decode.latitudeLo) + "," + str(decode.longitudeLo) + "," + str(decode.latitudeHi) + ","+ str(decode.longitudeHi)
        t_zoom=decode.codeLength
    
        out_str.append(bounds_str+","+nc+","+str(t_zoom))
    
    ##production
    f = open("quadkey_bounds_olc.csv", 'w')
    f.write("\n".join(out_str) + "\n")
    f.close()
city neighbourhood
qiita3.png qiita4.png

Est-ce difficile à utiliser avec cette taille? Par exemple, lors de la recherche de données dans la plage de villes, il semble qu'il y aura un nombre considérable de résultats, Le niveau du quartier est trop petit, vous devez donc effectuer une recherche dans plusieurs plages.

Résumé (Attention car c'est super subjectif)

Tout le monde est différent et tout le monde est bon. Je voudrais dire que la polyvalence de Quadkey semble bonne en raison de sa nature. Même s'il est appliqué à l'anonymisation k comme mesure de confidentialité, avec Geohash c'est un maillage de 32 fois chacun Par rapport à l'évaluation, il peut être possible d'exprimer avec un maillage plus petit en évaluant avec 4 fois chaque maillage. Je pense que les utilisateurs des données sourient également. Au moment de la recherche, une correspondance de chaîne de caractères peut être utilisée, mais une correspondance numérique peut être utilisée. Les performances au moment de la recherche peuvent sortir ... À l'inverse, le codage implique des calculs de type Mercator, donc Il semble être plus lent que Geohash, qui est simplement dérivé de la latitude et de la longitude. Après tout, il y a une partie à convertir en index de tuiles une fois, vous pouvez l'envelopper, mais cela semble inutile ...

Geohash est devenu si populaire qu'il a plus d'informations et de bibliothèques que d'autres. C'est à peu près ça.

OLC est difficile à utiliser, mais si vous souhaitez coder finement la position au niveau de la porte. Je me demande si je peux l'utiliser comme maillage. Mais par rapport aux deux premiers, il y a des inquiétudes comme "Quel niveau dois-je utiliser pour ce service?" Puisqu'il est presque inexistant, c'est un bon choix en fonction de l'application.

Il existe également un maillage hexagonal appelé Geohex, que je n'ai pas pu présenter. http://geogames.net/geohex/v3 C'est beau. Mais je ne peux pas avoir une relation parent-enfant complète, Selon le niveau, ce sera un maillage différent. Aussi, qu'il soit visualisé ou que les données soient acquises Un carré est pratique car il est flexible. Vous pouvez visualiser Polygon en le tenant au format WKT ou en recherchant un SIG. Ça coûte de l'argent Si vous souhaitez quand même utiliser Polygon, vous pouvez utiliser Polygon des préfectures ou Polygon des districts. Je veux en utiliser des détaillés. C'est une option très prometteuse si vous l'utilisez pour positionner des jeux.

alors

Je comprends la grandeur de Quadkey. Je vais l'utiliser à partir de maintenant. Mais je suis également intéressé par OLC, et il n'y a aucune explication de la logique de conversion, donc je me demande si je devrais regarder la source. Je pense.

Recommended Posts

Objectif GIS Master # 3 J'ai examiné la méthode de géocodage de type maillage
Visez GIS Master # 2 Recherchez les routes à proximité à grande vitesse avec R-tree
J'ai touché PyAuto pendant un moment
J'ai créé un docset de tableau de bord pour Holoviews
J'ai fait une bibliothèque pour l'assurance actuarielle