dynamodb_geo 0.0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/README.md +55 -0
- data/ext/geohash_wrapper/Makefile +266 -0
- data/ext/geohash_wrapper/extconf.h +3 -0
- data/ext/geohash_wrapper/extconf.rb +3 -0
- data/ext/geohash_wrapper/geohash.c +293 -0
- data/ext/geohash_wrapper/geohash.h +77 -0
- data/ext/geohash_wrapper/geohash_wrapper.c +70 -0
- data/lib/dynamodb_geo.rb +1 -0
- data/lib/dynamodb_geo/version.rb +5 -0
- data/lib/geohash.rb +35 -0
- data/lib/geohash/geohash_wrapper.so +0 -0
- data/spec/dynamodb_geo.rb +1 -0
- data/spec/geohash_spec.rb +34 -0
- data/spec/spec_helper.rb +8 -0
- metadata +132 -0
    
        checksums.yaml
    ADDED
    
    | @@ -0,0 +1,7 @@ | |
| 1 | 
            +
            ---
         | 
| 2 | 
            +
            SHA256:
         | 
| 3 | 
            +
              metadata.gz: 34aa9b9ef408a4556afbc74c173c40ccb5932fc0a47d29a3e519c0cb803fe043
         | 
| 4 | 
            +
              data.tar.gz: f7dd0b6c92a94e7da2c14417ee67296af8f04f86b768bfb2c8acd32572bdd8e9
         | 
| 5 | 
            +
            SHA512:
         | 
| 6 | 
            +
              metadata.gz: 9d3d2f46f82c2e9ece62dc006dbda654753d01fb7d82d06d803448171a9852cef5933ce814ce20057017ed9fcb318b9f6ff37dbe79cb7f5167c82aea65f3258c
         | 
| 7 | 
            +
              data.tar.gz: 8df26e8041dfbb59020496faf2ae5014fae971b9b7d0f84274ff4eeb58c0c70487623a7a44343a4443647d08cfe72acc48c8115004c287853c2896dc46e91b9a
         | 
    
        data/README.md
    ADDED
    
    | @@ -0,0 +1,55 @@ | |
| 1 | 
            +
            # DynamoDB_Geo
         | 
| 2 | 
            +
             | 
| 3 | 
            +
             | 
| 4 | 
            +
            # Geohashing
         | 
| 5 | 
            +
            Includes a Geohash implimentation written in C  
         | 
| 6 | 
            +
            <https://github.com/simplegeo/libgeohash>
         | 
| 7 | 
            +
             | 
| 8 | 
            +
             | 
| 9 | 
            +
            ### Methods
         | 
| 10 | 
            +
            Encoding a Geohash
         | 
| 11 | 
            +
             | 
| 12 | 
            +
                Description: Takes in a latitude, longitude, and precision, and returns a geohash as a string
         | 
| 13 | 
            +
                Input:  latitude  => Number
         | 
| 14 | 
            +
                        longitude => Number
         | 
| 15 | 
            +
                        precision => Number
         | 
| 16 | 
            +
                Output: Geohash   => String
         | 
| 17 | 
            +
             | 
| 18 | 
            +
                Geohash.encode(lat, long, precision) => String
         | 
| 19 | 
            +
             | 
| 20 | 
            +
             | 
| 21 | 
            +
            Decoding a Geohash
         | 
| 22 | 
            +
             | 
| 23 | 
            +
                Description: Takes in a hash, and returns a Geocoord
         | 
| 24 | 
            +
                Input:  Geohash  => String
         | 
| 25 | 
            +
                Output: Geocoord => Object
         | 
| 26 | 
            +
             | 
| 27 | 
            +
                Geohash.decode(hash) => Geocoord
         | 
| 28 | 
            +
             | 
| 29 | 
            +
            Viewing all my neighbours
         | 
| 30 | 
            +
             | 
| 31 | 
            +
                Description: Takes in a Geohash and shows the surrounding 8 neighbours
         | 
| 32 | 
            +
             | 
| 33 | 
            +
                             Physical representation:
         | 
| 34 | 
            +
                             NW N NE       7 0 1
         | 
| 35 | 
            +
                             W  X E   =>   6 X 2
         | 
| 36 | 
            +
                             SW S SE       5 4 3
         | 
| 37 | 
            +
             | 
| 38 | 
            +
                             Flat representation:
         | 
| 39 | 
            +
                             N  NE E  SE S  SW W  NW
         | 
| 40 | 
            +
                             0  1  2  3  4  5  6  7
         | 
| 41 | 
            +
                Input:  Geohash => String
         | 
| 42 | 
            +
                Output: Array[Geocoord]
         | 
| 43 | 
            +
             | 
| 44 | 
            +
                Geohash.neighbours(hash) => Array[Geohash]
         | 
| 45 | 
            +
             | 
| 46 | 
            +
            Get width and height about a specific precision
         | 
| 47 | 
            +
             | 
| 48 | 
            +
                Description: Takes in a precision value, returns the height and width of the box
         | 
| 49 | 
            +
                Input:  precision => Number
         | 
| 50 | 
            +
                Output: Dimension => Object
         | 
| 51 | 
            +
             | 
| 52 | 
            +
                Geohash.dimensions(precision) => Dimension
         | 
| 53 | 
            +
             | 
| 54 | 
            +
            #### Geocoord(Object) => attr_accessor: :latitude, :longitude, :north, :south, :east, :west, :dimension
         | 
| 55 | 
            +
            #### Dimension(Object) => attr_accessor: :length, :width
         | 
| @@ -0,0 +1,266 @@ | |
| 1 | 
            +
             | 
| 2 | 
            +
            SHELL = /bin/sh
         | 
| 3 | 
            +
             | 
| 4 | 
            +
            # V=0 quiet, V=1 verbose.  other values don't work.
         | 
| 5 | 
            +
            V = 0
         | 
| 6 | 
            +
            Q1 = $(V:1=)
         | 
| 7 | 
            +
            Q = $(Q1:0=@)
         | 
| 8 | 
            +
            ECHO1 = $(V:1=@ :)
         | 
| 9 | 
            +
            ECHO = $(ECHO1:0=@ echo)
         | 
| 10 | 
            +
            NULLCMD = :
         | 
| 11 | 
            +
             | 
| 12 | 
            +
            #### Start of system configuration section. ####
         | 
| 13 | 
            +
             | 
| 14 | 
            +
            srcdir = .
         | 
| 15 | 
            +
            topdir = /home/justin/.rvm/rubies/ruby-2.7.0/include/ruby-2.7.0
         | 
| 16 | 
            +
            hdrdir = $(topdir)
         | 
| 17 | 
            +
            arch_hdrdir = /home/justin/.rvm/rubies/ruby-2.7.0/include/ruby-2.7.0/x86_64-linux
         | 
| 18 | 
            +
            PATH_SEPARATOR = :
         | 
| 19 | 
            +
            VPATH = $(srcdir):$(arch_hdrdir)/ruby:$(hdrdir)/ruby
         | 
| 20 | 
            +
            prefix = $(DESTDIR)/home/justin/.rvm/rubies/ruby-2.7.0
         | 
| 21 | 
            +
            rubysitearchprefix = $(rubylibprefix)/$(sitearch)
         | 
| 22 | 
            +
            rubyarchprefix = $(rubylibprefix)/$(arch)
         | 
| 23 | 
            +
            rubylibprefix = $(libdir)/$(RUBY_BASE_NAME)
         | 
| 24 | 
            +
            exec_prefix = $(prefix)
         | 
| 25 | 
            +
            vendorarchhdrdir = $(vendorhdrdir)/$(sitearch)
         | 
| 26 | 
            +
            sitearchhdrdir = $(sitehdrdir)/$(sitearch)
         | 
| 27 | 
            +
            rubyarchhdrdir = $(rubyhdrdir)/$(arch)
         | 
| 28 | 
            +
            vendorhdrdir = $(rubyhdrdir)/vendor_ruby
         | 
| 29 | 
            +
            sitehdrdir = $(rubyhdrdir)/site_ruby
         | 
| 30 | 
            +
            rubyhdrdir = $(includedir)/$(RUBY_VERSION_NAME)
         | 
| 31 | 
            +
            vendorarchdir = $(vendorlibdir)/$(sitearch)
         | 
| 32 | 
            +
            vendorlibdir = $(vendordir)/$(ruby_version)
         | 
| 33 | 
            +
            vendordir = $(rubylibprefix)/vendor_ruby
         | 
| 34 | 
            +
            sitearchdir = $(sitelibdir)/$(sitearch)
         | 
| 35 | 
            +
            sitelibdir = $(sitedir)/$(ruby_version)
         | 
| 36 | 
            +
            sitedir = $(rubylibprefix)/site_ruby
         | 
| 37 | 
            +
            rubyarchdir = $(rubylibdir)/$(arch)
         | 
| 38 | 
            +
            rubylibdir = $(rubylibprefix)/$(ruby_version)
         | 
