Correct datatype for latitude and longitude? (in activerecord)

Should I store latitude and longitude as strings or floats (or something else)?

(I'm using activerecord / ruby on rails, if that matters).

Update:

Mysql in development and postgresql in production (why does it matter?)

31872 次浏览

I would suggest using floats, although it doesn't really make that much of a difference. Floats are easier to do calculations on if you ever desire that in the future.

If you need to do more complex geographical calculations, you can investigate PostGIS for Postgresql or MySQL Spatial Extensions for MySQL. Otherwise, a float (double precision might be a good idea) should work.

Edit: It looks like the GeoRuby library includes a Rails extension for working with the spatial/GIS extensions for both of the aforementioned databases.

Generally you want Lat/Long stored in the largest float type you have. At some latitudes (eg: near the equator) very small changes in longitude can equate to large differences in terms of surface distance.

I suppose if it is a field which you won't ever want to do any math on, you could use a string. I'd avoid that though.

If you're not using a spatially-enabled database, Google Maps recommends using floats of size (10,6). That gives you 6 digits after the decimal - if you want more precision, you can adjust accordingly.

This is what I use:

add_column :table_name, :lat, :decimal, {:precision=>10, :scale=>6}
add_column :table_name, :lng, :decimal, {:precision=>10, :scale=>6}

Since they're fixed precision, you should convert and store as integer for a significant performance improvement.

(SEE http://www.postgresql.org/docs/9.1/static/datatype-numeric.html#DATATYPE-NUMERIC-DECIMAL)