2017-08-13 19 views
-1

J'ai un fichier de forme pour les noms de routes - qui est en fait une géométrie polyligne. Et j'ai aussi des points d'adresse, j'essaie de trouver le nom de la route de chaque point d'adresse en utilisant le fichier de forme polyligne. Existe-t-il un moyen de résoudre ce problème? J'ai utilisé la jointure spatiale, malheureusement ça ne marche pas car la géométrie polyligne n'aura pas tous les points. Quelqu'un peut-il suggérer comment résoudre cela?point de recherche en polyligne - python

Puisque personne n'a répondu à cette question, d'élaborer la question plus loin. J'ai donc shapefile avec plusieurs coordonnées de ligne poly (chaque chaîne de ligne aura min et max les coordonnées d'une ligne comme ci-dessous un)

 min  max 
x 168.04510 168.0480 
y -44.39949 -44.3987 

je dois savoir si le point (168,04665153, -44,3990252) est la ligne faite des coordonnées ci-dessus. Faites-moi savoir si d'autres détails sont requis. Heureux d'expliquer.

Merci d'avance.

Répondre

0

Je pense que le problème est en fait de trouver la rue la plus proche de chaque point. Vous pouvez importer vos fichiers de formes à l'aide de GeoPandas.read_file(), puis utiliser la fonction suivante pour rechercher les noms de rues. À titre illustratif, je vais juste créer un GeoDataFrame fictif, mais il est plus facile pour les gens de répondre à votre question si vous pouvez fournir un échantillon de vos données. La fonction fonctionne comme suit: d'abord, vous créez un tampon autour de votre Point, puis vous obtenez toutes les lignes dans ce cercle (pt.buffer()). Ensuite, vous calculez la distance entre le point et chacune de ces lignes et sélectionnez celle qui est la plus proche.

l1 = LineString([(0,0), (2,3)]) 
l2 = LineString([(2,3), (3,0)]) 
pt = Point([1.5,1]) 

df = pd.DataFrame(['street1', 'street2'], columns=['street_name'])  
gdf = gpd.GeoDataFrame(df ,geometry = [l1,l2]) 
gdf 

# street_name geometry 
#0 street1  LINESTRING (0 0, 2 3) 
#1 street2  LINESTRING (2 3, 3 0) 

def get_street_name(gdf, pt):  
    dist = [] 
    for line in gdf.intersection(pt.buffer(3)): 
     ind = gdf[gdf.geometry == line].index[0] 
     dist.append([line.distance(pt), ind]) 
    dist.sort() 
    true_line_index = dist[0][1] 
    street_name = gdf.iloc[true_line_index].loc['street_name'] 

    return street_name 

get_street_name(gdf,pt) 
# out: 'street1' 

Cette solution est rapide, vous pouvez le faire plus rapidement en utilisant spatial index (voir here). J'ai répondu à une question similaire here.

+0

Merci pour votre réponse. Je vais essayer ça aujourd'hui. Cependant mes points sont lat, longs points. Dois-je projeter le système de coordonnées avant de faire cela? Et pouvez-vous s'il vous plaît ajouter indexation rtree sur ce script si possible? –

+0

galbée suppose des coordonnées cartésiennes. Je suggère de projeter vos données pour éviter les erreurs. Il devrait être assez facile d'ajouter un index spatial si vous suivez les étapes du tutoriel ou de l'autre lien. Je serai heureux de vous aider si vous avez un problème spécifique à l'implémenter. –

+0

@ds_user a-t-il fonctionné? –