| 39 | 
            +
            sitearchincludedir = $(includedir)/$(sitearch)
         | 
| 40 | 
            +
            archincludedir = $(includedir)/$(arch)
         | 
| 41 | 
            +
            sitearchlibdir = $(libdir)/$(sitearch)
         | 
| 42 | 
            +
            archlibdir = $(libdir)/$(arch)
         | 
| 43 | 
            +
            ridir = $(datarootdir)/$(RI_BASE_NAME)
         | 
| 44 | 
            +
            mandir = $(datarootdir)/man
         | 
| 45 | 
            +
            localedir = $(datarootdir)/locale
         | 
| 46 | 
            +
            libdir = $(exec_prefix)/lib
         | 
| 47 | 
            +
            psdir = $(docdir)
         | 
| 48 | 
            +
            pdfdir = $(docdir)
         | 
| 49 | 
            +
            dvidir = $(docdir)
         | 
| 50 | 
            +
            htmldir = $(docdir)
         | 
| 51 | 
            +
            infodir = $(datarootdir)/info
         | 
| 52 | 
            +
            docdir = $(datarootdir)/doc/$(PACKAGE)
         | 
| 53 | 
            +
            oldincludedir = $(DESTDIR)/usr/include
         | 
| 54 | 
            +
            includedir = $(prefix)/include
         | 
| 55 | 
            +
            runstatedir = $(localstatedir)/run
         | 
| 56 | 
            +
            localstatedir = $(prefix)/var
         | 
| 57 | 
            +
            sharedstatedir = $(prefix)/com
         | 
| 58 | 
            +
            sysconfdir = $(prefix)/etc
         | 
| 59 | 
            +
            datadir = $(datarootdir)
         | 
| 60 | 
            +
            datarootdir = $(prefix)/share
         | 
| 61 | 
            +
            libexecdir = $(exec_prefix)/libexec
         | 
| 62 | 
            +
            sbindir = $(exec_prefix)/sbin
         | 
| 63 | 
            +
            bindir = $(exec_prefix)/bin
         | 
| 64 | 
            +
            archdir = $(rubyarchdir)
         | 
| 65 | 
            +
             | 
| 66 | 
            +
             | 
| 67 | 
            +
            CC_WRAPPER = 
         | 
| 68 | 
            +
            CC = gcc
         | 
| 69 | 
            +
            CXX = g++
         | 
| 70 | 
            +
            LIBRUBY = $(LIBRUBY_SO)
         | 
| 71 | 
            +
            LIBRUBY_A = lib$(RUBY_SO_NAME)-static.a
         | 
| 72 | 
            +
            LIBRUBYARG_SHARED = -Wl,-rpath,$(libdir) -L$(libdir) -l$(RUBY_SO_NAME)
         | 
| 73 | 
            +
            LIBRUBYARG_STATIC = -Wl,-rpath,$(libdir) -L$(libdir) -l$(RUBY_SO_NAME)-static $(MAINLIBS)
         | 
| 74 | 
            +
            empty =
         | 
| 75 | 
            +
            OUTFLAG = -o $(empty)
         | 
| 76 | 
            +
            COUTFLAG = -o $(empty)
         | 
| 77 | 
            +
            CSRCFLAG = $(empty)
         | 
| 78 | 
            +
             | 
| 79 | 
            +
            RUBY_EXTCONF_H = extconf.h
         | 
| 80 | 
            +
            cflags   = $(optflags) $(debugflags) $(warnflags)
         | 
| 81 | 
            +
            cxxflags = 
         | 
| 82 | 
            +
            optflags = -O3
         | 
| 83 | 
            +
            debugflags = -ggdb3
         | 
| 84 | 
            +
            warnflags = -Wall -Wextra -Wdeprecated-declarations -Wduplicated-cond -Wimplicit-function-declaration -Wimplicit-int -Wmisleading-indentation -Wpointer-arith -Wwrite-strings -Wimplicit-fallthrough=0 -Wmissing-noreturn -Wno-cast-function-type -Wno-constant-logical-operand -Wno-long-long -Wno-missing-field-initializers -Wno-overlength-strings -Wno-packed-bitfield-compat -Wno-parentheses-equality -Wno-self-assign -Wno-tautological-compare -Wno-unused-parameter -Wno-unused-value -Wsuggest-attribute=format -Wsuggest-attribute=noreturn -Wunused-variable
         | 
| 85 | 
            +
            cppflags = 
         | 
| 86 | 
            +
            CCDLFLAGS = -fPIC
         | 
| 87 | 
            +
            CFLAGS   = $(CCDLFLAGS) $(cflags)  -fPIC $(ARCH_FLAG)
         | 
| 88 | 
            +
            INCFLAGS = -I. -I$(arch_hdrdir) -I$(hdrdir)/ruby/backward -I$(hdrdir) -I$(srcdir)
         | 
| 89 | 
            +
            DEFS     = 
         | 
| 90 | 
            +
            CPPFLAGS = -DRUBY_EXTCONF_H=\"$(RUBY_EXTCONF_H)\"  $(DEFS) $(cppflags)
         | 
| 91 | 
            +
            CXXFLAGS = $(CCDLFLAGS) -g -O2 $(ARCH_FLAG)
         | 
| 92 | 
            +
            ldflags  = -L. -fstack-protector-strong -rdynamic -Wl,-export-dynamic
         | 
| 93 | 
            +
            dldflags = -Wl,--compress-debug-sections=zlib 
         | 
| 94 | 
            +
            ARCH_FLAG = 
         | 
| 95 | 
            +
            DLDFLAGS = $(ldflags) $(dldflags) $(ARCH_FLAG)
         | 
| 96 | 
            +
            LDSHARED = $(CC) -shared
         | 
| 97 | 
            +
            LDSHAREDXX = $(CXX) -shared
         | 
| 98 | 
            +
            AR = ar
         | 
| 99 | 
            +
            EXEEXT = 
         | 
| 100 | 
            +
             | 
| 101 | 
            +
            RUBY_INSTALL_NAME = $(RUBY_BASE_NAME)
         | 
| 102 | 
            +
            RUBY_SO_NAME = ruby
         | 
| 103 | 
            +
            RUBYW_INSTALL_NAME = 
         | 
| 104 | 
            +
            RUBY_VERSION_NAME = $(RUBY_BASE_NAME)-$(ruby_version)
         | 
| 105 | 
            +
            RUBYW_BASE_NAME = rubyw
         | 
| 106 | 
            +
            RUBY_BASE_NAME = ruby
         | 
| 107 | 
            +
             | 
| 108 | 
            +
            arch = x86_64-linux
         | 
| 109 | 
            +
            sitearch = $(arch)
         | 
| 110 | 
            +
            ruby_version = 2.7.0
         | 
| 111 | 
            +
            ruby = $(bindir)/$(RUBY_BASE_NAME)
         | 
| 112 | 
            +
            RUBY = $(ruby)
         | 
| 113 | 
            +
            ruby_headers = $(hdrdir)/ruby.h $(hdrdir)/ruby/backward.h $(hdrdir)/ruby/ruby.h $(hdrdir)/ruby/defines.h $(hdrdir)/ruby/missing.h $(hdrdir)/ruby/intern.h $(hdrdir)/ruby/st.h $(hdrdir)/ruby/subst.h $(arch_hdrdir)/ruby/config.h $(RUBY_EXTCONF_H)
         | 
| 114 | 
            +
             | 
| 115 | 
            +
            RM = rm -f
         | 
| 116 | 
            +
            RM_RF = $(RUBY) -run -e rm -- -rf
         | 
| 117 | 
            +
            RMDIRS = rmdir --ignore-fail-on-non-empty -p
         | 
| 118 | 
            +
            MAKEDIRS = /usr/bin/mkdir -p
         | 
| 119 | 
            +
            INSTALL = /usr/bin/install -c
         | 
| 120 | 
            +
            INSTALL_PROG = $(INSTALL) -m 0755
         | 
| 121 | 
            +
            INSTALL_DATA = $(INSTALL) -m 644
         | 
| 122 | 
            +
            COPY = cp
         | 
| 123 | 
            +
            TOUCH = exit >
         | 
| 124 | 
            +
             | 
| 125 | 
            +
            #### End of system configuration section. ####
         | 
| 126 | 
            +
             | 
| 127 | 
            +
            preload = 
         | 
| 128 | 
            +
            libpath = . $(libdir)
         | 
| 129 | 
            +
            LIBPATH =  -L. -L$(libdir) -Wl,-rpath,$(libdir)
         | 
| 130 | 
            +
            DEFFILE = 
         | 
| 131 | 
            +
             | 
| 132 | 
            +
            CLEANFILES = mkmf.log
         | 
| 133 | 
            +
            DISTCLEANFILES = 
         | 
| 134 | 
            +
            DISTCLEANDIRS = 
         | 
| 135 | 
            +
             | 
| 136 | 
            +
            extout = 
         | 
| 137 | 
            +
            extout_prefix = 
         | 
| 138 | 
            +
            target_prefix = /dynamodb-geo
         | 
