{"id":36832412,"url":"https://github.com/crolly/dyngeo","last_synced_at":"2026-01-12T14:15:40.883Z","repository":{"id":57505418,"uuid":"188876004","full_name":"crolly/dyngeo","owner":"crolly","description":"Unofficial Go port of the Geo Library for Amazon DynamoDB (https://github.com/amazon-archives/dynamodb-geo) using geohash (https://en.wikipedia.org/wiki/Geohash) to easily create and query geospatial data.","archived":false,"fork":false,"pushed_at":"2022-12-30T05:32:12.000Z","size":322,"stargazers_count":11,"open_issues_count":1,"forks_count":6,"subscribers_count":2,"default_branch":"master","last_synced_at":"2024-06-20T19:27:43.545Z","etag":null,"topics":["aws","aws-dynamodb","dynamodb","geohash","geolocation","geospatial"],"latest_commit_sha":null,"homepage":"","language":"Go","has_issues":false,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"other","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/crolly.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2019-05-27T16:22:55.000Z","updated_at":"2023-09-13T07:12:20.000Z","dependencies_parsed_at":"2023-01-31T10:45:58.538Z","dependency_job_id":null,"html_url":"https://github.com/crolly/dyngeo","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/crolly/dyngeo","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/crolly%2Fdyngeo","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/crolly%2Fdyngeo/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/crolly%2Fdyngeo/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/crolly%2Fdyngeo/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/crolly","download_url":"https://codeload.github.com/crolly/dyngeo/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/crolly%2Fdyngeo/sbom","scorecard":{"id":309250,"data":{"date":"2025-08-11","repo":{"name":"github.com/crolly/dyngeo","commit":"50ec62c8839ffd27e130ac1e5fed9a10e336d31f"},"scorecard":{"version":"v5.2.1-40-gf6ed084d","commit":"f6ed084d17c9236477efd66e5b258b9d4cc7b389"},"score":3,"checks":[{"name":"Packaging","score":-1,"reason":"packaging workflow not detected","details":["Warn: no GitHub/GitLab publishing workflow detected."],"documentation":{"short":"Determines if the project is published as a package that others can easily download, install, easily update, and uninstall.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#packaging"}},{"name":"Binary-Artifacts","score":10,"reason":"no binaries found in the repo","details":null,"documentation":{"short":"Determines if the project has generated executable (binary) artifacts in the source repository.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#binary-artifacts"}},{"name":"SAST","score":0,"reason":"no SAST tool detected","details":["Warn: no pull requests merged into dev branch"],"documentation":{"short":"Determines if the project uses static code analysis.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#sast"}},{"name":"Code-Review","score":0,"reason":"Found 0/3 approved changesets -- score normalized to 0","details":null,"documentation":{"short":"Determines if the project requires human code review before pull requests (aka merge requests) are merged.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#code-review"}},{"name":"Maintained","score":0,"reason":"0 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 0","details":null,"documentation":{"short":"Determines if the project is \"actively maintained\".","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#maintained"}},{"name":"Dangerous-Workflow","score":-1,"reason":"no workflows found","details":null,"documentation":{"short":"Determines if the project's GitHub Action workflows avoid dangerous patterns.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#dangerous-workflow"}},{"name":"Token-Permissions","score":-1,"reason":"No tokens found","details":null,"documentation":{"short":"Determines if the project's workflows follow the principle of least privilege.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#token-permissions"}},{"name":"Pinned-Dependencies","score":-1,"reason":"no dependencies found","details":null,"documentation":{"short":"Determines if the project has declared and pinned the dependencies of its build process.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#pinned-dependencies"}},{"name":"CII-Best-Practices","score":0,"reason":"no effort to earn an OpenSSF best practices badge detected","details":null,"documentation":{"short":"Determines if the project has an OpenSSF (formerly CII) Best Practices Badge.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#cii-best-practices"}},{"name":"Security-Policy","score":0,"reason":"security policy file not detected","details":["Warn: no security policy file detected","Warn: no security file to analyze","Warn: no security file to analyze","Warn: no security file to analyze"],"documentation":{"short":"Determines if the project has published a security policy.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#security-policy"}},{"name":"Fuzzing","score":0,"reason":"project is not fuzzed","details":["Warn: no fuzzer integrations found"],"documentation":{"short":"Determines if the project uses fuzzing.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#fuzzing"}},{"name":"Vulnerabilities","score":10,"reason":"0 existing vulnerabilities detected","details":null,"documentation":{"short":"Determines if the project has open, known unfixed vulnerabilities.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#vulnerabilities"}},{"name":"License","score":9,"reason":"license file detected","details":["Info: project has a license file: LICENSE:0","Warn: project license file does not contain an FSF or OSI license."],"documentation":{"short":"Determines if the project has defined a license.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#license"}},{"name":"Signed-Releases","score":-1,"reason":"no releases found","details":null,"documentation":{"short":"Determines if the project cryptographically signs release artifacts.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#signed-releases"}},{"name":"Branch-Protection","score":0,"reason":"branch protection not enabled on development/release branches","details":["Warn: branch protection not enabled for branch 'master'"],"documentation":{"short":"Determines if the default and release branches are protected with GitHub's branch protection settings.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#branch-protection"}}]},"last_synced_at":"2025-08-17T22:51:29.548Z","repository_id":57505418,"created_at":"2025-08-17T22:51:29.548Z","updated_at":"2025-08-17T22:51:29.548Z"},"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":28340387,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-01-12T12:22:26.515Z","status":"ssl_error","status_checked_at":"2026-01-12T12:22:10.856Z","response_time":98,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.6:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["aws","aws-dynamodb","dynamodb","geohash","geolocation","geospatial"],"created_at":"2026-01-12T14:15:36.303Z","updated_at":"2026-01-12T14:15:40.870Z","avatar_url":"https://github.com/crolly.png","language":"Go","funding_links":[],"categories":[],"sub_categories":[],"readme":"# DynG(e)o\n\nUnofficial Go port of the [Geo Library for Amazon DynamoDB](https://github.com/amazon-archives/dynamodb-geo) using [geohash](https://en.wikipedia.org/wiki/Geohash) to easily create and query geospatial data.\nThe library takes care of managing the geohash indexes and storing item with latitude/longitude pairs.\n\n## Install\n\nFetch the package with\n\n```\ngo get github.com/crolly/dyngeo\n```\n\nAnd import it into your programs with\n\n```go\nimport \"github.com/crolly/dyngeo\"\n```\n\n## Usage\n\n### DynG(e)o Configuration\n\n```go\ntype DynGeoConfig struct {\n\tTableName             string\n\tConsistentRead        bool\n\tHashKeyAttributeName  string\n\tRangeKeyAttributeName string\n\tGeoHashAttributeName  string\n\tGeoJSONAttributeName  string\n\tGeoHashIndexName      string\n\tHashKeyLength         int8\n\tLongitudeFirst        bool\n\n\tDynamoDBClient  *dynamodb.DynamoDB\n}\n```\n\nDefines, how DynG(e)o manages the geospatial data, e.g. what the db attribute and index names are as well as setting the geohash key length.\nThe geohash key length will determine the size of the tiles the planet will be seperated into:\n\n| Length | Tile Size             |\n| ------ |-----------------------|\n| 1      | 5,009.4km x 4,992.6km |\n| 2      | 1,252.3km x 624.1km   |\n| 3      | 156.5km x 156km       |\n| 4      | 39.1km x 19.5km       |\n| 5      | 4.9km x 4.9km         |\n| 6      | 1.2km x 609.4m        |\n| 7      | 152.9m x 152.4m       |\n| 8      | 38.2m x 19m           |\n| 9      | 4.8m x 4.8m           |\n| 10     | 1.2m x 59.5cm         |\n| 11     | 14.9cm x 14.9cm       |\n| 12     | 3.7cm x 1.9cm         |\n\nSetting `DynamoDBClient *dynamodb.DynamoDB` and `TableName string` is required.\n\n### DynG(e)o Instance\n\n#### func New\n\n```go\nfunc New(config DynGeoConfig) (*DynGeo, error)\n```\nReturns a new instance of `DynG(e)o` managing the geohashing and geospatial db operations.\n\n#### func PutPoint\n\n```go\nfunc (dg DynGeo) PutPoint(input PutPointInput) (*PutPointOutput, error)\n```\nPut a point into the Amazon DynamoDB table. Once put, you cannot update attributes specified in GeoDataManagerConfiguration: hash key, range key, geohash and geoJson. If you want to update these columns, you need to insert a new record and delete the old record.\n\n#### func BatchWritePoints\n\n```go\nfunc (dg DynGeo) BatchWritePoints(inputs []PutPointInput) (*BatchWritePointOutput, error)\n```\nPut a list of points into the Amazon DynamoDB table. Once put, you cannot update attributes specified in GeoDataManagerConfiguration: hash key, range key, geohash and geoJson. If you want to update these columns, you need to insert a new record and delete the old record.\n\n#### func GetPoint\n\n```go\nfunc (dg DynGeo) GetPoint(input GetPointInput) (*GetPointOutput, error)\n```\nGet a point from the Amazon DynamoDB table.\n\n#### func UpdatePoint\n\n```go\nfunc (dg DynGeo) UpdatePoint(input UpdatePointInput) (*UpdatePointOutput, error)\n```\nUpdate a point data in Amazon DynamoDB table. You cannot update attributes specified in GeoDataManagerConfiguration: hash key, range key, geohash and geoJson. If you want to update these columns, you need to insert a new record and delete the old record.\n\n#### func DeletePoint\n\n```go\nfunc (dg DynGeo) DeletePoint(input DeletePointInput) (*DeletePointOutput, error)\n```\nDelete a point from the Amazon DynamoDB table.\n\n#### func QueryRadius\n\n```go\nfunc (dg DynGeo) QueryRadius(input QueryRadiusInput, out interface{}) error \n```\nQuery a circular area constructed by a center point and its radius.\n\n#### func  QueryRectangle\n\n```go\nfunc (dg DynGeo) QueryRectangle(input QueryRectangleInput, out interface{}) error \n```\nQuery a rectangular area constructed by two points and return all points within the area. Two points need to construct a rectangle from minimum and maximum latitudes and longitudes. If minPoint.Longitude \u003e maxPoint.Longitude, the rectangle spans the 180 degree longitude line.\n\n## Getting Started Example\n\nThis repository contains a Getting Started example in the folder `starbucks-example` inspired by James Beswick's very good blog post about [Location-based search results with DynamoDB and Geohash](https://read.acloud.guru/location-based-search-results-with-dynamodb-and-geohash-267727e5d54f)\n\nIt uses the US Starbucks locations, loads them into DynamoDB in batches of 25 and then retrieves the the locations of all Starbucks in the radius of 5000 meters surrounding Latitude:  40.7769099, Longitude: -73.9822532.\n\nThe example illustrates the general usage as well as a hint of the performance. The radius search constantly needs about 20-30ms with the given dataset (approximately 6500 Starbucks coffee shops in the US).\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fcrolly%2Fdyngeo","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fcrolly%2Fdyngeo","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fcrolly%2Fdyngeo/lists"}