From e236bf0e0b51322f30e8d9db2edcf12d0ddf0931 Mon Sep 17 00:00:00 2001 From: John Pope Date: Fri, 16 Dec 2016 15:20:39 -0500 Subject: [PATCH 1/2] example of maprect returning hash grid. --- Classes/ARC/GHArea.h | 0 Classes/ARC/GHArea.m | 0 Classes/ARC/GHNeighbors.h | 0 Classes/ARC/GHNeighbors.m | 0 Classes/ARC/GHRange.h | 0 Classes/ARC/GHRange.m | 0 Classes/ARC/GeoHash.h | 0 Classes/ARC/GeoHash.m | 0 Classes/ARC/cgeohash.h | 0 Classes/ARC/cgeohash.m | 0 Classes/NonARC/GHArea.h | 0 Classes/NonARC/GHArea.m | 0 Classes/NonARC/GHNeighbors.h | 0 Classes/NonARC/GHNeighbors.m | 0 Classes/NonARC/GHRange.h | 0 Classes/NonARC/GHRange.m | 0 Classes/NonARC/GeoHash.h | 0 Classes/NonARC/GeoHash.m | 0 Classes/NonARC/cgeohash.h | 0 Classes/NonARC/cgeohash.m | 0 LICENSE | 0 .../GeoHashExample.xcodeproj/project.pbxproj | 35 +++++- .../contents.xcworkspacedata | 0 .../UserInterfaceState.xcuserstate | Bin 0 -> 23444 bytes .../UserInterfaceState.xcuserstate | Bin .../xcdebugger/Breakpoints_v2.xcbkptlist | 71 +++++++++++ .../xcschemes/GeoHashExample.xcscheme | 91 +++++++++++++++ .../xcschemes/GeoHashExampleTests.xcscheme | 80 +++++++++++++ .../xcschemes/xcschememanagement.plist | 32 +++++ .../xcdebugger/Breakpoints.xcbkptlist | 0 .../xcschemes/GeoHashExample.xcscheme | 0 .../xcschemes/xcschememanagement.plist | 0 .../GeoHashExample/GeoHashExample/GHArea.h | 0 .../GeoHashExample/GeoHashExample/GHArea.m | 0 .../GeoHashExample/GHNeighbors.h | 0 .../GeoHashExample/GHNeighbors.m | 0 .../GeoHashExample/GeoHashExample/GHRange.h | 0 .../GeoHashExample/GeoHashExample/GHRange.m | 0 .../GeoHashExample/GeoHashExample/GeoHash.h | 0 .../GeoHashExample/GeoHashExample/GeoHash.m | 0 .../GeoHashExample/GeoHashExample-Info.plist | 2 +- .../GeoHashExample/GeoHashExample-Prefix.pch | 0 .../GeoHashExampleAppDelegate.h | 0 .../GeoHashExampleAppDelegate.m | 0 .../GeoHashExampleViewController.h | 12 +- .../GeoHashExampleViewController.m | 73 ++++++------ .../GeoHashExample/GeoHashExample/GeoHelper.h | 17 +++ .../GeoHashExample/GeoHashExample/GeoHelper.m | 110 ++++++++++++++++++ .../GeoHashExample/GeoHashExample/NSBag.h | 13 +++ .../GeoHashExample/GeoHashExample/NSBag.m | 94 +++++++++++++++ .../GeoHashExample/GeoHashExample/cgeohash.h | 0 .../GeoHashExample/GeoHashExample/cgeohash.m | 0 .../en.lproj/GeoHashExampleViewController.xib | 0 .../GeoHashExample/en.lproj/InfoPlist.strings | 0 Projects/GeoHashExample/GeoHashExample/main.m | 0 .../GeoHashExampleTests-Info.plist | 0 .../GeoHashExampleTests/GeoHashTestCase.h | 0 .../GeoHashExampleTests/GeoHashTestCase.m | 0 .../en.lproj/InfoPlist.strings | 0 README | 0 objc-geohash.podspec | 0 61 files changed, 581 insertions(+), 49 deletions(-) mode change 100644 => 100755 Classes/ARC/GHArea.h mode change 100644 => 100755 Classes/ARC/GHArea.m mode change 100644 => 100755 Classes/ARC/GHNeighbors.h mode change 100644 => 100755 Classes/ARC/GHNeighbors.m mode change 100644 => 100755 Classes/ARC/GHRange.h mode change 100644 => 100755 Classes/ARC/GHRange.m mode change 100644 => 100755 Classes/ARC/GeoHash.h mode change 100644 => 100755 Classes/ARC/GeoHash.m mode change 100644 => 100755 Classes/ARC/cgeohash.h mode change 100644 => 100755 Classes/ARC/cgeohash.m mode change 100644 => 100755 Classes/NonARC/GHArea.h mode change 100644 => 100755 Classes/NonARC/GHArea.m mode change 100644 => 100755 Classes/NonARC/GHNeighbors.h mode change 100644 => 100755 Classes/NonARC/GHNeighbors.m mode change 100644 => 100755 Classes/NonARC/GHRange.h mode change 100644 => 100755 Classes/NonARC/GHRange.m mode change 100644 => 100755 Classes/NonARC/GeoHash.h mode change 100644 => 100755 Classes/NonARC/GeoHash.m mode change 100644 => 100755 Classes/NonARC/cgeohash.h mode change 100644 => 100755 Classes/NonARC/cgeohash.m mode change 100644 => 100755 LICENSE mode change 100644 => 100755 Projects/GeoHashExample/GeoHashExample.xcodeproj/project.pbxproj mode change 100644 => 100755 Projects/GeoHashExample/GeoHashExample.xcodeproj/project.xcworkspace/contents.xcworkspacedata create mode 100644 Projects/GeoHashExample/GeoHashExample.xcodeproj/project.xcworkspace/xcuserdata/johndpope.xcuserdatad/UserInterfaceState.xcuserstate mode change 100644 => 100755 Projects/GeoHashExample/GeoHashExample.xcodeproj/project.xcworkspace/xcuserdata/lyokato.xcuserdatad/UserInterfaceState.xcuserstate create mode 100644 Projects/GeoHashExample/GeoHashExample.xcodeproj/xcuserdata/johndpope.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist create mode 100644 Projects/GeoHashExample/GeoHashExample.xcodeproj/xcuserdata/johndpope.xcuserdatad/xcschemes/GeoHashExample.xcscheme create mode 100644 Projects/GeoHashExample/GeoHashExample.xcodeproj/xcuserdata/johndpope.xcuserdatad/xcschemes/GeoHashExampleTests.xcscheme create mode 100644 Projects/GeoHashExample/GeoHashExample.xcodeproj/xcuserdata/johndpope.xcuserdatad/xcschemes/xcschememanagement.plist mode change 100644 => 100755 Projects/GeoHashExample/GeoHashExample.xcodeproj/xcuserdata/lyokato.xcuserdatad/xcdebugger/Breakpoints.xcbkptlist mode change 100644 => 100755 Projects/GeoHashExample/GeoHashExample.xcodeproj/xcuserdata/lyokato.xcuserdatad/xcschemes/GeoHashExample.xcscheme mode change 100644 => 100755 Projects/GeoHashExample/GeoHashExample.xcodeproj/xcuserdata/lyokato.xcuserdatad/xcschemes/xcschememanagement.plist mode change 100644 => 100755 Projects/GeoHashExample/GeoHashExample/GHArea.h mode change 100644 => 100755 Projects/GeoHashExample/GeoHashExample/GHArea.m mode change 100644 => 100755 Projects/GeoHashExample/GeoHashExample/GHNeighbors.h mode change 100644 => 100755 Projects/GeoHashExample/GeoHashExample/GHNeighbors.m mode change 100644 => 100755 Projects/GeoHashExample/GeoHashExample/GHRange.h mode change 100644 => 100755 Projects/GeoHashExample/GeoHashExample/GHRange.m mode change 100644 => 100755 Projects/GeoHashExample/GeoHashExample/GeoHash.h mode change 100644 => 100755 Projects/GeoHashExample/GeoHashExample/GeoHash.m mode change 100644 => 100755 Projects/GeoHashExample/GeoHashExample/GeoHashExample-Info.plist mode change 100644 => 100755 Projects/GeoHashExample/GeoHashExample/GeoHashExample-Prefix.pch mode change 100644 => 100755 Projects/GeoHashExample/GeoHashExample/GeoHashExampleAppDelegate.h mode change 100644 => 100755 Projects/GeoHashExample/GeoHashExample/GeoHashExampleAppDelegate.m mode change 100644 => 100755 Projects/GeoHashExample/GeoHashExample/GeoHashExampleViewController.h mode change 100644 => 100755 Projects/GeoHashExample/GeoHashExample/GeoHashExampleViewController.m create mode 100644 Projects/GeoHashExample/GeoHashExample/GeoHelper.h create mode 100644 Projects/GeoHashExample/GeoHashExample/GeoHelper.m create mode 100755 Projects/GeoHashExample/GeoHashExample/NSBag.h create mode 100755 Projects/GeoHashExample/GeoHashExample/NSBag.m mode change 100644 => 100755 Projects/GeoHashExample/GeoHashExample/cgeohash.h mode change 100644 => 100755 Projects/GeoHashExample/GeoHashExample/cgeohash.m mode change 100644 => 100755 Projects/GeoHashExample/GeoHashExample/en.lproj/GeoHashExampleViewController.xib mode change 100644 => 100755 Projects/GeoHashExample/GeoHashExample/en.lproj/InfoPlist.strings mode change 100644 => 100755 Projects/GeoHashExample/GeoHashExample/main.m mode change 100644 => 100755 Projects/GeoHashExample/GeoHashExampleTests/GeoHashExampleTests-Info.plist mode change 100644 => 100755 Projects/GeoHashExample/GeoHashExampleTests/GeoHashTestCase.h mode change 100644 => 100755 Projects/GeoHashExample/GeoHashExampleTests/GeoHashTestCase.m mode change 100644 => 100755 Projects/GeoHashExample/GeoHashExampleTests/en.lproj/InfoPlist.strings mode change 100644 => 100755 README mode change 100644 => 100755 objc-geohash.podspec diff --git a/Classes/ARC/GHArea.h b/Classes/ARC/GHArea.h old mode 100644 new mode 100755 diff --git a/Classes/ARC/GHArea.m b/Classes/ARC/GHArea.m old mode 100644 new mode 100755 diff --git a/Classes/ARC/GHNeighbors.h b/Classes/ARC/GHNeighbors.h old mode 100644 new mode 100755 diff --git a/Classes/ARC/GHNeighbors.m b/Classes/ARC/GHNeighbors.m old mode 100644 new mode 100755 diff --git a/Classes/ARC/GHRange.h b/Classes/ARC/GHRange.h old mode 100644 new mode 100755 diff --git a/Classes/ARC/GHRange.m b/Classes/ARC/GHRange.m old mode 100644 new mode 100755 diff --git a/Classes/ARC/GeoHash.h b/Classes/ARC/GeoHash.h old mode 100644 new mode 100755 diff --git a/Classes/ARC/GeoHash.m b/Classes/ARC/GeoHash.m old mode 100644 new mode 100755 diff --git a/Classes/ARC/cgeohash.h b/Classes/ARC/cgeohash.h old mode 100644 new mode 100755 diff --git a/Classes/ARC/cgeohash.m b/Classes/ARC/cgeohash.m old mode 100644 new mode 100755 diff --git a/Classes/NonARC/GHArea.h b/Classes/NonARC/GHArea.h old mode 100644 new mode 100755 diff --git a/Classes/NonARC/GHArea.m b/Classes/NonARC/GHArea.m old mode 100644 new mode 100755 diff --git a/Classes/NonARC/GHNeighbors.h b/Classes/NonARC/GHNeighbors.h old mode 100644 new mode 100755 diff --git a/Classes/NonARC/GHNeighbors.m b/Classes/NonARC/GHNeighbors.m old mode 100644 new mode 100755 diff --git a/Classes/NonARC/GHRange.h b/Classes/NonARC/GHRange.h old mode 100644 new mode 100755 diff --git a/Classes/NonARC/GHRange.m b/Classes/NonARC/GHRange.m old mode 100644 new mode 100755 diff --git a/Classes/NonARC/GeoHash.h b/Classes/NonARC/GeoHash.h old mode 100644 new mode 100755 diff --git a/Classes/NonARC/GeoHash.m b/Classes/NonARC/GeoHash.m old mode 100644 new mode 100755 diff --git a/Classes/NonARC/cgeohash.h b/Classes/NonARC/cgeohash.h old mode 100644 new mode 100755 diff --git a/Classes/NonARC/cgeohash.m b/Classes/NonARC/cgeohash.m old mode 100644 new mode 100755 diff --git a/LICENSE b/LICENSE old mode 100644 new mode 100755 diff --git a/Projects/GeoHashExample/GeoHashExample.xcodeproj/project.pbxproj b/Projects/GeoHashExample/GeoHashExample.xcodeproj/project.pbxproj old mode 100644 new mode 100755 index 52f5369..52b2c75 --- a/Projects/GeoHashExample/GeoHashExample.xcodeproj/project.pbxproj +++ b/Projects/GeoHashExample/GeoHashExample.xcodeproj/project.pbxproj @@ -7,6 +7,10 @@ objects = { /* Begin PBXBuildFile section */ + 834D760E1E032654007429D7 /* MapKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 834D760D1E032654007429D7 /* MapKit.framework */; }; + 834D76101E032A8A007429D7 /* CoreLocation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 834D760F1E032A8A007429D7 /* CoreLocation.framework */; }; + 834D761E1E048025007429D7 /* GeoHelper.m in Sources */ = {isa = PBXBuildFile; fileRef = 834D761B1E048025007429D7 /* GeoHelper.m */; }; + 834D761F1E048025007429D7 /* NSBag.m in Sources */ = {isa = PBXBuildFile; fileRef = 834D761D1E048025007429D7 /* NSBag.m */; }; 908614F014AB34A400CA2B04 /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 908614EF14AB34A400CA2B04 /* UIKit.framework */; }; 908614F214AB34A400CA2B04 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 908614F114AB34A400CA2B04 /* Foundation.framework */; }; 908614F414AB34A400CA2B04 /* CoreGraphics.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 908614F314AB34A400CA2B04 /* CoreGraphics.framework */; }; @@ -39,6 +43,12 @@ /* End PBXContainerItemProxy section */ /* Begin PBXFileReference section */ + 834D760D1E032654007429D7 /* MapKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = MapKit.framework; path = System/Library/Frameworks/MapKit.framework; sourceTree = SDKROOT; }; + 834D760F1E032A8A007429D7 /* CoreLocation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreLocation.framework; path = System/Library/Frameworks/CoreLocation.framework; sourceTree = SDKROOT; }; + 834D761A1E048025007429D7 /* GeoHelper.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = GeoHelper.h; sourceTree = ""; }; + 834D761B1E048025007429D7 /* GeoHelper.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GeoHelper.m; sourceTree = ""; }; + 834D761C1E048025007429D7 /* NSBag.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = NSBag.h; sourceTree = ""; }; + 834D761D1E048025007429D7 /* NSBag.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = NSBag.m; sourceTree = ""; }; 908614EB14AB34A400CA2B04 /* GeoHashExample.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = GeoHashExample.app; sourceTree = BUILT_PRODUCTS_DIR; }; 908614EF14AB34A400CA2B04 /* UIKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = UIKit.framework; path = System/Library/Frameworks/UIKit.framework; sourceTree = SDKROOT; }; 908614F114AB34A400CA2B04 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = System/Library/Frameworks/Foundation.framework; sourceTree = SDKROOT; }; @@ -75,6 +85,8 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( + 834D76101E032A8A007429D7 /* CoreLocation.framework in Frameworks */, + 834D760E1E032654007429D7 /* MapKit.framework in Frameworks */, 908614F014AB34A400CA2B04 /* UIKit.framework in Frameworks */, 908614F214AB34A400CA2B04 /* Foundation.framework in Frameworks */, 908614F414AB34A400CA2B04 /* CoreGraphics.framework in Frameworks */, @@ -117,6 +129,8 @@ 908614EE14AB34A400CA2B04 /* Frameworks */ = { isa = PBXGroup; children = ( + 834D760F1E032A8A007429D7 /* CoreLocation.framework */, + 834D760D1E032654007429D7 /* MapKit.framework */, 908614EF14AB34A400CA2B04 /* UIKit.framework */, 908614F114AB34A400CA2B04 /* Foundation.framework */, 908614F314AB34A400CA2B04 /* CoreGraphics.framework */, @@ -128,6 +142,10 @@ 908614F514AB34A400CA2B04 /* GeoHashExample */ = { isa = PBXGroup; children = ( + 834D761A1E048025007429D7 /* GeoHelper.h */, + 834D761B1E048025007429D7 /* GeoHelper.m */, + 834D761C1E048025007429D7 /* NSBag.h */, + 834D761D1E048025007429D7 /* NSBag.m */, A7B48EB71A9206CF00F29AA5 /* objc-geohash (ARC) */, 908614FE14AB34A400CA2B04 /* GeoHashExampleAppDelegate.h */, 908614FF14AB34A400CA2B04 /* GeoHashExampleAppDelegate.m */, @@ -234,6 +252,11 @@ attributes = { LastUpgradeCheck = 0430; ORGANIZATIONNAME = "KATO Lyo"; + TargetAttributes = { + 908614EA14AB34A400CA2B04 = { + DevelopmentTeam = WMDZ2CQA8K; + }; + }; }; buildConfigurationList = 908614E514AB34A400CA2B04 /* Build configuration list for PBXProject "GeoHashExample" */; compatibilityVersion = "Xcode 3.2"; @@ -297,9 +320,11 @@ A7B48EC51A9206CF00F29AA5 /* GHNeighbors.m in Sources */, 908614FC14AB34A400CA2B04 /* main.m in Sources */, 9086150014AB34A400CA2B04 /* GeoHashExampleAppDelegate.m in Sources */, + 834D761E1E048025007429D7 /* GeoHelper.m in Sources */, A7B48EC21A9206CF00F29AA5 /* cgeohash.m in Sources */, 9086150314AB34A400CA2B04 /* GeoHashExampleViewController.m in Sources */, A7B48EC31A9206CF00F29AA5 /* GeoHash.m in Sources */, + 834D761F1E048025007429D7 /* NSBag.m in Sources */, A7B48EC41A9206CF00F29AA5 /* GHArea.m in Sources */, A7B48EC61A9206CF00F29AA5 /* GHRange.m in Sources */, ); @@ -372,7 +397,7 @@ GCC_WARN_ABOUT_MISSING_PROTOTYPES = YES; GCC_WARN_ABOUT_RETURN_TYPE = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 5.0; + IPHONEOS_DEPLOYMENT_TARGET = 8.0; SDKROOT = iphoneos; }; name = Debug; @@ -391,7 +416,7 @@ GCC_WARN_ABOUT_MISSING_PROTOTYPES = YES; GCC_WARN_ABOUT_RETURN_TYPE = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 5.0; + IPHONEOS_DEPLOYMENT_TARGET = 8.0; OTHER_CFLAGS = "-DNS_BLOCK_ASSERTIONS=1"; SDKROOT = iphoneos; VALIDATE_PRODUCT = YES; @@ -402,9 +427,12 @@ isa = XCBuildConfiguration; buildSettings = { CLANG_ENABLE_OBJC_ARC = YES; + DEVELOPMENT_TEAM = WMDZ2CQA8K; + ENABLE_BITCODE = YES; GCC_PRECOMPILE_PREFIX_HEADER = YES; GCC_PREFIX_HEADER = "GeoHashExample/GeoHashExample-Prefix.pch"; INFOPLIST_FILE = "GeoHashExample/GeoHashExample-Info.plist"; + PRODUCT_BUNDLE_IDENTIFIER = com.github.lyokato.geohash.GeoHashExample11; PRODUCT_NAME = "$(TARGET_NAME)"; WRAPPER_EXTENSION = app; }; @@ -414,9 +442,12 @@ isa = XCBuildConfiguration; buildSettings = { CLANG_ENABLE_OBJC_ARC = YES; + DEVELOPMENT_TEAM = WMDZ2CQA8K; + ENABLE_BITCODE = YES; GCC_PRECOMPILE_PREFIX_HEADER = YES; GCC_PREFIX_HEADER = "GeoHashExample/GeoHashExample-Prefix.pch"; INFOPLIST_FILE = "GeoHashExample/GeoHashExample-Info.plist"; + PRODUCT_BUNDLE_IDENTIFIER = com.github.lyokato.geohash.GeoHashExample11; PRODUCT_NAME = "$(TARGET_NAME)"; WRAPPER_EXTENSION = app; }; diff --git a/Projects/GeoHashExample/GeoHashExample.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/Projects/GeoHashExample/GeoHashExample.xcodeproj/project.xcworkspace/contents.xcworkspacedata old mode 100644 new mode 100755 diff --git a/Projects/GeoHashExample/GeoHashExample.xcodeproj/project.xcworkspace/xcuserdata/johndpope.xcuserdatad/UserInterfaceState.xcuserstate b/Projects/GeoHashExample/GeoHashExample.xcodeproj/project.xcworkspace/xcuserdata/johndpope.xcuserdatad/UserInterfaceState.xcuserstate new file mode 100644 index 0000000000000000000000000000000000000000..db69080a49a38cab81e4b601743be082e5b9e63f GIT binary patch literal 23444 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 ldU + + + + + + + + + + + + + + + + + + diff --git a/Projects/GeoHashExample/GeoHashExample.xcodeproj/xcuserdata/johndpope.xcuserdatad/xcschemes/GeoHashExample.xcscheme b/Projects/GeoHashExample/GeoHashExample.xcodeproj/xcuserdata/johndpope.xcuserdatad/xcschemes/GeoHashExample.xcscheme new file mode 100644 index 0000000..fb069aa --- /dev/null +++ b/Projects/GeoHashExample/GeoHashExample.xcodeproj/xcuserdata/johndpope.xcuserdatad/xcschemes/GeoHashExample.xcscheme @@ -0,0 +1,91 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Projects/GeoHashExample/GeoHashExample.xcodeproj/xcuserdata/johndpope.xcuserdatad/xcschemes/GeoHashExampleTests.xcscheme b/Projects/GeoHashExample/GeoHashExample.xcodeproj/xcuserdata/johndpope.xcuserdatad/xcschemes/GeoHashExampleTests.xcscheme new file mode 100644 index 0000000..d72e889 --- /dev/null +++ b/Projects/GeoHashExample/GeoHashExample.xcodeproj/xcuserdata/johndpope.xcuserdatad/xcschemes/GeoHashExampleTests.xcscheme @@ -0,0 +1,80 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Projects/GeoHashExample/GeoHashExample.xcodeproj/xcuserdata/johndpope.xcuserdatad/xcschemes/xcschememanagement.plist b/Projects/GeoHashExample/GeoHashExample.xcodeproj/xcuserdata/johndpope.xcuserdatad/xcschemes/xcschememanagement.plist new file mode 100644 index 0000000..36b3de2 --- /dev/null +++ b/Projects/GeoHashExample/GeoHashExample.xcodeproj/xcuserdata/johndpope.xcuserdatad/xcschemes/xcschememanagement.plist @@ -0,0 +1,32 @@ + + + + + SchemeUserState + + GeoHashExample.xcscheme + + orderHint + 0 + + GeoHashExampleTests.xcscheme + + orderHint + 1 + + + SuppressBuildableAutocreation + + 908614EA14AB34A400CA2B04 + + primary + + + 9086150B14AB34A400CA2B04 + + primary + + + + + diff --git a/Projects/GeoHashExample/GeoHashExample.xcodeproj/xcuserdata/lyokato.xcuserdatad/xcdebugger/Breakpoints.xcbkptlist b/Projects/GeoHashExample/GeoHashExample.xcodeproj/xcuserdata/lyokato.xcuserdatad/xcdebugger/Breakpoints.xcbkptlist old mode 100644 new mode 100755 diff --git a/Projects/GeoHashExample/GeoHashExample.xcodeproj/xcuserdata/lyokato.xcuserdatad/xcschemes/GeoHashExample.xcscheme b/Projects/GeoHashExample/GeoHashExample.xcodeproj/xcuserdata/lyokato.xcuserdatad/xcschemes/GeoHashExample.xcscheme old mode 100644 new mode 100755 diff --git a/Projects/GeoHashExample/GeoHashExample.xcodeproj/xcuserdata/lyokato.xcuserdatad/xcschemes/xcschememanagement.plist b/Projects/GeoHashExample/GeoHashExample.xcodeproj/xcuserdata/lyokato.xcuserdatad/xcschemes/xcschememanagement.plist old mode 100644 new mode 100755 diff --git a/Projects/GeoHashExample/GeoHashExample/GHArea.h b/Projects/GeoHashExample/GeoHashExample/GHArea.h old mode 100644 new mode 100755 diff --git a/Projects/GeoHashExample/GeoHashExample/GHArea.m b/Projects/GeoHashExample/GeoHashExample/GHArea.m old mode 100644 new mode 100755 diff --git a/Projects/GeoHashExample/GeoHashExample/GHNeighbors.h b/Projects/GeoHashExample/GeoHashExample/GHNeighbors.h old mode 100644 new mode 100755 diff --git a/Projects/GeoHashExample/GeoHashExample/GHNeighbors.m b/Projects/GeoHashExample/GeoHashExample/GHNeighbors.m old mode 100644 new mode 100755 diff --git a/Projects/GeoHashExample/GeoHashExample/GHRange.h b/Projects/GeoHashExample/GeoHashExample/GHRange.h old mode 100644 new mode 100755 diff --git a/Projects/GeoHashExample/GeoHashExample/GHRange.m b/Projects/GeoHashExample/GeoHashExample/GHRange.m old mode 100644 new mode 100755 diff --git a/Projects/GeoHashExample/GeoHashExample/GeoHash.h b/Projects/GeoHashExample/GeoHashExample/GeoHash.h old mode 100644 new mode 100755 diff --git a/Projects/GeoHashExample/GeoHashExample/GeoHash.m b/Projects/GeoHashExample/GeoHashExample/GeoHash.m old mode 100644 new mode 100755 diff --git a/Projects/GeoHashExample/GeoHashExample/GeoHashExample-Info.plist b/Projects/GeoHashExample/GeoHashExample/GeoHashExample-Info.plist old mode 100644 new mode 100755 index d267f52..ef61869 --- a/Projects/GeoHashExample/GeoHashExample/GeoHashExample-Info.plist +++ b/Projects/GeoHashExample/GeoHashExample/GeoHashExample-Info.plist @@ -11,7 +11,7 @@ CFBundleIconFiles CFBundleIdentifier - com.github.lyokato.geohash.${PRODUCT_NAME:rfc1034identifier} + $(PRODUCT_BUNDLE_IDENTIFIER) CFBundleInfoDictionaryVersion 6.0 CFBundleName diff --git a/Projects/GeoHashExample/GeoHashExample/GeoHashExample-Prefix.pch b/Projects/GeoHashExample/GeoHashExample/GeoHashExample-Prefix.pch old mode 100644 new mode 100755 diff --git a/Projects/GeoHashExample/GeoHashExample/GeoHashExampleAppDelegate.h b/Projects/GeoHashExample/GeoHashExample/GeoHashExampleAppDelegate.h old mode 100644 new mode 100755 diff --git a/Projects/GeoHashExample/GeoHashExample/GeoHashExampleAppDelegate.m b/Projects/GeoHashExample/GeoHashExample/GeoHashExampleAppDelegate.m old mode 100644 new mode 100755 diff --git a/Projects/GeoHashExample/GeoHashExample/GeoHashExampleViewController.h b/Projects/GeoHashExample/GeoHashExample/GeoHashExampleViewController.h old mode 100644 new mode 100755 index 852d3ee..9729a93 --- a/Projects/GeoHashExample/GeoHashExample/GeoHashExampleViewController.h +++ b/Projects/GeoHashExample/GeoHashExample/GeoHashExampleViewController.h @@ -1,13 +1,9 @@ -// -// GeoHashExampleViewController.h -// GeoHashExample -// -// Created by KATO Lyo on 11/12/28. -// Copyright 2011 KATO Lyo. All rights reserved. -// - +#import "GeoHelper.h" #import +#import @interface GeoHashExampleViewController : UIViewController @end + + diff --git a/Projects/GeoHashExample/GeoHashExample/GeoHashExampleViewController.m b/Projects/GeoHashExample/GeoHashExample/GeoHashExampleViewController.m old mode 100644 new mode 100755 index f4f2669..9a6b407 --- a/Projects/GeoHashExample/GeoHashExample/GeoHashExampleViewController.m +++ b/Projects/GeoHashExample/GeoHashExample/GeoHashExampleViewController.m @@ -7,54 +7,51 @@ // #import "GeoHashExampleViewController.h" +#import "GeoHash.h" +#import @implementation GeoHashExampleViewController -- (void)didReceiveMemoryWarning -{ - [super didReceiveMemoryWarning]; - // Release any cached data, images, etc that aren't in use. -} - #pragma mark - View lifecycle + - (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view, typically from a nib. -} - -- (void)viewDidUnload -{ - [super viewDidUnload]; - // Release any retained subviews of the main view. - // e.g. self.myOutlet = nil; -} - -- (void)viewWillAppear:(BOOL)animated -{ - [super viewWillAppear:animated]; -} + + /* Get GetHash by latitude, longitude, and hash-length */ + + NSString *hash = [GeoHash hashForLatitude:40.753683 + longitude:-73.972640 + length:12]; + + /* hash equals to @"xn774c06kdtve" */ + NSLog(@"hash:%@",hash); + + + + // New York City - 800m grid + CLLocationCoordinate2D ny = CLLocationCoordinate2DMake(40.753683, -73.972640); + double distance = 800; + + CLLocationDistance latMetersPerPoint = MKMetersPerMapPointAtLatitude(ny.latitude); + CLLocationDistance lngMetersPerPoint = MKMetersPerMapPointAtLatitude(ny.longitude); + + double latPts = latMetersPerPoint *distance; + double lngPts = lngMetersPerPoint *distance; + + MKMapPoint ptNY = MKMapPointForCoordinate(ny); + MKMapRect mapRect = MKMapRectMake(ptNY.x, ptNY.y, latPts, lngPts); + + NSDictionary *hashGrid = [GeoHelper hashGridForMapRect:mapRect]; + NSArray *array = [hashGrid valueForKey:@"mbr"]; + NSBag *bag = [hashGrid valueForKey:@"bag"]; + NSLog(@"bag:%@",bag.internalDictionary); + NSLog(@"array:%@",array); + -- (void)viewDidAppear:(BOOL)animated -{ - [super viewDidAppear:animated]; -} - -- (void)viewWillDisappear:(BOOL)animated -{ - [super viewWillDisappear:animated]; -} - -- (void)viewDidDisappear:(BOOL)animated -{ - [super viewDidDisappear:animated]; } +@end -- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation -{ - // Return YES for supported orientations - return (interfaceOrientation != UIInterfaceOrientationPortraitUpsideDown); -} -@end diff --git a/Projects/GeoHashExample/GeoHashExample/GeoHelper.h b/Projects/GeoHashExample/GeoHashExample/GeoHelper.h new file mode 100644 index 0000000..52b3a0e --- /dev/null +++ b/Projects/GeoHashExample/GeoHashExample/GeoHelper.h @@ -0,0 +1,17 @@ + +#import +#import +#import "NSBag.h" + + + +@interface GeoHelper : NSObject + ++(NSString*)geoHashForMapRect:(MKMapRect)mapRect size:(int)size; ++(NSBag*)hashBagForMapRect:(MKMapRect)mapRect; ++(NSDictionary*)hashGridForMapRect:(MKMapRect)mapRect; ++(CLLocationCoordinate2D)getNECoordinate:(MKMapRect)mRect; ++(CLLocationCoordinate2D)getNWCoordinate:(MKMapRect)mRect; ++(CLLocationCoordinate2D)getSECoordinate:(MKMapRect)mRect; ++(CLLocationCoordinate2D)getSWCoordinate:(MKMapRect)mRect; +@end diff --git a/Projects/GeoHashExample/GeoHashExample/GeoHelper.m b/Projects/GeoHashExample/GeoHashExample/GeoHelper.m new file mode 100644 index 0000000..306443e --- /dev/null +++ b/Projects/GeoHashExample/GeoHashExample/GeoHelper.m @@ -0,0 +1,110 @@ + + +#import "GeoHelper.h" +#import "GeoHash.h" + +@implementation GeoHelper + + ++(NSString*)geoHashForMapRect:(MKMapRect)mapRect size:(int)size{ + NSDictionary *d0 = [self hashGridForMapRect:mapRect]; + __block NSString *geohash = @""; + NSArray *array = [(NSSet*)[d0 valueForKey:@"mbr"] allObjects]; + geohash = [array objectAtIndex:0]; + [array enumerateObjectsUsingBlock:^(NSString *gHash, NSUInteger idx, BOOL * _Nonnull stop) { + if (gHash.length == size) { + geohash = gHash; + } + }]; + + + return [geohash substringWithRange:NSMakeRange(0, 1)]; + + +} ++(NSBag*)hashBagForMapRect:(MKMapRect)mapRect{ + return [[self hashGridForMapRect:mapRect] valueForKey:@"mbr"]; +} + +// This is a wide net that will spill outside the mapRect. ++(NSDictionary*)hashGridForMapRect:(MKMapRect)mapRect{ + + CLLocationCoordinate2D ne = [GeoHelper getNECoordinate:mapRect]; + CLLocationCoordinate2D nw = [GeoHelper getNWCoordinate:mapRect]; + CLLocationCoordinate2D se = [GeoHelper getSECoordinate:mapRect]; + CLLocationCoordinate2D sw = [GeoHelper getSWCoordinate:mapRect]; + + int hashLength = 12; + NSString *neHash = [GeoHash hashForLatitude:ne.latitude + longitude:ne.longitude + length:hashLength]; + NSString *nwHash = [GeoHash hashForLatitude:nw.latitude + longitude:nw.longitude + length:hashLength]; + NSString *seHash = [GeoHash hashForLatitude:se.latitude + longitude:se.longitude + length:hashLength]; + NSString *swHash = [GeoHash hashForLatitude:sw.latitude + longitude:sw.longitude + length:hashLength]; + + + NSBag *bag = [NSBag bag]; + int depth = 12; // chars deep into geohash + BOOL excludeTopLevel = YES; + + for(int i=1;i<=depth;i++){ + if (excludeTopLevel && i == 1) { + continue; + } + [bag add:[neHash substringToIndex:i]]; + [bag add:[nwHash substringToIndex:i]]; + [bag add:[seHash substringToIndex:i]]; + [bag add:[swHash substringToIndex:i]]; + } + + + // NSLog(@"bag:%@",[bag internalDictionary]); + /* + 9z = 2; + 9z9 = 1; + 9zs = 1; + cb = 2; + cb1 = 1; + cbh = 1; + */ + + NSMutableArray *arr = [NSMutableArray array]; + [[bag internalDictionary] enumerateKeysAndObjectsUsingBlock:^(NSString* _Nonnull obj, NSString* _Nonnull key, BOOL * _Nonnull stop) { + if (key.intValue > 1) { + [arr addObject:obj]; + } + }]; + + NSDictionary *d0 = [NSDictionary dictionaryWithObjectsAndKeys: + neHash,@"ne", + nwHash,@"nw", + seHash,@"se", + swHash,@"sw", + arr,@"mbr", + bag,@"bag",nil]; + return d0; +} ++(CLLocationCoordinate2D)getNECoordinate:(MKMapRect)mRect{ + return [self getCoordinateFromMapRectanglePoint:MKMapRectGetMaxX(mRect) y:mRect.origin.y]; +} ++(CLLocationCoordinate2D)getNWCoordinate:(MKMapRect)mRect{ + return [self getCoordinateFromMapRectanglePoint:MKMapRectGetMinX(mRect) y:mRect.origin.y]; +} ++(CLLocationCoordinate2D)getSECoordinate:(MKMapRect)mRect{ + return [self getCoordinateFromMapRectanglePoint:MKMapRectGetMaxX(mRect) y:MKMapRectGetMaxY(mRect)]; +} ++(CLLocationCoordinate2D)getSWCoordinate:(MKMapRect)mRect{ + return [self getCoordinateFromMapRectanglePoint:mRect.origin.x y:MKMapRectGetMaxY(mRect)]; +} ++(CLLocationCoordinate2D)getCoordinateFromMapRectanglePoint:(double)x y:(double)y{ + MKMapPoint swMapPoint = MKMapPointMake(x, y); + return MKCoordinateForMapPoint(swMapPoint); +} + +@end diff --git a/Projects/GeoHashExample/GeoHashExample/NSBag.h b/Projects/GeoHashExample/GeoHashExample/NSBag.h new file mode 100755 index 0000000..4278e70 --- /dev/null +++ b/Projects/GeoHashExample/GeoHashExample/NSBag.h @@ -0,0 +1,13 @@ +#import +@interface NSBag : NSObject { + NSMutableDictionary *dict; +} ++ (NSBag *) bag; ++ (NSBag *) bagWithObjects: (id) anObject,...; +- (void) add: (id) anObject; +- (void) addObjects:(id)item,...; +- (void) remove: (id) anObject; +- (NSInteger) occurrencesOf: (id) anObject; +- (NSArray *) objects; +- (NSDictionary *) internalDictionary; +@end diff --git a/Projects/GeoHashExample/GeoHashExample/NSBag.m b/Projects/GeoHashExample/GeoHashExample/NSBag.m new file mode 100755 index 0000000..9a2d8ca --- /dev/null +++ b/Projects/GeoHashExample/GeoHashExample/NSBag.m @@ -0,0 +1,94 @@ +#import "NSBag.h" + + +@implementation NSBag +- (id) init +{ + if (!(self = [super init])) return self; + dict = [[NSMutableDictionary alloc] init] ; + return self; +} + ++ (NSBag *) bag +{ + return [[NSBag alloc] init] ; +} + +- (void) add: (id) anObject +{ + int count = 0; + NSNumber *num = [dict objectForKey:anObject]; + if (num) count = [num intValue]; + NSNumber *newnum = [NSNumber numberWithInt:count + 1]; + [dict setObject:newnum forKey:anObject]; +} + ++ (NSBag *) bagWithObjects:(id)item,... +{ + NSBag *bag = [NSBag bag]; + if (!item) return bag; + [bag add:item]; + + va_list objects; + va_start(objects, item); + id obj = va_arg(objects, id); + while (obj) + { + [bag add:obj]; + obj = va_arg(objects, id); + } + va_end(objects); + return bag; +} + +- (void) addObjects:(id)item,... +{ + if (!item) return; + [self add:item]; + + va_list objects; + va_start(objects, item); + id obj = va_arg(objects, id); + while (obj) + { + [self add:obj]; + obj = va_arg(objects, id); + } + va_end(objects); +} + +- (void) remove: (id) anObject +{ + NSNumber *num = [dict objectForKey:anObject]; + if (!num) return; + if ([num intValue] == 1) + { + [dict removeObjectForKey:anObject]; + return; + } + NSNumber *newnum = [NSNumber numberWithInt:([num intValue] - 1)]; + [dict setObject:newnum forKey:anObject]; +} + +- (NSInteger) occurrencesOf: (id) anObject +{ + NSNumber *num = [dict objectForKey:anObject]; + return [num intValue]; +} + +- (NSArray *) objects +{ + return [dict allKeys]; +} + +- (NSString *) description +{ + return [dict description]; +} + +- (NSDictionary *) internalDictionary{ + return dict; +} + + +@end diff --git a/Projects/GeoHashExample/GeoHashExample/cgeohash.h b/Projects/GeoHashExample/GeoHashExample/cgeohash.h old mode 100644 new mode 100755 diff --git a/Projects/GeoHashExample/GeoHashExample/cgeohash.m b/Projects/GeoHashExample/GeoHashExample/cgeohash.m old mode 100644 new mode 100755 diff --git a/Projects/GeoHashExample/GeoHashExample/en.lproj/GeoHashExampleViewController.xib b/Projects/GeoHashExample/GeoHashExample/en.lproj/GeoHashExampleViewController.xib old mode 100644 new mode 100755 diff --git a/Projects/GeoHashExample/GeoHashExample/en.lproj/InfoPlist.strings b/Projects/GeoHashExample/GeoHashExample/en.lproj/InfoPlist.strings old mode 100644 new mode 100755 diff --git a/Projects/GeoHashExample/GeoHashExample/main.m b/Projects/GeoHashExample/GeoHashExample/main.m old mode 100644 new mode 100755 diff --git a/Projects/GeoHashExample/GeoHashExampleTests/GeoHashExampleTests-Info.plist b/Projects/GeoHashExample/GeoHashExampleTests/GeoHashExampleTests-Info.plist old mode 100644 new mode 100755 diff --git a/Projects/GeoHashExample/GeoHashExampleTests/GeoHashTestCase.h b/Projects/GeoHashExample/GeoHashExampleTests/GeoHashTestCase.h old mode 100644 new mode 100755 diff --git a/Projects/GeoHashExample/GeoHashExampleTests/GeoHashTestCase.m b/Projects/GeoHashExample/GeoHashExampleTests/GeoHashTestCase.m old mode 100644 new mode 100755 diff --git a/Projects/GeoHashExample/GeoHashExampleTests/en.lproj/InfoPlist.strings b/Projects/GeoHashExample/GeoHashExampleTests/en.lproj/InfoPlist.strings old mode 100644 new mode 100755 diff --git a/README b/README old mode 100644 new mode 100755 diff --git a/objc-geohash.podspec b/objc-geohash.podspec old mode 100644 new mode 100755 From 675ca8d792395409458fcecad5ebde9b723c766a Mon Sep 17 00:00:00 2001 From: John Pope Date: Fri, 16 Dec 2016 15:25:59 -0500 Subject: [PATCH 2/2] updates for geohash grid readme. --- README | 126 ++++++++++++++++++++++++++++++++++++++++++--------------- 1 file changed, 93 insertions(+), 33 deletions(-) diff --git a/README b/README index e6b0e27..214174a 100755 --- a/README +++ b/README @@ -20,39 +20,99 @@ NSString *hash = [GeoHash hashForLatitude:35.6894875 /* Decode GeoHash and get an area which the hash indicates */ - -GHArea *area = [GeoHash areaForHash:@"c216ne"]; - -area.latitude.max -area.latitude.min -area.longitude.max -area.longitude.min - - -/* Adjacent */ -NSString *adjacentHash = [GeoHash adjacentForHash:@"dqcjq" - direction:GHDirectionNorth]; -/* @"dqcjw" */ - - -GHNeighbors *neighbors = [GeoHash neighborsForHash:@"dqcw5"]; - -neighbors.north -neighbors.south -neighbors.east -neighbors.west -neighbors.northEast -neighbors.northWest -neighbors.southEast -neighbors.southWest - - -/* check invalid hash */ -if (![GeoHash verifyHash:@"abw!@"]) -{ - ... -} - + + GHArea *area = [GeoHash areaForHash:@"c216ne"]; + + area.latitude.max + area.latitude.min + area.longitude.max + area.longitude.min + + + /* Adjacent */ + NSString *adjacentHash = [GeoHash adjacentForHash:@"dqcjq" + direction:GHDirectionNorth]; + /* @"dqcjw" */ + + + GHNeighbors *neighbors = [GeoHash neighborsForHash:@"dqcw5"]; + + neighbors.north + neighbors.south + neighbors.east + neighbors.west + neighbors.northEast + neighbors.northWest + neighbors.southEast + neighbors.southWest + + + /* check invalid hash */ + if (![GeoHash verifyHash:@"abw!@"]) + { + ... + } + + Sample of hash grid in New York city by MapRect + + // New York City - 800m grid + CLLocationCoordinate2D ny = CLLocationCoordinate2DMake(40.753683, -73.972640); + double distance = 800; + + CLLocationDistance latMetersPerPoint = MKMetersPerMapPointAtLatitude(ny.latitude); + CLLocationDistance lngMetersPerPoint = MKMetersPerMapPointAtLatitude(ny.longitude); + + double latPts = latMetersPerPoint *distance; + double lngPts = lngMetersPerPoint *distance; + + MKMapPoint ptNY = MKMapPointForCoordinate(ny); + MKMapRect mapRect = MKMapRectMake(ptNY.x, ptNY.y, latPts, lngPts); + + NSDictionary *hashGrid = [GeoHelper hashGridForMapRect:mapRect]; + NSArray *array = [hashGrid valueForKey:@"mbr"]; + NSBag *bag = [hashGrid valueForKey:@"bag"]; + NSLog(@"bag:%@",bag.internalDictionary); + NSLog(@"array:%@",array); + +Depending on your needs in Geohelper + int depth = 12; // chars deep into geohash + BOOL excludeTopLevel = YES; + + bag:{ + dr = 4; + dr5 = 4; + dr5r = 4; + dr5ru = 4; + dr5rud = 4; + dr5rudy = 4; + dr5rudyz = 4; + dr5rudyz0 = 1; + dr5rudyz0w = 1; + dr5rudyz0wc = 1; + dr5rudyz0wcu = 1; + dr5rudyz2 = 1; + dr5rudyz2t = 1; + dr5rudyz2t1 = 1; + dr5rudyz2t1u = 1; + dr5rudyz5 = 1; + dr5rudyz5q = 1; + dr5rudyz5qu = 1; + dr5rudyz5quh = 1; + dr5rudyz7 = 1; + dr5rudyz7m = 1; + dr5rudyz7mh = 1; + dr5rudyz7mhh = 1; + } + + 2016-12-16 15:15:34.954 GeoHashExample[55252:2507736] array:( + dr5rudy, + dr5ru, + dr5r, + dr5rud, + dr5, + dr, + dr5rudyz + )