| 139 | 
            +
            LOCAL_LIBS = 
         | 
| 140 | 
            +
            LIBS = $(LIBRUBYARG_SHARED)  -lm   -lc
         | 
| 141 | 
            +
            ORIG_SRCS = geohash.c geohash_wrapper.c
         | 
| 142 | 
            +
            SRCS = $(ORIG_SRCS) 
         | 
| 143 | 
            +
            OBJS = geohash.o geohash_wrapper.o
         | 
| 144 | 
            +
            HDRS = $(srcdir)/extconf.h $(srcdir)/geohash.h
         | 
| 145 | 
            +
            LOCAL_HDRS = 
         | 
| 146 | 
            +
            TARGET = dynamodb-geo
         | 
| 147 | 
            +
            TARGET_NAME = dynamodb
         | 
| 148 | 
            +
            TARGET_ENTRY = Init_$(TARGET_NAME)
         | 
| 149 | 
            +
            DLLIB = $(TARGET).so
         | 
| 150 | 
            +
            EXTSTATIC = 
         | 
| 151 | 
            +
            STATIC_LIB = 
         | 
| 152 | 
            +
             | 
| 153 | 
            +
            TIMESTAMP_DIR = .
         | 
| 154 | 
            +
            BINDIR        = $(bindir)
         | 
| 155 | 
            +
            RUBYCOMMONDIR = $(sitedir)$(target_prefix)
         | 
| 156 | 
            +
            RUBYLIBDIR    = $(sitelibdir)$(target_prefix)
         | 
| 157 | 
            +
            RUBYARCHDIR   = $(sitearchdir)$(target_prefix)
         | 
| 158 | 
            +
            HDRDIR        = $(rubyhdrdir)/ruby$(target_prefix)
         | 
| 159 | 
            +
            ARCHHDRDIR    = $(rubyhdrdir)/$(arch)/ruby$(target_prefix)
         | 
| 160 | 
            +
            TARGET_SO_DIR =
         | 
| 161 | 
            +
            TARGET_SO     = $(TARGET_SO_DIR)$(DLLIB)
         | 
| 162 | 
            +
            CLEANLIBS     = $(TARGET_SO) 
         | 
| 163 | 
            +
            CLEANOBJS     = *.o  *.bak
         | 
| 164 | 
            +
             | 
| 165 | 
            +
            all:    $(DLLIB)
         | 
| 166 | 
            +
            static: $(STATIC_LIB)
         | 
| 167 | 
            +
            .PHONY: all install static install-so install-rb
         | 
| 168 | 
            +
            .PHONY: clean clean-so clean-static clean-rb
         | 
| 169 | 
            +
             | 
| 170 | 
            +
            clean-static::
         | 
| 171 | 
            +
            clean-rb-default::
         | 
| 172 | 
            +
            clean-rb::
         | 
| 173 | 
            +
            clean-so::
         | 
| 174 | 
            +
            clean: clean-so clean-static clean-rb-default clean-rb
         | 
| 175 | 
            +
            		-$(Q)$(RM) $(CLEANLIBS) $(CLEANOBJS) $(CLEANFILES) .*.time
         | 
| 176 | 
            +
             | 
| 177 | 
            +
            distclean-rb-default::
         | 
| 178 | 
            +
            distclean-rb::
         | 
| 179 | 
            +
            distclean-so::
         | 
| 180 | 
            +
            distclean-static::
         | 
| 181 | 
            +
            distclean: clean distclean-so distclean-static distclean-rb-default distclean-rb
         | 
| 182 | 
            +
            		-$(Q)$(RM) Makefile $(RUBY_EXTCONF_H) conftest.* mkmf.log
         | 
| 183 | 
            +
            		-$(Q)$(RM) core ruby$(EXEEXT) *~ $(DISTCLEANFILES)
         | 
| 184 | 
            +
            		-$(Q)$(RMDIRS) $(DISTCLEANDIRS) 2> /dev/null || true
         | 
| 185 | 
            +
             | 
| 186 | 
            +
            realclean: distclean
         | 
| 187 | 
            +
            install: install-so install-rb
         | 
| 188 | 
            +
             | 
| 189 | 
            +
            install-so: $(DLLIB) $(TIMESTAMP_DIR)/.sitearchdir.-.dynamodb-geo.time
         | 
| 190 | 
            +
            	$(INSTALL_PROG) $(DLLIB) $(RUBYARCHDIR)
         | 
| 191 | 
            +
            clean-static::
         | 
| 192 | 
            +
            	-$(Q)$(RM) $(STATIC_LIB)
         | 
| 193 | 
            +
            install-rb: pre-install-rb do-install-rb install-rb-default
         | 
| 194 | 
            +
            install-rb-default: pre-install-rb-default do-install-rb-default
         | 
| 195 | 
            +
            pre-install-rb: Makefile
         | 
| 196 | 
            +
            pre-install-rb-default: Makefile
         | 
| 197 | 
            +
            do-install-rb:
         | 
| 198 | 
            +
            do-install-rb-default:
         | 
| 199 | 
            +
            pre-install-rb-default:
         | 
| 200 | 
            +
            	@$(NULLCMD)
         | 
| 201 | 
            +
            $(TIMESTAMP_DIR)/.sitearchdir.-.dynamodb-geo.time:
         | 
| 202 | 
            +
            	$(Q) $(MAKEDIRS) $(@D) $(RUBYARCHDIR)
         | 
| 203 | 
            +
            	$(Q) $(TOUCH) $@
         | 
| 204 | 
            +
             | 
| 205 | 
            +
            site-install: site-install-so site-install-rb
         | 
| 206 | 
            +
            site-install-so: install-so
         | 
| 207 | 
            +
            site-install-rb: install-rb
         | 
| 208 | 
            +
             | 
| 209 | 
            +
            .SUFFIXES: .c .m .cc .mm .cxx .cpp .o .S
         | 
| 210 | 
            +
             | 
| 211 | 
            +
            .cc.o:
         | 
| 212 | 
            +
            	$(ECHO) compiling $(<)
         | 
| 213 | 
            +
            	$(Q) $(CXX) $(INCFLAGS) $(CPPFLAGS) $(CXXFLAGS) $(COUTFLAG)$@ -c $(CSRCFLAG)$<
         | 
| 214 | 
            +
             | 
| 215 | 
            +
            .cc.S:
         | 
| 216 | 
            +
            	$(ECHO) translating $(<)
         | 
| 217 | 
            +
            	$(Q) $(CXX) $(INCFLAGS) $(CPPFLAGS) $(CXXFLAGS) $(COUTFLAG)$@ -S $(CSRCFLAG)$<
         | 
| 218 | 
            +
             | 
| 219 | 
            +
            .mm.o:
         | 
| 220 | 
            +
            	$(ECHO) compiling $(<)
         | 
| 221 | 
            +
            	$(Q) $(CXX) $(INCFLAGS) $(CPPFLAGS) $(CXXFLAGS) $(COUTFLAG)$@ -c $(CSRCFLAG)$<
         | 
| 222 | 
            +
             | 
| 223 | 
            +
            .mm.S:
         | 
| 224 | 
            +
            	$(ECHO) translating $(<)
         | 
| 225 | 
            +
            	$(Q) $(CXX) $(INCFLAGS) $(CPPFLAGS) $(CXXFLAGS) $(COUTFLAG)$@ -S $(CSRCFLAG)$<
         | 
| 226 | 
            +
             | 
| 227 | 
            +
            .cxx.o:
         | 
| 228 | 
            +
            	$(ECHO) compiling $(<)
         | 
| 229 | 
            +
            	$(Q) $(CXX) $(INCFLAGS) $(CPPFLAGS) $(CXXFLAGS) $(COUTFLAG)$@ -c $(CSRCFLAG)$<
         | 
| 230 | 
            +
             | 
| 231 | 
            +
            .cxx.S:
         | 
| 232 | 
            +
            	$(ECHO) translating $(<)
         | 
| 233 | 
            +
            	$(Q) $(CXX) $(INCFLAGS) $(CPPFLAGS) $(CXXFLAGS) $(COUTFLAG)$@ -S $(CSRCFLAG)$<
         | 
| 234 | 
            +
             | 
| 235 | 
            +
            .cpp.o:
         | 
| 236 | 
            +
            	$(ECHO) compiling $(<)
         | 
| 237 | 
            +
            	$(Q) $(CXX) $(INCFLAGS) $(CPPFLAGS) $(CXXFLAGS) $(COUTFLAG)$@ -c $(CSRCFLAG)$<
         | 
| 238 | 
            +
             | 
| 239 | 
            +
            .cpp.S:
         | 
| 240 | 
            +
            	$(ECHO) translating $(<)
         | 
| 241 | 
            +
            	$(Q) $(CXX) $(INCFLAGS) $(CPPFLAGS) $(CXXFLAGS) $(COUTFLAG)$@ -S $(CSRCFLAG)$<
         | 
| 242 | 
            +
             | 
| 243 | 
            +
            .c.o:
         | 
