Suite

PostGIS : approximation d'un numéro de maison à partir d'une plage d'adresses


Je développe un géocodeur inversé pour le Canada. Jusqu'à présent, étant donné une lat/lng, je peux trouver la rue la plus proche (segment de ligne), qui comprend la direction du segment de ligne et les plages d'adresses des deux côtés de la rue. J'essaie maintenant de trouver le meilleur moyen d'approcher par programmation le numéro de maison le plus proche du point lat/lng donné.

Voici un exemple de ligne contenant les données de la rue :

-[ ENREGISTREMENT 1 ]- [… ] l_adddilfg | Même direction l_hnumf | 3219 l_hnuml | 3235 l_stname_c | Breen Road Nord-ouest r_adddilfg | Même direction r_hnumf | 3224 r_hnuml | 3236 r_stname_c | Breen Road Nord-ouest the_geom | 0105000020E610000001000000010200000002000000B0F6990E78885CC088DF2B5F3C8C49400875B39A89885CC0A0BCA6AC4B8C4940

Ainsi, étant donné une coordonnée lat/lng qui se trouve près du segment de ligne "the_geom", une personne pourrait dire visuellement de quel côté de la rue se trouve le point (côté gauche ou droit) et à quelle distance le long du segment il se trouve -- ainsi approximation d'un numéro de maison. Par exemple, si le point se trouve du côté droit, aux trois quarts de la rue, j'utiliserais les champs r_hnumf (côté droit, premier numéro) et r_hnuml (côté droit, dernier numéro)… L'adresse postale est probablement proche de :

3232, chemin Breen Nord-ouest

Ce que je recherche, c'est une meilleure pratique dans le calcul/l'approximation de cela dans PostGIS (ce dont je suis nouveau), ou dans la couche d'application une fois la ligne extraite.

Merci!


La solution peut être entièrement construite dans PostGIS.

Étant donné un point (emplacement de la maison, je l'ai modélisé comme un POINT) et un segment de rue (segment de rue le plus proche de ce point, modélisé comme LINESTRING) vous demandez :

  • Comment savoir si le point est à gauche d'un segment de rue

Une solution possible consiste à déterminer le point sur le segment de rue le plus proche de la maison, puis à déterminer si ce point se situe à gauche ou à droite de la maison (l'opérateur&<renvoie vrai si le premier argument de géométrie chevauche ou se trouve à gauche du deuxième argument de géométrie).&<fonctionne en fait avec des cadres de délimitation, mais puisque nous travaillons avec des points, cela ne devrait pas avoir d'importance.

osm=# select 'POINT(4 1)'::geometry &< st_closestpoint('LINESTRING(1 1,2 3,6 6)'::geometry, 'POINT(4 1)'::geometry) as houseIsOnLeft; houseisonleft --------------- f (1 rangée)
  • À quelle distance se trouve la maison sur le segment de rue

Encore une fois, cela se traduit par la distance (une valeur comprise entre 0 et 1) sur le segment de rue est le point de la rue qui est le plus proche de la maison. Il existe une fonction intégrée pour cela, appelée st_line_locate_point :

osm=# select st_line_locate_point('LINESTRING(1 1,2 3,6 6)'::geometry, 'POINT(2 1)'::geometry); st_line_locate_point ---------------------- 0.0618033988749895 (1 row) osm=# select st_line_locate_point('LINESTRING(1 1,2 3,6 6)'::geometry , 'POINT(5 6)'::geometry); st_line_locate_point ---------------------- 0.889442719099992 (1 ligne)


Jetez un œil à http://www.postgis.org/documentation/manual-svn/ST_Line_Locate_Point.html

L'exemple sur la page est essentiellement ce que vous essayez de faire aussi, je pense.


Voir la vidéo: Calculer des sous-réseau ipV4 (Octobre 2021).