Refinando la buena respuesta de @Pablo, con definiciones (a continuación) y agregando una lista de verificación para cada método, restringiendo su uso. Definiciones:
La capa de bloque es una tabla SQL con polígonos que representan los límites de los bloques de la ciudad , que o sin aceras , pero que conserva callejones privados (ver frente-1 ) o no direccionables (ver frente-2 ) en el bloque.
La capa de lote es una tabla SQL con polígonos que representan los límites de los lotes de tierra .
La capa de calle es una tabla SQL con líneas que representan calles ... O, en una "tierra fluvial" también ríos (¿y un ferrocarril puede ser un "frente"?).
Frente 1 : los métodos de @Pablo se refieren a un concepto general de frente , donde algunos lotes tienen más de "un frente sobre una calle", porque están en la esquina (tienen dos o más segmentos frontales sobre todas sus calles circundantes).
Frente-2 : "frente" se refiere a la calle indicada en la dirección oficial (o dirección de correspondencia) del lote. Ellos, todos los lotes (incluso en la esquina) tienen solo un segmento de la calle delantera. PD: si su sistema de direcciones y la capa de bloques aceptan muchos " condominios horizontales " y sus direcciones de condominio, las "calles privadas" deben aparecer como calles habituales .
La ilustración de la pregunta de @ ChristianAbreu muestra el concepto Front-2 (!) , No el general.
Nota técnica: puede conectar Python con PostGIS o con cualquier otra herramienta compatible con OGC (para SQL espacial) para expresar formalmente las listas de verificación.
Lista de verificación para el método n. ° 1: lado de un polígono que no toca ningún otro polígono
Este método tiene un enfoque topológico, es válido solo para bloques donde todas las áreas del lote forman el área de su bloque. Entonces, para usar este método, necesita una capa de bloque .
Expresando formalmente: verifique si blkarea~=sum_lotarea
para cada bloque,
SELECT ST_Area(geom) INTO blkarea FROM block WHERE gid=each1;
SELECT SUM(ST_Area(geom)) INTO sum_lotarea FROM lot WHERE gid_block=each1;
O, si los goemetries no son exactos, o si los bloques están con aceras, use la menor w para ST_Buffer(block.geom,-w)
eso asegura ST_Within(lot.geom lot,ST_Buffer(block.geom,-w))
todos los lotes.
NOTA: verifique también
si todos los lotes están dentro de un bloque, ST_Within(lot.geom,block.geom)
para todos los lotes y bloques asociados.
si, para todos los lotes no disjuntos, no hay áreas superpuestas. not(ST_Overlaps(a,b))
o esta área de intersección no tiene importancia (es decir 2*ST_Area(ST_Intersection(a,b))/(ST_Area(a)+ST_Area(b))<0.01
).
Lista de verificación para el método n. ° 2: el lado del polígono más cercano a una carretera
Este método tiene un enfoque geométrico, basado en una distancia euclidiana mínima .
Compruebe si la capa de la calle solo tiene "calles públicas" , ya que debe separar las "calles públicas" (que pueden expresar la dirección oficial de un terreno) de los "callejones" (pueden ser internos del lote o un "bloque de condominios" ").
Luego, verifique visualmente si todos los "bloques visuales" están rodeados de calles. Si su capa de calle está incompleta, el método no es válido para esos bloques.
Conclusiones: reglas para elegir métodos
Para la definición de Front-1 :
A) Cuando tenga buenos datos de la calle, use el método # 2 ;
B) Cuando tenga una capa de bloque y una capa de lote consistente, use el método # 1
C) Cuando no tenga buenos datos, intente dividir sus datos espaciales en porciones donde pueda usar uno u otro método. PD: incluso sin la capa de bloque puede construir uniendo lotes vecinos, o con una buena respuesta a esta pregunta .
Para la definición de Front-2 : necesita buenos datos de la calle, porque la definición de Front-2 necesita el nombre de la calle (de la dirección del lote). Use el método # 2 y suelte los segmentos frontales que no tengan el mismo nombre de calle que la dirección del lote.