| 244 | 
            +
            	$(ECHO) compiling $(<)
         | 
| 245 | 
            +
            	$(Q) $(CC) $(INCFLAGS) $(CPPFLAGS) $(CFLAGS) $(COUTFLAG)$@ -c $(CSRCFLAG)$<
         | 
| 246 | 
            +
             | 
| 247 | 
            +
            .c.S:
         | 
| 248 | 
            +
            	$(ECHO) translating $(<)
         | 
| 249 | 
            +
            	$(Q) $(CC) $(INCFLAGS) $(CPPFLAGS) $(CFLAGS) $(COUTFLAG)$@ -S $(CSRCFLAG)$<
         | 
| 250 | 
            +
             | 
| 251 | 
            +
            .m.o:
         | 
| 252 | 
            +
            	$(ECHO) compiling $(<)
         | 
| 253 | 
            +
            	$(Q) $(CC) $(INCFLAGS) $(CPPFLAGS) $(CFLAGS) $(COUTFLAG)$@ -c $(CSRCFLAG)$<
         | 
| 254 | 
            +
             | 
| 255 | 
            +
            .m.S:
         | 
| 256 | 
            +
            	$(ECHO) translating $(<)
         | 
| 257 | 
            +
            	$(Q) $(CC) $(INCFLAGS) $(CPPFLAGS) $(CFLAGS) $(COUTFLAG)$@ -S $(CSRCFLAG)$<
         | 
| 258 | 
            +
             | 
| 259 | 
            +
            $(TARGET_SO): $(OBJS) Makefile
         | 
| 260 | 
            +
            	$(ECHO) linking shared-object dynamodb-geo/$(DLLIB)
         | 
| 261 | 
            +
            	-$(Q)$(RM) $(@)
         | 
| 262 | 
            +
            	$(Q) $(LDSHARED) -o $@ $(OBJS) $(LIBPATH) $(DLDFLAGS) $(LOCAL_LIBS) $(LIBS)
         | 
| 263 | 
            +
             | 
| 264 | 
            +
             | 
| 265 | 
            +
             | 
| 266 | 
            +
            $(OBJS): $(HDRS) $(ruby_headers)
         | 
| @@ -0,0 +1,293 @@ | |
| 1 | 
            +
            /*
         | 
| 2 | 
            +
             *  geohash.c
         | 
| 3 | 
            +
             *  libgeohash
         | 
| 4 | 
            +
             *
         | 
| 5 | 
            +
             *  Created by Derek Smith on 10/6/09.
         | 
| 6 | 
            +
             *  Copyright (c) 2010, SimpleGeo
         | 
| 7 | 
            +
             *      All rights reserved.
         | 
| 8 | 
            +
             *
         | 
| 9 | 
            +
             *  Redistribution and use in source and binary forms, with or without 
         | 
| 10 | 
            +
             *  modification, are permitted provided that the following conditions are met:
         | 
| 11 | 
            +
             | 
| 12 | 
            +
             *  Redistributions of source code must retain the above copyright notice, this list
         | 
| 13 | 
            +
             *  of conditions and the following disclaimer. Redistributions in binary form must 
         | 
| 14 | 
            +
             *  reproduce the above copyright notice, this list of conditions and the following 
         | 
| 15 | 
            +
             *  disclaimer in the documentation and/or other materials provided with the distribution.
         | 
| 16 | 
            +
             *  Neither the name of the SimpleGeo nor the names of its contributors may be used
         | 
| 17 | 
            +
             *  to endorse or promote products derived from this software without specific prior 
         | 
| 18 | 
            +
             *  written permission. 
         | 
| 19 | 
            +
             *
         | 
| 20 | 
            +
             *  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY
         | 
| 21 | 
            +
             *  EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF 
         | 
| 22 | 
            +
             *  MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL 
         | 
| 23 | 
            +
             *  THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
         | 
| 24 | 
            +
             *  EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE 
         | 
| 25 | 
            +
             *  GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED 
         | 
| 26 | 
            +
             *  AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING 
         | 
| 27 | 
            +
             *  NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED 
         | 
| 28 | 
            +
             *  OF THE POSSIBILITY OF SUCH DAMAGE.
         | 
| 29 | 
            +
             */
         | 
| 30 | 
            +
             | 
| 31 | 
            +
            #include "geohash.h"
         | 
| 32 | 
            +
             | 
| 33 | 
            +
            #include <stdlib.h>
         | 
| 34 | 
            +
            #include <string.h>
         | 
| 35 | 
            +
            #include <stdio.h>
         | 
| 36 | 
            +
             | 
| 37 | 
            +
            #define MAX_LAT             90.0
         | 
| 38 | 
            +
            #define MIN_LAT             -90.0
         | 
| 39 | 
            +
             | 
| 40 | 
            +
            #define MAX_LONG            180.0
         | 
| 41 | 
            +
            #define MIN_LONG            -180.0
         | 
| 42 | 
            +
             | 
| 43 | 
            +
            #define NORTH               0
         | 
| 44 | 
            +
            #define EAST                1
         | 
| 45 | 
            +
            #define SOUTH               2
         | 
| 46 | 
            +
            #define WEST                3
         | 
| 47 | 
            +
             | 
| 48 | 
            +
            #define LENGTH_OF_DEGREE	111100				// meters
         | 
| 49 | 
            +
             | 
| 50 | 
            +
            typedef struct IntervalStruct {
         | 
| 51 | 
            +
                
         | 
| 52 | 
            +
                double high;
         | 
| 53 | 
            +
                double low;
         | 
| 54 | 
            +
                
         | 
| 55 | 
            +
            } Interval;
         | 
| 56 | 
            +
             | 
| 57 | 
            +
             | 
| 58 | 
            +
            /* Normal 32 characer map used for geohashing */
         | 
| 59 | 
            +
            static char char_map[32] =  "0123456789bcdefghjkmnpqrstuvwxyz";
         | 
| 60 | 
            +
             | 
| 61 | 
            +
            /*
         | 
| 62 | 
            +
             *  The follow character maps were created by Dave Troy and used in his Javascript Geohashing
         | 
| 63 | 
            +
             *  library. http://github.com/davetroy/geohash-js
         | 
| 64 | 
            +
             */
         | 
| 65 | 
            +
            static char *even_neighbors[] = {"p0r21436x8zb9dcf5h7kjnmqesgutwvy",
         | 
| 66 | 
            +
                                            "bc01fg45238967deuvhjyznpkmstqrwx", 
         | 
| 67 | 
            +
                                            "14365h7k9dcfesgujnmqp0r2twvyx8zb",
         | 
| 68 | 
            +
                                            "238967debc01fg45kmstqrwxuvhjyznp"
         | 
| 69 | 
            +
                                            };
         | 
| 70 | 
            +
             | 
| 71 | 
            +
            static char *odd_neighbors[] = {"bc01fg45238967deuvhjyznpkmstqrwx", 
         | 
| 72 | 
            +
                                           "p0r21436x8zb9dcf5h7kjnmqesgutwvy",
         | 
| 73 | 
            +
                                            "238967debc01fg45kmstqrwxuvhjyznp",
         | 
| 74 | 
            +
                                           "14365h7k9dcfesgujnmqp0r2twvyx8zb"    
         | 
| 75 | 
            +
                                            };
         | 
| 76 | 
            +
             | 
| 77 | 
            +
            static char *even_borders[] = {"prxz", "bcfguvyz", "028b", "0145hjnp"};
         | 
| 78 | 
            +
            static char *odd_borders[] = {"bcfguvyz", "prxz", "0145hjnp", "028b"};
         | 
| 79 | 
            +
             | 
| 80 | 
            +
            unsigned int index_for_char(char c, char *string) {
         | 
| 81 | 
            +
                
         | 
| 82 | 
            +
                int index = -1;
         | 
| 83 | 
            +
                int string_amount = strlen(string);
         | 
| 84 | 
            +
                int i;
         | 
| 85 | 
            +
                for(i = 0; i < string_amount; i++) {
         | 
| 86 | 
            +
                    
         | 
| 87 | 
            +
                    if(c == string[i]) {
         | 
| 88 | 
            +
                        
         | 
| 89 | 
            +
                        index = i; 
         | 
| 90 | 
            +
                        break;
         | 
| 91 | 
            +
                    }
         | 
| 92 | 
            +
                    
         | 
| 93 | 
            +
                }
         | 
| 94 | 
            +
                
         | 
| 95 | 
            +
                return index;
         | 
| 96 | 
            +
            }
         | 
| 97 | 
            +
             | 
