Refinando a boa resposta de @ Pablo, com definições (abaixo) e adicionando uma lista de verificação para cada método, restringindo seu uso. Definições:
A camada de bloco é uma tabela SQL com polígonos que representam os limites dos blocos da cidade , que ou sem calçadas , mas preservando becos particulares (consulte a frente 1 ) ou não endereçáveis (consulte a frente 2 ) no bloco.
A camada de lote é uma tabela SQL com polígonos que representam os limites dos terrenos .
Camada de rua é uma tabela SQL com linhas que representam ruas ... Ou, em uma "região do rio" também os rios (e uma ferrovia pode ser uma "frente"?).
Frente 1 : os métodos do @ Pablo são sobre um conceito geral de frente , onde alguns lotes têm mais do que "uma frente e uma rua", porque estão na esquina (têm dois ou mais segmentos da frente em todas as ruas circundantes).
Frente 2 : "frente" refere-se à rua indicada no endereço oficial (ou endereço de correspondência) do lote. Para eles, todos (mesmo na esquina) têm apenas um segmento de frente de rua. PS: se o seu sistema de endereços e camada de bloco aceitarem muitos " condomínios horizontais " e seus endereços de condomínios, as "ruas particulares" deverão ser mostradas como de costume .
A ilustração da pergunta de @ ChristianAbreu mostra o conceito Front-2 (!) , Não o geral.
Nota técnica: você pode conectar o Python ao PostGIS ou a qualquer outra ferramenta compatível com OGC (para SQL espacial) para expressar formalmente as listas de verificação.
Lista de verificação para o método # 1 - lado de um polígono que não toca em nenhum outro polígono
Este método tem uma abordagem topológica, é válido apenas para blocos em que todas as áreas do lote formam a área do bloco. Portanto, para usar esse método, você precisa de uma camada de bloco .
Expressando formalmente: verifique se blkarea~=sum_lotarea
para cada bloco,
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;
Ou, se as goemetrias não forem exatas, ou se os blocos estiverem com calçadas, use o mínimo w para ST_Buffer(block.geom,-w)
garantir ST_Within(lot.geom lot,ST_Buffer(block.geom,-w))
todos os lotes.
NOTA: verifique também
se todos os lotes estiverem dentro de um bloco, ST_Within(lot.geom,block.geom)
para todos os lotes e blocos associados.
se, para todos os lotes não disjuntos, não houver áreas sobrepostas. not(ST_Overlaps(a,b))
ou essa área de interseção não tem significado (ou seja 2*ST_Area(ST_Intersection(a,b))/(ST_Area(a)+ST_Area(b))<0.01
).
Lista de verificação para o método # 2 - o lado do polígono mais próximo de uma estrada
Este método possui uma abordagem geométrica, baseada na distância euclidiana mínima .
Verifique se a camada de rua possui apenas "ruas públicas" , pois é necessário separar "ruas públicas" (que podem expressar o endereço oficial de um terreno) de "becos" (pode ser interno do lote ou um "condomínio" ").
Em seguida, verifique visualmente se todos os "blocos visuais" estão cercados por ruas. Se sua camada de rua estiver incompleta, o método não é válido para esses blocos.
Conclusões: regras para escolher métodos
Para a definição do Front-1 :
A) Quando você tiver bons dados de ruas, use o método nº 2 ;
B) Quando você tem uma camada de bloco e uma camada de lote consistente, use o método nº 1
C) Quando você não tiver bons dados, tente dividir seus dados espaciais em partes em que você pode usar um ou outro método. PS: mesmo sem a camada de blocos , é possível construir a junção de lotes vizinhos ou com uma boa resposta a esta pergunta .
Para a definição do Front-2 : você precisa de bons dados de ruas, porque a definição do Front-2 precisa do nome da rua (do endereço do lote). Use o método nº 2 e solte segmentos frontais que não tenham o mesmo nome da rua que o endereço do lote.