PostgreSQL
 sql >> Base de Dados >  >> RDS >> PostgreSQL

Como verificar se lat long está nos limites da cidade


Talvez isso seja um exagero, mas se você estiver usando postgres você pode instalar o postgis extensão para gerenciar dados espaciais. Em seguida, em um irb você pode fazer algo assim:
result = ActiveRecord::Base.connection.execute('SELECT
ST_Contains(ST_SetSRID(ST_MakeBox2D(ST_Point(-0.489, 51.28), ST_Point(0.236, 51.686)), 4326),
ST_SetSRID(ST_Point(-0.1265, 51.483), 4326))')

A consulta está verificando se o ponto está dentro da bbox fornecida usando a função ST_contains

Isso retornará:
=> #<PG::Result:0x007fa517fcbe08 @connection=#<PG::Connection:0x007fa5167f8970 @socket_io=nil, @notice_receiver=nil, @notice_processor=nil>>

Então você pode fazer:
result.first

Isso retornará:
{"st_contains"=>"t"}

Com este ponto -0,7265, 44,483 (um ponto fora da bbox) o resultado será:
{"st_contains"=>"f"}

Se você não quiser usar sql bruto, poderá usar gems para gerenciar dados espaciais. Um muito bom é:rgeo . Eu recomendo ler o blog do criador

Usando rgeo você pode definir atributos para seus modelos com "geótipos" como pontos, polígonos, etc. e então usar funções como contém?

Deixo você com um gist com instruções muito básicas para instalar o postgis com o Ubuntu.