| 98 | 
            +
            char* get_neighbor(char *hash, int direction) {
         | 
| 99 | 
            +
                
         | 
| 100 | 
            +
                int hash_length = strlen(hash);
         | 
| 101 | 
            +
                
         | 
| 102 | 
            +
            	char last_char = hash[hash_length - 1];
         | 
| 103 | 
            +
                
         | 
| 104 | 
            +
                int is_odd = hash_length % 2;
         | 
| 105 | 
            +
                char **border = is_odd ? odd_borders : even_borders;
         | 
| 106 | 
            +
                char **neighbor = is_odd ? odd_neighbors : even_neighbors; 
         | 
| 107 | 
            +
                
         | 
| 108 | 
            +
                char *base = malloc(sizeof(char) * 1);
         | 
| 109 | 
            +
                base[0] = '\0';
         | 
| 110 | 
            +
                strncat(base, hash, hash_length - 1);
         | 
| 111 | 
            +
                
         | 
| 112 | 
            +
            	if(index_for_char(last_char, border[direction]) != -1)
         | 
| 113 | 
            +
            		base = get_neighbor(base, direction);
         | 
| 114 | 
            +
                
         | 
| 115 | 
            +
                int neighbor_index = index_for_char(last_char, neighbor[direction]);
         | 
| 116 | 
            +
                last_char = char_map[neighbor_index];
         | 
| 117 | 
            +
                    
         | 
| 118 | 
            +
                char *last_hash = malloc(sizeof(char) * 2);
         | 
| 119 | 
            +
                last_hash[0] = last_char;
         | 
| 120 | 
            +
                last_hash[1] = '\0';
         | 
| 121 | 
            +
                strcat(base, last_hash);
         | 
| 122 | 
            +
                free(last_hash);
         | 
| 123 | 
            +
                
         | 
| 124 | 
            +
            	return base;
         | 
| 125 | 
            +
            }
         | 
| 126 | 
            +
             | 
| 127 | 
            +
            char* geohash_encode(double lat, double lng, int precision) {
         | 
| 128 | 
            +
                
         | 
| 129 | 
            +
                if(precision < 1 || precision > 12)
         | 
| 130 | 
            +
                    precision = 6;
         | 
| 131 | 
            +
                
         | 
| 132 | 
            +
                char* hash = NULL;
         | 
| 133 | 
            +
                
         | 
| 134 | 
            +
                if(lat <= 90.0 && lat >= -90.0 && lng <= 180.0 && lng >= -180.0) {
         | 
| 135 | 
            +
                    
         | 
| 136 | 
            +
                    hash = (char*)malloc(sizeof(char) * (precision + 1));
         | 
| 137 | 
            +
                    hash[precision] = '\0';
         | 
| 138 | 
            +
                    
         | 
| 139 | 
            +
                    precision *= 5.0;
         | 
| 140 | 
            +
                    
         | 
| 141 | 
            +
                    Interval lat_interval = {MAX_LAT, MIN_LAT};
         | 
| 142 | 
            +
                    Interval lng_interval = {MAX_LONG, MIN_LONG};
         | 
| 143 | 
            +
             | 
| 144 | 
            +
                    Interval *interval;
         | 
| 145 | 
            +
                    double coord, mid;
         | 
| 146 | 
            +
                    int is_even = 1;
         | 
| 147 | 
            +
                    unsigned int hashChar = 0;
         | 
| 148 | 
            +
                    int i;
         | 
| 149 | 
            +
                    for(i = 1; i <= precision; i++) {
         | 
| 150 | 
            +
                     
         | 
| 151 | 
            +
                        if(is_even) {
         | 
| 152 | 
            +
                        
         | 
| 153 | 
            +
                            interval = &lng_interval;
         | 
| 154 | 
            +
                            coord = lng;                
         | 
| 155 | 
            +
                            
         | 
| 156 | 
            +
                        } else {
         | 
| 157 | 
            +
                            
         | 
| 158 | 
            +
                            interval = &lat_interval;
         | 
| 159 | 
            +
                            coord = lat;   
         | 
| 160 | 
            +
                        }
         | 
| 161 | 
            +
                        
         | 
| 162 | 
            +
                        mid = (interval->low + interval->high) / 2.0;
         | 
| 163 | 
            +
                        hashChar = hashChar << 1;
         | 
| 164 | 
            +
                        
         | 
| 165 | 
            +
                        if(coord > mid) {
         | 
| 166 | 
            +
                            
         | 
| 167 | 
            +
                            interval->low = mid;
         | 
| 168 | 
            +
                            hashChar |= 0x01;
         | 
| 169 | 
            +
                            
         | 
| 170 | 
            +
                        } else
         | 
| 171 | 
            +
                            interval->high = mid;
         | 
| 172 | 
            +
                        
         | 
| 173 | 
            +
                        if(!(i % 5)) {
         | 
| 174 | 
            +
                            
         | 
| 175 | 
            +
                            hash[(i - 1) / 5] = char_map[hashChar];
         | 
| 176 | 
            +
                            hashChar = 0;
         | 
| 177 | 
            +
             | 
| 178 | 
            +
                        }
         | 
| 179 | 
            +
                        
         | 
| 180 | 
            +
                        is_even = !is_even;
         | 
| 181 | 
            +
                    }
         | 
| 182 | 
            +
                 
         | 
| 183 | 
            +
                    
         | 
| 184 | 
            +
                }
         | 
| 185 | 
            +
                
         | 
| 186 | 
            +
                return hash;
         | 
| 187 | 
            +
            }
         | 
| 188 | 
            +
             | 
| 189 | 
            +
            GeoCoord geohash_decode(char *hash) {
         | 
| 190 | 
            +
                
         | 
| 191 | 
            +
                GeoCoord coordinate = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0};
         | 
| 192 | 
            +
                
         | 
| 193 | 
            +
                if(hash) {
         | 
| 194 | 
            +
                    
         | 
| 195 | 
            +
                    int char_amount = strlen(hash);
         | 
| 196 | 
            +
                    
         | 
| 197 | 
            +
                    if(char_amount) {
         | 
| 198 | 
            +
                        
         | 
| 199 | 
            +
                        unsigned int char_mapIndex;
         | 
| 200 | 
            +
                        Interval lat_interval = {MAX_LAT, MIN_LAT};
         | 
| 201 | 
            +
                        Interval lng_interval = {MAX_LONG, MIN_LONG};
         | 
| 202 | 
            +
                        Interval *interval;
         | 
| 203 | 
            +
                    
         | 
| 204 | 
            +
                        int is_even = 1;
         | 
| 205 | 
            +
                        double delta;
         | 
| 206 | 
            +
                        int i, j;
         | 
| 207 | 
            +
                        for(i = 0; i < char_amount; i++) {
         | 
| 208 | 
            +
                        
         | 
| 209 | 
            +
                            char_mapIndex = index_for_char(hash[i], (char*)char_map);
         | 
| 210 | 
            +
                            
         | 
| 211 | 
            +
                            if(char_mapIndex < 0)
         | 
| 212 | 
            +
                                break;
         | 
| 213 | 
            +
                        
         | 
| 214 | 
            +
                            // Interpret the last 5 bits of the integer
         | 
| 215 | 
            +
                            for(j = 0; j < 5; j++) {
         | 
| 216 | 
            +
                            
         | 
| 217 | 
            +
                                interval = is_even ? &lng_interval : &lat_interval;
         | 
| 218 | 
            +
                            
         | 
| 219 | 
            +
                                delta = (interval->high - interval->low) / 2.0;
         | 
| 220 | 
            +
                            
         | 
| 221 | 
            +
                                if((char_mapIndex << j) & 0x0010)
         | 
| 222 | 
            +
                                    interval->low += delta;
         | 
| 223 | 
            +
                                else
         | 
| 224 | 
            +
                                    interval->high -= delta;
         | 
| 225 | 
            +
                            
         | 
| 226 | 
            +
                                is_even = !is_even;
         | 
| 227 | 
            +
                            }
         | 
| 228 | 
            +
                        
         | 
| 229 | 
            +
                        }
         | 
| 230 | 
            +
                        
         | 
| 231 | 
            +
                        coordinate.latitude = lat_interval.high - ((lat_interval.high - lat_interval.low) / 2.0);
         | 
| 232 | 
            +
                        coordinate.longitude = lng_interval.high - ((lng_interval.high - lng_interval.low) / 2.0);
         | 
| 233 | 
            +
                        
         | 
| 234 | 
            +
                        coordinate.north = lat_interval.high;
         | 
| 235 | 
            +
                        coordinate.east = lng_interval.high;
         | 
| 236 | 
            +
                        coordinate.south = lat_interval.low;
         | 
| 237 | 
            +
                        coordinate.west = lng_interval.low;
         | 
| 238 | 
            +
                    }
         | 
| 239 | 
            +
                }
         | 
| 240 | 
            +
                
         | 
| 241 | 
            +
                return coordinate;
         | 
| 242 | 
            +
            }
         | 
| 243 | 
            +
             | 
| 244 | 
            +
             | 
| 245 | 
            +
            char** geohash_neighbors(char *hash) {
         | 
| 246 | 
            +
             | 
| 247 | 
            +
                char** neighbors = NULL;
         | 
| 248 | 
            +
                
         | 
| 249 | 
            +
                if(hash) {
         | 
| 250 | 
            +
                    
         | 
| 251 | 
            +
                    // N, NE, E, SE, S, SW, W, NW
         | 
| 252 | 
            +
                    neighbors = (char**)malloc(sizeof(char*) * 8);
         | 
| 253 | 
            +
                    
         | 
| 254 | 
            +
                    neighbors[0] = get_neighbor(hash, NORTH);
         | 
| 255 | 
            +
                    neighbors[1] = get_neighbor(neighbors[0], EAST);
         | 
| 256 | 
            +
                    neighbors[2] = get_neighbor(hash, EAST);
         | 
| 257 | 
            +
                    neighbors[3] = get_neighbor(neighbors[2], SOUTH);
         | 
| 258 | 
            +
                    neighbors[4] = get_neighbor(hash, SOUTH);
         | 
| 259 | 
            +
                    neighbors[5] = get_neighbor(neighbors[4], WEST);                
         | 
| 260 | 
            +
                    neighbors[6] = get_neighbor(hash, WEST);
         | 
| 261 | 
            +
                    neighbors[7] = get_neighbor(neighbors[6], NORTH);        
         | 
| 262 | 
            +
             | 
| 263 | 
            +
                }
         | 
| 264 | 
            +
                
         | 
| 265 | 
            +
                return neighbors;
         | 
| 266 | 
            +
            }
         | 
| 267 | 
            +
             | 
| 268 | 
            +
            GeoBoxDimension geohash_dimensions_for_precision(int precision) {
         | 
| 269 | 
            +
            	
         | 
| 270 | 
            +
            	GeoBoxDimension dimensions = {0.0, 0.0};
         | 
| 271 | 
            +
            	
         | 
| 272 | 
            +
            	if(precision > 0) {
         | 
| 273 | 
            +
            	
         | 
| 274 | 
            +
            		int lat_times_to_cut = precision * 5 / 2;
         | 
| 275 | 
            +
            		int lng_times_to_cut = precision * 5 / 2 + (precision % 2 ? 1 : 0);
         | 
| 276 | 
            +
            	
         | 
| 277 | 
            +
            		double width = 360.0;
         | 
| 278 | 
            +
            		double height = 180.0;
         | 
| 279 | 
            +
            	
         | 
| 280 | 
            +
            		int i;
         | 
| 281 | 
            +
            		for(i = 0; i < lat_times_to_cut; i++)
         | 
| 282 | 
            +
            			height /= 2.0;
         | 
| 283 | 
            +
            		
         | 
| 284 | 
            +
            		for(i = 0; i < lng_times_to_cut; i++)
         | 
| 285 | 
            +
            			width /= 2.0;
         | 
| 286 | 
            +
            		
         | 
| 287 | 
            +
            		dimensions.width = width;
         | 
| 288 | 
            +
            		dimensions.height = height;
         | 
| 289 | 
            +
            		
         | 
| 290 | 
            +
            	}
         | 
| 291 | 
            +
            	
         | 
| 292 | 
            +
            	return dimensions;
         | 
| 293 | 
            +
            }
         | 
| @@ -0,0 +1,77 @@ | |
| 1 | 
            +
            /*
         | 
| 2 | 
            +
             *  geohash.h
         | 
| 3 | 
            +
             *  libgeohash
         | 
| 4 | 
            +
             *
         | 
| 5 | 
            +
             *  Created by Derek Smith on 10/6/09.
         | 
| 6 | 
            +
             *  Copyright (c) 2010, SimpleGeo
         | 
| 7 | 
            +
             *	All rights reserved.
         | 
| 8 | 
            +
             *
         | 
| 9 | 
            +
             *  Redistribution and use in source and binary forms, with or without 
         | 
| 10 | 
            +
             *  modification, are permitted provided that the following conditions are met:
         | 
| 11 | 
            +
             | 
| 12 | 
            +
             *  Redistributions of source code must retain the above copyright notice, this list
         | 
| 13 | 
            +
             *  of conditions and the following disclaimer. Redistributions in binary form must 
         | 
| 14 | 
            +
             *  reproduce the above copyright notice, this list of conditions and the following 
         | 
| 15 | 
            +
             *  disclaimer in the documentation and/or other materials provided with the distribution.
         | 
| 16 | 
            +
             *  Neither the name of the SimpleGeo nor the names of its contributors may be used
         | 
| 17 | 
            +
             *  to endorse or promote products derived from this software without specific prior 
         | 
| 18 | 
            +
             *  written permission. 
         | 
| 19 | 
            +
             *
         | 
| 20 | 
            +
             *  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY
         | 
| 21 | 
            +
             *  EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF 
         | 
| 22 | 
            +
             *  MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL 
         | 
| 23 | 
            +
             *  THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
         | 
| 24 | 
            +
             *  EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE 
         | 
| 25 | 
            +
             *  GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED 
         | 
| 26 | 
            +
             *  AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING 
         | 
| 27 | 
            +
             *  NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED 
         | 
| 28 | 
            +
             *  OF THE POSSIBILITY OF SUCH DAMAGE.
         | 
| 29 | 
            +
             */
         | 
| 30 | 
            +
             | 
| 31 | 
            +
            // Metric in meters
         | 
| 32 | 
            +
            typedef struct GeoBoxDimensionStruct {
         | 
| 33 | 
            +
            	
         | 
| 34 | 
            +
            	double height;
         | 
| 35 | 
            +
            	double width;
         | 
| 36 | 
            +
             | 
| 37 | 
            +
            } GeoBoxDimension;
         | 
| 38 | 
            +
             | 
| 39 | 
            +
            typedef struct GeoCoordStruct {
         | 
| 40 | 
            +
                
         | 
| 41 | 
            +
                double latitude;
         | 
| 42 | 
            +
                double longitude;
         | 
| 43 | 
            +
                
         | 
| 44 | 
            +
                double north;
         | 
| 45 | 
            +
                double east;
         | 
| 46 | 
            +
                double south;
         | 
| 47 | 
            +
                double west;
         | 
| 48 | 
            +
             | 
| 49 | 
            +
            	GeoBoxDimension dimension;
         | 
| 50 | 
            +
                
         | 
| 51 | 
            +
            } GeoCoord;
         | 
| 52 | 
            +
             | 
| 53 | 
            +
            /*
         | 
| 54 | 
            +
             * Creates a the hash at the specified precision. If precision is set to 0.
         | 
| 55 | 
            +
             * or less than it defaults to 12.
         | 
| 56 | 
            +
             */
         | 
| 57 | 
            +
            extern char* geohash_encode(double lat, double lng, int precision);
         | 
| 58 | 
            +
             | 
| 59 | 
            +
            /* 
         | 
| 60 | 
            +
             * Returns the latitude and longitude used to create the hash along with
         | 
| 61 | 
            +
             * the bounding box for the encoded coordinate.
         | 
| 62 | 
            +
             */
         | 
| 63 | 
            +
            extern GeoCoord geohash_decode(char* hash);
         | 
| 64 | 
            +
             | 
| 65 | 
            +
            /* 
         | 
| 66 | 
            +
             * Return an array of geohashes that represent the neighbors of the passed
         | 
| 67 | 
            +
             * in value. The neighbors are indexed as followed:
         | 
| 68 | 
            +
             *
         | 
| 69 | 
            +
             *                  N, NE, E, SE, S, SW, W, NW
         | 
| 70 | 
            +
             * 					0, 1,  2,  3, 4,  5, 6, 7
         | 
| 71 | 
            +
             */ 
         | 
| 72 | 
            +
            extern char** geohash_neighbors(char* hash);
         | 
| 73 | 
            +
             | 
| 74 | 
            +
            /*
         | 
| 75 | 
            +
             * Returns the width and height of a precision value.
         | 
| 76 | 
            +
             */
         | 
| 77 | 
            +
            extern GeoBoxDimension geohash_dimensions_for_precision(int precision);
         | 
| @@ -0,0 +1,70 @@ | |
| 1 | 
            +
            #include "ruby.h"
         | 
| 2 | 
            +
            #include "extconf.h"
         | 
| 3 | 
            +
            #include "geohash.h"
         | 
| 4 | 
            +
            #include <stdio.h>
         | 
| 5 | 
            +
             | 
| 6 | 
            +
            void Init_geohash_wrapper();
         | 
| 7 | 
            +
            VALUE wrap_geohash_encode(VALUE self, VALUE lat, VALUE lng, VALUE precision);
         | 
| 8 | 
            +
            VALUE wrap_geohash_decode(VALUE self, VALUE hash);
         | 
| 9 | 
            +
            VALUE wrap_geohash_neighbors(VALUE self, VALUE hash);
         | 
| 10 | 
            +
            VALUE wrap_geohash_dimensions_for_precision(VALUE self, VALUE precision);
         | 
| 11 | 
            +
             | 
| 12 | 
            +
             | 
| 13 | 
            +
            void Init_geohash_wrapper()
         | 
| 14 | 
            +
            {
         | 
| 15 | 
            +
              VALUE Geohash;
         | 
| 16 | 
            +
              Geohash = rb_define_class("Geohash", rb_cObject);
         | 
| 17 | 
            +
             | 
| 18 | 
            +
              rb_define_singleton_method(Geohash, "encode",                   wrap_geohash_encode, 3);
         | 
| 19 | 
            +
              rb_define_singleton_method(Geohash, "wrap_decode",              wrap_geohash_decode, 1);
         | 
| 20 | 
            +
              rb_define_singleton_method(Geohash, "neighbours",               wrap_geohash_neighbors, 1);
         | 
| 21 | 
            +
              rb_define_singleton_method(Geohash, "dimensions_for_precision", wrap_geohash_dimensions_for_precision, 1);
         | 
| 22 | 
            +
            }
         | 
| 23 | 
            +
             | 
| 24 | 
            +
            VALUE wrap_geohash_encode(VALUE self, VALUE lat, VALUE lng, VALUE precision) {
         | 
| 25 | 
            +
              return rb_str_new_cstr(geohash_encode(NUM2DBL(lat), NUM2DBL(lng), NUM2INT(precision)));
         | 
| 26 | 
            +
            }
         | 
| 27 | 
            +
             | 
| 28 | 
            +
            VALUE wrap_geohash_decode(VALUE self, VALUE hash) {
         | 
| 29 | 
            +
              GeoCoord decode;
         | 
| 30 | 
            +
              VALUE r_hash      = rb_hash_new();
         | 
| 31 | 
            +
              VALUE r_dimension = rb_hash_new();
         | 
| 32 | 
            +
             | 
| 33 | 
            +
              decode = geohash_decode(StringValueCStr(hash));
         | 
| 34 | 
            +
             | 
| 35 | 
            +
              rb_hash_aset(r_dimension, rb_str_new2("height"), DBL2NUM(decode.dimension.height));
         | 
| 36 | 
            +
              rb_hash_aset(r_dimension, rb_str_new2("width"),  DBL2NUM(decode.dimension.width));
         | 
| 37 | 
            +
             | 
| 38 | 
            +
              rb_hash_aset(r_hash, rb_str_new2("latitude"),  DBL2NUM(decode.latitude));
         | 
| 39 | 
            +
              rb_hash_aset(r_hash, rb_str_new2("longitude"), DBL2NUM(decode.longitude));
         | 
| 40 | 
            +
              rb_hash_aset(r_hash, rb_str_new2("north"),     DBL2NUM(decode.north));
         | 
| 41 | 
            +
              rb_hash_aset(r_hash, rb_str_new2("south"),     DBL2NUM(decode.south));
         | 
| 42 | 
            +
              rb_hash_aset(r_hash, rb_str_new2("east"),      DBL2NUM(decode.east));
         | 
| 43 | 
            +
              rb_hash_aset(r_hash, rb_str_new2("west"),      DBL2NUM(decode.west));
         | 
| 44 | 
            +
              rb_hash_aset(r_hash, rb_str_new2("dimension"), r_dimension);
         | 
| 45 | 
            +
             | 
| 46 | 
            +
              return r_hash;
         | 
| 47 | 
            +
            }
         | 
| 48 | 
            +
             | 
| 49 | 
            +
            VALUE wrap_geohash_neighbors(VALUE self, VALUE hash) {
         | 
| 50 | 
            +
              char** hashed_neighbours = geohash_neighbors(StringValueCStr(hash));
         | 
| 51 | 
            +
              VALUE neighbours = rb_ary_new2(8);
         | 
| 52 | 
            +
              int i;
         | 
| 53 | 
            +
             | 
| 54 | 
            +
              for (i = 0; i <= 7; i++) {
         | 
| 55 | 
            +
                rb_ary_store(neighbours, i, rb_str_new_cstr(hashed_neighbours[i]));
         | 
| 56 | 
            +
              }
         | 
| 57 | 
            +
              return neighbours;
         | 
| 58 | 
            +
            }
         | 
| 59 | 
            +
             | 
| 60 | 
            +
            VALUE wrap_geohash_dimensions_for_precision(VALUE self, VALUE precision) {
         | 
| 61 | 
            +
              GeoBoxDimension dimension;
         | 
| 62 | 
            +
              VALUE r_hash = rb_hash_new();
         | 
| 63 | 
            +
             | 
| 64 | 
            +
              dimension = geohash_dimensions_for_precision(NUM2INT(precision));
         | 
| 65 | 
            +
             | 
| 66 | 
            +
              rb_hash_aset(r_hash, rb_str_new2("height"), DBL2NUM(dimension.height));
         | 
| 67 | 
            +
              rb_hash_aset(r_hash, rb_str_new2("width"),  DBL2NUM(dimension.width));
         | 
| 68 | 
            +
             | 
| 69 | 
            +
              return r_hash;
         | 
| 70 | 
            +
            }
         | 
    
        data/lib/dynamodb_geo.rb
    ADDED
    
    | @@ -0,0 +1 @@ | |
| 1 | 
            +
            require 'geohash'
         | 
    
        data/lib/geohash.rb
    ADDED
    
    | @@ -0,0 +1,35 @@ | |
| 1 | 
            +
            require 'geohash/geohash_wrapper'
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            class Geohash
         | 
| 4 | 
            +
              class << self
         | 
| 5 | 
            +
                def decode(hash)
         | 
| 6 | 
            +
                  Geocoord.new(wrap_decode(hash)).freeze
         | 
| 7 | 
            +
                end
         | 
| 8 | 
            +
             | 
| 9 | 
            +
                def dimensions(precision)
         | 
| 10 | 
            +
                  Dimension.new(dimensions_for_precision(precision)).freeze
         | 
| 11 | 
            +
                end
         | 
| 12 | 
            +
              end
         | 
| 13 | 
            +
            end
         | 
| 14 | 
            +
             | 
| 15 | 
            +
            class Geocoord
         | 
| 16 | 
            +
              attr_accessor :latitude, :longitude, :north, :south, :east, :west, :dimension
         | 
| 17 | 
            +
              def initialize(geocoord)
         | 
| 18 | 
            +
                @latitude  = geocoord['latitude']
         | 
| 19 | 
            +
                @longitude = geocoord['longitude']
         | 
| 20 | 
            +
                @north     = geocoord['north']
         | 
| 21 | 
            +
                @south     = geocoord['south']
         | 
| 22 | 
            +
                @east      = geocoord['east']
         | 
| 23 | 
            +
                @west      = geocoord['west']
         | 
| 24 | 
            +
                @dimension = Dimension.new(geocoord['dimension'])
         | 
| 25 | 
            +
              end
         | 
| 26 | 
            +
            end
         | 
| 27 | 
            +
             | 
| 28 | 
            +
            class Dimension
         | 
| 29 | 
            +
              attr_accessor :length, :width
         | 
| 30 | 
            +
             | 
| 31 | 
            +
              def initialize(geobox)
         | 
| 32 | 
            +
                length = geobox['length']
         | 
| 33 | 
            +
                width  = geobox['width']
         | 
| 34 | 
            +
              end
         | 
| 35 | 
            +
            end
         | 
| Binary file | 
| @@ -0,0 +1 @@ | |
| 1 | 
            +
            require 'spec_helper'
         | 
| @@ -0,0 +1,34 @@ | |
| 1 | 
            +
            require 'spec_helper'
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            # Quick note, I'm not actually testing if the Geohash is accurate or not.
         | 
| 4 | 
            +
            # I'm assuming the C Lib I imported is doing that for me properly.
         | 
| 5 | 
            +
            describe Geohash do
         | 
| 6 | 
            +
              describe '.encode' do
         | 
| 7 | 
            +
                it 'encodes' do
         | 
| 8 | 
            +
                  encode = Geohash.encode(1,1,1)
         | 
| 9 | 
            +
                  expect(encode).to be_a String
         | 
| 10 | 
            +
                end
         | 
| 11 | 
            +
              end
         | 
| 12 | 
            +
             | 
| 13 | 
            +
              describe '.decode' do
         | 
| 14 | 
            +
                it 'decodes' do
         | 
| 15 | 
            +
                  decode = Geohash.decode('s')
         | 
| 16 | 
            +
                  expect(decode).to be_a Geocoord
         | 
| 17 | 
            +
                end
         | 
| 18 | 
            +
              end
         | 
| 19 | 
            +
             | 
| 20 | 
            +
              describe '.neighbours' do
         | 
| 21 | 
            +
                it 'finds my neighbours' do
         | 
| 22 | 
            +
                  neighbours = Geohash.neighbours('s')
         | 
| 23 | 
            +
                  expect(neighbours.sample).to be_a String
         | 
| 24 | 
            +
                  expect(neighbours.length).to be 8
         | 
| 25 | 
            +
                end
         | 
| 26 | 
            +
              end
         | 
| 27 | 
            +
             | 
| 28 | 
            +
              describe '.precision' do
         | 
| 29 | 
            +
                it 'calculates the dimensions for precision' do
         | 
| 30 | 
            +
                  dimensions = Geohash.dimensions(1)
         | 
| 31 | 
            +
                  expect(dimensions).to be_a Dimension
         | 
| 32 | 
            +
                end
         | 
| 33 | 
            +
              end
         | 
| 34 | 
            +
            end
         | 
    
        data/spec/spec_helper.rb
    ADDED
    
    
    
        metadata
    ADDED
    
    | @@ -0,0 +1,132 @@ | |
| 1 | 
            +
            --- !ruby/object:Gem::Specification
         | 
| 2 | 
            +
            name: dynamodb_geo
         | 
| 3 | 
            +
            version: !ruby/object:Gem::Version
         | 
| 4 | 
            +
              version: 0.0.2
         | 
| 5 | 
            +
            platform: ruby
         | 
| 6 | 
            +
            authors:
         | 
| 7 | 
            +
            - Justin Ahn
         | 
| 8 | 
            +
            autorequire: 
         | 
| 9 | 
            +
            bindir: bin
         | 
| 10 | 
            +
            cert_chain: []
         | 
| 11 | 
            +
            date: 2020-08-04 00:00:00.000000000 Z
         | 
| 12 | 
            +
            dependencies:
         | 
| 13 | 
            +
            - !ruby/object:Gem::Dependency
         | 
| 14 | 
            +
              name: rspec
         | 
| 15 | 
            +
              requirement: !ruby/object:Gem::Requirement
         | 
| 16 | 
            +
                requirements:
         | 
| 17 | 
            +
                - - ">="
         | 
| 18 | 
            +
                  - !ruby/object:Gem::Version
         | 
| 19 | 
            +
                    version: '0'
         | 
| 20 | 
            +
              type: :development
         | 
| 21 | 
            +
              prerelease: false
         | 
| 22 | 
            +
              version_requirements: !ruby/object:Gem::Requirement
         | 
| 23 | 
            +
                requirements:
         | 
| 24 | 
            +
                - - ">="
         | 
| 25 | 
            +
                  - !ruby/object:Gem::Version
         | 
| 26 | 
            +
                    version: '0'
         | 
| 27 | 
            +
            - !ruby/object:Gem::Dependency
         | 
| 28 | 
            +
              name: byebug
         | 
| 29 | 
            +
              requirement: !ruby/object:Gem::Requirement
         | 
| 30 | 
            +
                requirements:
         | 
| 31 | 
            +
                - - ">="
         | 
| 32 | 
            +
                  - !ruby/object:Gem::Version
         | 
| 33 | 
            +
                    version: '0'
         | 
| 34 | 
            +
              type: :development
         | 
| 35 | 
            +
              prerelease: false
         | 
| 36 | 
            +
              version_requirements: !ruby/object:Gem::Requirement
         | 
| 37 | 
            +
                requirements:
         | 
| 38 | 
            +
                - - ">="
         | 
| 39 | 
            +
                  - !ruby/object:Gem::Version
         | 
| 40 | 
            +
                    version: '0'
         | 
| 41 | 
            +
            - !ruby/object:Gem::Dependency
         | 
| 42 | 
            +
              name: rake-compiler
         | 
| 43 | 
            +
              requirement: !ruby/object:Gem::Requirement
         | 
| 44 | 
            +
                requirements:
         | 
| 45 | 
            +
                - - ">="
         | 
| 46 | 
            +
                  - !ruby/object:Gem::Version
         | 
| 47 | 
            +
                    version: '0'
         | 
| 48 | 
            +
              type: :development
         | 
| 49 | 
            +
              prerelease: false
         | 
| 50 | 
            +
              version_requirements: !ruby/object:Gem::Requirement
         | 
| 51 | 
            +
                requirements:
         | 
| 52 | 
            +
                - - ">="
         | 
| 53 | 
            +
                  - !ruby/object:Gem::Version
         | 
| 54 | 
            +
                    version: '0'
         | 
| 55 | 
            +
            - !ruby/object:Gem::Dependency
         | 
| 56 | 
            +
              name: aws-sdk-dynamodb
         | 
| 57 | 
            +
              requirement: !ruby/object:Gem::Requirement
         | 
| 58 | 
            +
                requirements:
         | 
| 59 | 
            +
                - - "~>"
         | 
| 60 | 
            +
                  - !ruby/object:Gem::Version
         | 
| 61 | 
            +
                    version: '1'
         | 
| 62 | 
            +
              type: :runtime
         | 
| 63 | 
            +
              prerelease: false
         | 
| 64 | 
            +
              version_requirements: !ruby/object:Gem::Requirement
         | 
| 65 | 
            +
                requirements:
         | 
| 66 | 
            +
                - - "~>"
         | 
| 67 | 
            +
                  - !ruby/object:Gem::Version
         | 
| 68 | 
            +
                    version: '1'
         | 
| 69 | 
            +
            - !ruby/object:Gem::Dependency
         | 
| 70 | 
            +
              name: aws-sdk-dynamodbstreams
         | 
| 71 | 
            +
              requirement: !ruby/object:Gem::Requirement
         | 
| 72 | 
            +
                requirements:
         | 
| 73 | 
            +
                - - "~>"
         | 
| 74 | 
            +
                  - !ruby/object:Gem::Version
         | 
| 75 | 
            +
                    version: '1'
         | 
| 76 | 
            +
              type: :runtime
         | 
| 77 | 
            +
              prerelease: false
         | 
| 78 | 
            +
              version_requirements: !ruby/object:Gem::Requirement
         | 
| 79 | 
            +
                requirements:
         | 
| 80 | 
            +
                - - "~>"
         | 
| 81 | 
            +
                  - !ruby/object:Gem::Version
         | 
| 82 | 
            +
                    version: '1'
         | 
| 83 | 
            +
            description: A port of dynamodb_geo to Ruby. Includes a geohash module.
         | 
| 84 | 
            +
            email: justin@soonahn.ca
         | 
| 85 | 
            +
            executables: []
         | 
| 86 | 
            +
            extensions:
         | 
| 87 | 
            +
            - ext/geohash_wrapper/extconf.rb
         | 
| 88 | 
            +
            extra_rdoc_files:
         | 
| 89 | 
            +
            - README.md
         | 
| 90 | 
            +
            files:
         | 
| 91 | 
            +
            - README.md
         | 
| 92 | 
            +
            - ext/geohash_wrapper/Makefile
         | 
| 93 | 
            +
            - ext/geohash_wrapper/extconf.h
         | 
| 94 | 
            +
            - ext/geohash_wrapper/extconf.rb
         | 
| 95 | 
            +
            - ext/geohash_wrapper/geohash.c
         | 
| 96 | 
            +
            - ext/geohash_wrapper/geohash.h
         | 
| 97 | 
            +
            - ext/geohash_wrapper/geohash_wrapper.c
         | 
| 98 | 
            +
            - lib/dynamodb_geo.rb
         | 
| 99 | 
            +
            - lib/dynamodb_geo/version.rb
         | 
| 100 | 
            +
            - lib/geohash.rb
         | 
| 101 | 
            +
            - lib/geohash/geohash_wrapper.so
         | 
| 102 | 
            +
            - spec/dynamodb_geo.rb
         | 
| 103 | 
            +
            - spec/geohash_spec.rb
         | 
| 104 | 
            +
            - spec/spec_helper.rb
         | 
| 105 | 
            +
            homepage: 
         | 
| 106 | 
            +
            licenses:
         | 
| 107 | 
            +
            - Beerware
         | 
| 108 | 
            +
            metadata:
         | 
| 109 | 
            +
              source_code_uri: https://github.com/JA-Soonahn/dynamodb_geo
         | 
| 110 | 
            +
            post_install_message: 
         | 
| 111 | 
            +
            rdoc_options: []
         | 
| 112 | 
            +
            require_paths:
         | 
| 113 | 
            +
            - lib
         | 
| 114 | 
            +
            required_ruby_version: !ruby/object:Gem::Requirement
         | 
| 115 | 
            +
              requirements:
         | 
| 116 | 
            +
              - - ">="
         | 
| 117 | 
            +
                - !ruby/object:Gem::Version
         | 
| 118 | 
            +
                  version: '0'
         | 
| 119 | 
            +
            required_rubygems_version: !ruby/object:Gem::Requirement
         | 
| 120 | 
            +
              requirements:
         | 
| 121 | 
            +
              - - ">="
         | 
| 122 | 
            +
                - !ruby/object:Gem::Version
         | 
| 123 | 
            +
                  version: '0'
         | 
| 124 | 
            +
            requirements: []
         | 
| 125 | 
            +
            rubygems_version: 3.1.2
         | 
| 126 | 
            +
            signing_key: 
         | 
| 127 | 
            +
            specification_version: 4
         | 
| 128 | 
            +
            summary: dynamodb_geo-0.0.1
         | 
| 129 | 
            +
            test_files:
         | 
| 130 | 
            +
            - spec/dynamodb_geo.rb
         | 
| 131 | 
            +
            - spec/geohash_spec.rb
         | 
| 132 | 
            +
            - spec/spec_helper.rb
         |