{
  "source_file": "0930",
  "source_platform": "Medium",
  "author": "Ransaka Ravihara",
  "title_listed": "Geospatial Indexing and Scoring: Unlocking the Power of Location-Based Data Analysis",
  "keywords": "地理空间索引,H3,Python",
  "domain": "数据处理",
  "content_type": "深度技术解析",
  "is_paid_flag": "部分免费/会员墙",
  "url": "https://towardsdatascience.com/geospatial-indexing-and-scoring-unlocking-the-power-of-location-based-data-analysis-b77a7599b4c/",
  "publish_date": "2023-01",
  "corpus_stage": "预训练/SFT",
  "notes": "",
  "id": "1d92f3b349ae",
  "collected_at": "2026-10-01T23:14:46",
  "title": "Geospatial Indexing and Scoring: Unlocking the Power of Location-Based Data Analysis | Towards Data Science",
  "body_markdown": "![Revisit consent button](https://cdn-cookieyes.com/assets/images/revisit.svg)\nWe value your privacy\nWe use cookies to enhance your browsing experience, serve personalised ads or content, and analyse our traffic. By clicking \"Accept All\", you consent to our use of cookies.\nCustomise Reject All Accept All\nCustomise Consent Preferences ![](https://cdn-cookieyes.com/assets/images/close.svg)\nWe use cookies to help you navigate efficiently and perform certain functions. You will find detailed information about all cookies under each consent category below.\nThe cookies that are categorised as \"Necessary\" are stored on your browser as they are essential for enabling the basic functionalities of the site. ... Show more\nNecessaryAlways Active\nNecessary cookies are required to enable the basic features of this site, such as providing secure log-in or adjusting your consent preferences. These cookies do not store any personally identifiable data.\n  * Cookie\nBCTempID\n  * Duration\n10 minutes\n  * Description\nNo description available.\n\n\n  * Cookie\n__cf_bm\n  * Duration\n1 hour\n  * Description\nThis cookie, set by Cloudflare, is used to support Cloudflare Bot Management. \n\n\n  * Cookie\nAWSALBCORS\n  * Duration\n7 days\n  * Description\nAmazon Web Services set this cookie for load balancing.\n\n\n  * Cookie\n_cfuvid\n  * Duration\nsession\n  * Description\nCloudflare sets this cookie to track users across sessions to optimize user experience by maintaining session consistency and providing personalized services\n\n\n  * Cookie\nli_gc\n  * Duration\n6 months\n  * Description\nLinkedin set this cookie for storing visitor's consent regarding using cookies for non-essential purposes.\n\n\n  * Cookie\n__hssrc\n  * Duration\nsession\n  * Description\nThis cookie is set by Hubspot whenever it changes the session cookie. The __hssrc cookie set to 1 indicates that the user has restarted the browser, and if the cookie does not exist, it is assumed to be a new session.\n\n\n  * Cookie\n__hssc\n  * Duration\n1 hour\n  * Description\nHubSpot sets this cookie to keep track of sessions and to determine if HubSpot should increment the session number and timestamps in the __hstc cookie.\n\n\n  * Cookie\nwpEmojiSettingsSupports\n  * Duration\nsession\n  * Description\nWordPress sets this cookie when a user interacts with emojis on a WordPress site. It helps determine if the user's browser can display emojis properly.\n\n\n  * Cookie\nBCSessionID\n  * Duration\n1 year 1 month 4 days\n  * Description\nBlueconic sets this cookie as a unique identifier for the BlueConic profile.\n\n\n  * Cookie\n_octo\n  * Duration\n1 year\n  * Description\nNo description available.\n\n\n  * Cookie\nlogged_in\n  * Duration\n1 year\n  * Description\nNo description available.\n\n\n  * Cookie\n__Secure-YEC\n  * Duration\npast\n  * Description\nYouTube sets this cookie to stores the user's video player preferences using embedded YouTube video\n\n\n  * Cookie\n__eoi\n  * Duration\n6 months\n  * Description\nDescription is currently not available.\n\n\n  * Cookie\nAWSALBTGCORS\n  * Duration\n7 days\n  * Description\nNo description available.\n\n\n  * Cookie\nlogin-status-p\n  * Duration\npast\n  * Description\nDescription is currently not available.\n\n\n  * Cookie\nAWSALBTG\n  * Duration\n7 days\n  * Description\nNo description available.\n\n\n  * Cookie\ncsrf_token\n  * Duration\nsession\n  * Description\nNo description available.\n\n\n  * Cookie\ntoken_v2\n  * Duration\n1 day\n  * Description\nDescription is currently not available.\n\n\n  * Cookie\nD\n  * Duration\n1 year\n  * Description\nDescription is currently not available.\n\n\n  * Cookie\nPHPSESSID\n  * Duration\nsession\n  * Description\nThis cookie is native to PHP applications. The cookie stores and identifies a user's unique session ID to manage user sessions on the website. The cookie is a session cookie and will be deleted when all the browser windows are closed.\n\n\n  * Cookie\nVISITOR_PRIVACY_METADATA\n  * Duration\n6 months\n  * Description\nYouTube sets this cookie to store the user's cookie consent state for the current domain. \n\n\n  * Cookie\ncookietest\n  * Duration\nsession\n  * Description\nThe cookietest cookie is typically used to determine whether the user's browser accepts cookies, essential for website functionality and user experience.\n\n\n  * Cookie\n__Host-airtable-session\n  * Duration\n1 year\n  * Description\nThis cookie is used to enable us to integrate the services of Airtable.\n\n\n  * Cookie\n__Host-airtable-session.sig\n  * Duration\n1 year\n  * Description\nThis cookie is used to enable us to integrate the services of Airtable.\n\n\n  * Cookie\nm\n  * Duration\n1 year 1 month 4 days\n  * Description\nStripe sets this cookie for fraud prevention purposes. It identifies the device used to access the website, allowing the website to be formatted accordingly.\n\n\n  * Cookie\nBIGipServer*\n  * Duration\nsession\n  * Description\nMarketo sets this cookie to collect information about the user's online activity and build a profile about their interests to provide advertisements relevant to the user. \n\n\n  * Cookie\n__cfruid\n  * Duration\nsession\n  * Description\nCloudflare sets this cookie to identify trusted web traffic.\n\n\n  * Cookie\n_GRECAPTCHA\n  * Duration\n6 months\n  * Description\nGoogle Recaptcha service sets this cookie to identify bots to protect the website against malicious spam attacks.\n\n\n  * Cookie\n__Secure-YNID\n  * Duration\n6 months\n  * Description\nGoogle cookie used to protect user security and prevent fraud, especially during the login process.\n\n\n  * Cookie\ncookieyes-consent\n  * Duration\n1 year\n  * Description\nCookieYes sets this cookie to remember users' consent preferences so that their preferences are respected on subsequent visits to this site. It does not collect or store any personal information about the site visitors.\n\n\nFunctional\nFunctional cookies help perform certain functionalities like sharing the content of the website on social media platforms, collecting feedback, and other third-party features.\n  * Cookie\nlidc\n  * Duration\n1 day\n  * Description\nLinkedIn sets the lidc cookie to facilitate data center selection.\n\n\n  * Cookie\nbrw\n  * Duration\n1 year\n  * Description\nNo description available.\n\n\n  * Cookie\nbrwConsent\n  * Duration\n5 minutes\n  * Description\nDescription is currently not available.\n\n\n  * Cookie\nWMF-Uniq\n  * Duration\n1 year\n  * Description\nDescription is currently not available.\n\n\n  * Cookie\nloom_anon_comment\n  * Duration\n1 year\n  * Description\nNo description available.\n\n\n  * Cookie\nloom_referral_video\n  * Duration\nsession\n  * Description\nDescription is currently not available.\n\n\n  * Cookie\nVISITOR_INFO1_LIVE\n  * Duration\n6 months\n  * Description\nA cookie set by YouTube to measure bandwidth that determines whether the user gets the new or old player interface.\n\n\n  * Cookie\nyt-remote-connected-devices\n  * Duration\nNever Expires\n  * Description\nYouTube sets this cookie to store the user's video preferences using embedded YouTube videos.\n\n\n  * Cookie\nytidb::LAST_RESULT_ENTRY_KEY\n  * Duration\nNever Expires\n  * Description\nThe cookie ytidb::LAST_RESULT_ENTRY_KEY is used by YouTube to store the last search result entry that was clicked by the user. This information is used to improve the user experience by providing more relevant search results in the future.\n\n\n  * Cookie\nyt-remote-device-id\n  * Duration\nNever Expires\n  * Description\nYouTube sets this cookie to store the user's video preferences using embedded YouTube videos.\n\n\n  * Cookie\nyt-remote-session-name\n  * Duration\nsession\n  * Description\nThe yt-remote-session-name cookie is used by YouTube to store the user's video player preferences using embedded YouTube video.\n\n\n  * Cookie\nyt-remote-fast-check-period\n  * Duration\nsession\n  * Description\nThe yt-remote-fast-check-period cookie is used by YouTube to store the user's video player preferences for embedded YouTube videos.\n\n\n  * Cookie\nyt-remote-session-app\n  * Duration\nsession\n  * Description\nThe yt-remote-session-app cookie is used by YouTube to store user preferences and information about the interface of the embedded YouTube video player.\n\n\n  * Cookie\nyt-remote-cast-available\n  * Duration\nsession\n  * Description\nThe yt-remote-cast-available cookie is used to store the user's preferences regarding whether casting is available on their YouTube video player.\n\n\n  * Cookie\nyt-remote-cast-installed\n  * Duration\nsession\n  * Description\nThe yt-remote-cast-installed cookie is used to store the user's video player preferences using embedded YouTube video.\n\n\n  * Cookie\ncp_session\n  * Duration\n3 months\n  * Description\nCodepen sets this cookie for Help systems found in the website.\n\n\n  * Cookie\nloid\n  * Duration\n1 year 1 month 4 days\n  * Description\nThis cookie is set by the Reddit. The cookie enables the sharing of content from the website onto the social media platform.\n\n\nAnalytics\nAnalytical cookies are used to understand how visitors interact with the website. These cookies help provide information on metrics such as the number of visitors, bounce rate, traffic source, etc.\n  * Cookie\n__hstc\n  * Duration\n6 months\n  * Description\nHubspot set this main cookie for tracking visitors. It contains the domain, initial timestamp (first visit), last timestamp (last visit), current timestamp (this visit), and session number (increments for each subsequent session).\n\n\n  * Cookie\nhubspotutk\n  * Duration\n6 months\n  * Description\nHubSpot sets this cookie to keep track of the visitors to the website. This cookie is passed to HubSpot on form submission and used when deduplicating contacts.\n\n\n  * Cookie\n_ga\n  * Duration\n1 year 1 month 4 days\n  * Description\nGoogle Analytics sets this cookie to calculate visitor, session and campaign data and track site usage for the site's analytics report. The cookie stores information anonymously and assigns a randomly generated number to recognise unique visitors.\n\n\n  * Cookie\n_ga_*\n  * Duration\n1 year 1 month 4 days\n  * Description\nGoogle Analytics sets this cookie to store and count page views.\n\n\n  * Cookie\n__Host-psifi.analyticsTrace\n  * Duration\n6 hours\n  * Description\nDescription is currently not available.\n\n\n  * Cookie\n__Host-psifi.analyticsTraceV2\n  * Duration\n6 hours\n  * Description\nDescription is currently not available.\n\n\n  * Cookie\n_gh_sess\n  * Duration\nsession\n  * Description\nGitHub sets this cookie for temporary application and framework state between pages like what step the user is on in a multiple step form.\n\n\n  * Cookie\nYSC\n  * Duration\nsession\n  * Description\nYSC cookie is set by Youtube and is used to track the views of embedded videos on Youtube pages.\n\n\n  * Cookie\najs_anonymous_id\n  * Duration\n1 year\n  * Description\nThis cookie is set by Segment to count the number of people who visit a certain site by tracking if they have visited before.\n\n\n  * Cookie\nvuid\n  * Duration\n1 year 1 month 4 days\n  * Description\nVimeo installs this cookie to collect tracking information by setting a unique ID to embed videos on the website. \n\n\nPerformance\nPerformance cookies are used to understand and analyse the key performance indexes of the website which helps in delivering a better user experience for the visitors.\n  * Cookie\nAWSALB\n  * Duration\n7 days\n  * Description\nAWSALB is an application load balancer cookie set by Amazon Web Services to map the session to the target.\n\n\n  * Cookie\nacq\n  * Duration\npast\n  * Description\nDescription is currently not available.\n\n\n  * Cookie\nacq.sig\n  * Duration\npast\n  * Description\nDescription is currently not available.\n\n\n  * Cookie\nptc\n  * Duration\n2 years\n  * Description\nNo description available.\n\n\nAdvertisement\nAdvertisement cookies are used to provide visitors with customised advertisements based on the pages you visited previously and to analyse the effectiveness of the ad campaigns.\n  * Cookie\nmuc_ads\n  * Duration\n1 year 1 month 4 days\n  * Description\nTwitter sets this cookie to collect user behaviour and interaction data to optimize the website.\n\n\n  * Cookie\nguest_id_marketing\n  * Duration\n1 year 1 month 4 days\n  * Description\nTwitter sets this cookie to identify and track the website visitor.\n\n\n  * Cookie\nguest_id_ads\n  * Duration\n1 year 1 month 4 days\n  * Description\nTwitter sets this cookie to identify and track the website visitor.\n\n\n  * Cookie\npersonalization_id\n  * Duration\n1 year 1 month 4 days\n  * Description\nTwitter sets this cookie to integrate and share features for social media and also store information about how the user uses the website, for tracking and targeting.\n\n\n  * Cookie\nguest_id\n  * Duration\n1 year 1 month 4 days\n  * Description\nTwitter sets this cookie to identify and track the website visitor. It registers if a user is signed in to the Twitter platform and collects information about ad preferences.\n\n\n  * Cookie\nbcookie\n  * Duration\n1 year\n  * Description\nLinkedIn sets this cookie from LinkedIn share buttons and ad tags to recognize browser IDs.\n\n\n  * Cookie\n__Secure-ROLLOUT_TOKEN\n  * Duration\n6 months\n  * Description\nYouTube sets this cookie to manage feature rollout and experimentation. It helps Google control which new features or interface changes are shown to users as part of testing and staged rollouts, ensuring consistent experience for a given user during an experiment.\n\n\n  * Cookie\nyt.innertube::nextId\n  * Duration\nNever Expires\n  * Description\nYouTube sets this cookie to register a unique ID to store data on what videos from YouTube the user has seen.\n\n\n  * Cookie\nyt.innertube::requests\n  * Duration\nNever Expires\n  * Description\nYouTube sets this cookie to register a unique ID to store data on what videos from YouTube the user has seen.\n\n\n  * Cookie\nsession_tracker\n  * Duration\nsession\n  * Description\nThis cookie is set by the Reddit. This cookie is used to identify trusted web traffic. It also helps in adverstising on the website.\n\n\n  * Cookie\nedgebucket\n  * Duration\nsession\n  * Description\nReddit sets this cookie to save the information about a log-on Reddit user, for the purpose of advertisement recommendations and updating the content.\n\n\n  * Cookie\ndid\n  * Duration\n1 year\n  * Description\nArbor sets this cookie to show targeted ads to site visitors.This cookie expires after 2 months or 1 year.\n\n\nUncategorised\nOther uncategorised cookies are those that are being analysed and have not been classified into a category as yet.\nNo cookies to display.\nReject All Save My Preferences Accept All\nToggle Search[](https://towardsdatascience.com/)Toggle Mobile Navigation\n[](https://towardsdatascience.com/)\nPublish AI, ML & data-science insights to a global community of data professionals.\nSign in[Submit an Article](https://write.insightmediagroup.io)\n[Latest](https://towardsdatascience.com/latest/)[Editor's Picks](https://towardsdatascience.com/tag/editors-pick/)[Newsletter](https://towardsdatascience.com/tag/the-variable/)[ShipAI](https://towardsdatascience.com/shipai/)\n* * *\n[Write For TDS](https://towardsdatascience.com/submissions/)\n[LinkedIn](https://www.linkedin.com/company/towards-data-science/)[X](https://x.com/TDataScience)Toggle Search\n[Data Science](https://towardsdatascience.com/category/data-science/)\n# Geospatial Indexing and Scoring: Unlocking the Power of Location-Based Data Analysis\nA hands-on guide on geospatial indexing using Python & H3\n[Ransaka Ravihara](https://towardsdatascience.com/author/ransakaravihara/)\nJanuary 25, 20236 min read\n![Photo by Antoine Merour on Unsplash](https://assets.insightmediagroup.io/media/wp-content/uploads/2023/01/09uVzh9jAw7JqJNkP-scaled.jpg)\nPhoto by [Antoine Merour](https://unsplash.com/@amerour?utm_source=medium&utm_medium=referral) on [Unsplash](https://unsplash.com?utm_source=medium&utm_medium=referral)\nIn this article, we will discuss geospatial indexing and scoring and how it can be made easy for developers. Geospatial indexing is the process of creating an index on a set of data that has a geographic location associated with it, such as latitude and longitude. Scoring, on the other hand, is the process of ranking or ordering the data based on specific criteria. Together, geospatial indexing and scoring can create powerful and efficient applications that can quickly retrieve and display geographic data.\nGeospatial indexing and scoring can be complex and time-consuming, but with the right tools and techniques, it can be made simple. This article will explore how we can use Uber's H3 library for indexing and scoring tasks.\nFor a better understanding, let's define the hypothetical problem statement.\nLearn this step by step with the interactive [AI and Data Scientist](https://roadmap.sh/ai-data-scientist) roadmap.\n> As a Data Scientist at a retail company, you have been tasked with a critical project. The company needs to organize and understand the different regions it operates.\n> The end goal of this project is to split regions into different pieces and identify critical hotspots across each region. This information will be helpful for the company to understand which areas are most important for their business and where they should focus their efforts.\n> But your job doesn't end there. The company also needs you to assign an \"importance score\" to each of its outlets. This score will be based on the previously mentioned hotspot mechanism. The outlets that are located near potential hotspots have a higher importance score.\nAlright, let's start building this solution.\n### Steps to follow\n– [Know your data (Understand the data)](https://towardsdatascience.com/geospatial-indexing-and-scoring-unlocking-the-power-of-location-based-data-analysis-b77a7599b4c/#9242) – [Splitting region into small hexagons](https://towardsdatascience.com/geospatial-indexing-and-scoring-unlocking-the-power-of-location-based-data-analysis-b77a7599b4c/#a839) – [Derive a score for each hexagon in the region](https://towardsdatascience.com/geospatial-indexing-and-scoring-unlocking-the-power-of-location-based-data-analysis-b77a7599b4c/#add6) – [Define outlet importance score](https://towardsdatascience.com/geospatial-indexing-and-scoring-unlocking-the-power-of-location-based-data-analysis-b77a7599b4c/#2edc)\n### 1️⃣ Know your data\nBased on the problem statement, we have two datasets.\n  1. Points of interest dataset - To derive importance scores\n  2. Outlet location dataset\n\n\n_Note: The data provided is randomly generated and does not reflect real-world scenarios. You can access this data from_[ _here_](https://github.com/Ransaka/Spatial-indexing-with-h3/tree/master/data) _._\npython\n\n```\nimport pandas as pd\n\npois = pd.read_csv(\"pois.csv\")\noutlets = pd.read_csv(\"outlets.csv\")\n```\n\n![](https://assets.insightmediagroup.io/media/wp-content/uploads/2023/01/1AqoiZDvgRBsnDk_19kO-EQ.png)\n![](https://assets.insightmediagroup.io/media/wp-content/uploads/2023/01/1yC7MHmXbYIxIbG4qPMje-Q.png)\nLet's plot the POI category distribution.\n![](https://assets.insightmediagroup.io/media/wp-content/uploads/2023/01/1jG0AZl3npdYZA4Uy4YZmgw.png)\nAdditionally, we will require regions' geographical information. I already created the regions' JSON file via the _geojson.io_ website.\nlua\n\n```\n{'type': 'FeatureCollection',\n 'features': [{'type': 'Feature',\n   'properties': {},\n   'geometry': {'coordinates': [[[80.19371259270753, 6.307037132469091],\n      [80.19371259270753, 6.072771744744614],\n      [80.4434199500783, 6.072771744744614],\n      [80.4434199500783, 6.307037132469091],\n      [80.19371259270753, 6.307037132469091]]],\n    'type': 'Polygon'}}]}\n```\n\nLet's put it all together.\n![What we have so far | Image by Author](https://assets.insightmediagroup.io/media/wp-content/uploads/2023/01/1ev1ZfyijaC3qSbzhCMZqSg.jpeg)\nWhat we have so far | Image by Author\nIn the above diagram, you can see two layers.\n  1. Rectangular geojson layer - Represents the region we are analyzing\n  2. Points of interest layer - Provides points of interest dataset for the region\n\n\n### 2️⃣ Splitting region into small hexagons\nTo pinpoint hotspots across a specific area, it's necessary to divide the region into smaller sections. One way to do this is by using hexagons. Hexagons are particularly useful in this context because of the advantages they offer, such as their ability to evenly divide an area and the ability to accurately represent geographical shapes. If you have any further questions about why hexagons are used or the benefits they offer, you can refer to the official documentation of H3 for more information.\nIn simpler terms, by choosing the correct resolution, multiple locations can be represented by a single hexagon cell.\n![Map multiple points to one hexagon | Image by Author](https://assets.insightmediagroup.io/media/wp-content/uploads/2023/01/1B4_U6j0RiN_6nbpMalUxhg.jpeg)\nMap multiple points to one hexagon | Image by Author\n> [**H3 | H3**](https://h3geo.org/)\nWe can use H3's `_polyfill_`function to split a given region into hexagons. But before that, we have to convert the region geojson file into a shapely polygon format.\ncss\n\n```\nfrom h3 import h3\nfrom shapely.geometry import Polygon,mapping\n\ndef dict_to_shapely(d):\n    coords = d['features'][0]['geometry']['coordinates'][0]\n    return Polygon(coords)\n\ndef polygon_to_h3(polygon,resolution):\n    polygon = mapping(polygon)\n    hexas = h3.polyfill(polygon,res=resolution,geo_json_conformant=True)\n    return list(set(hexas))\n\n#read geojson file\nwith open(\"sample-bbx.geojson\",'r') as f:\n    polygon_dict = json.loads(f.read())\n    shapely_polygon = dict_to_shapely(polygon_dict)\n    f.close()\n\nh3_idx = polygon_to_h3(shapely_polygon,resolution=8)\nh3_idx = pd.DataFrame(pd.Series(h3_idx,name='h3'))\n```\n\nIn the above snippet, the `polygon_to_h3` function will convert the input polygon into a list of hexagons. Also, you have to provide the resolution parameter. The resolution parameter defines the size of the hexagon. Based on the provided resolution parameter, we can split the given region into hexagons, like below.\n![Converting geojson tile into a list of hexagons | Image by Author](https://assets.insightmediagroup.io/media/wp-content/uploads/2023/01/1Cm5lB-WG5wmVwsJBmvG1QQ.jpeg)\nConverting geojson tile into a list of hexagons | Image by Author\nIn this instance, a resolution of 8 was utilized. According to the documentation, hexagons with a solution of 8 have an area of 0.737327598 square kilometers. In this specific case, the region was divided into 912 hexagons.\n### 3️⃣ Derive a score for each hexagon in the region\nSince we have split regions into hexagons, we can now work on deriving the scores for each hexagon.\nThe methodology for this process includes the following:\n  * Assigning a unique hexagon ID to each point of interest in the dataset.\n  * Establishing the scoring criteria, with weighting given to each category.\n  * Joining the scored dataset with the region dataset.\n\n\npython\n\n```\nscores = 1- (pois['category'].value_counts(normalize=True)) * 3\nscores_dict = dict(zip(scores.index,scores.values * 100))\n\npois['weight'] = pois['category'].map(scores_dict)\n\ngrouped_df = pois.groupby(\"h3\").agg(\n    counts=('category','count'),\n    score = ('weight','sum')\n).sort_values(by='counts',ascending=False)\n\ngrouped_df.head()\n```\n\n![](https://assets.insightmediagroup.io/media/wp-content/uploads/2023/01/1CXNJ8HlvJpICAaRaX05ENg.png)\nLet's overlay the scoring layer on top of the base region hexagons. The figure on the right illustrates how scores are assigned to each hexagon. The height of the bar reflects the importance score.\n![](https://assets.insightmediagroup.io/media/wp-content/uploads/2023/01/1ZvxtkNMGgQxNgX9TwhRE1w.jpeg)\n![Image by Author](https://assets.insightmediagroup.io/media/wp-content/uploads/2023/01/1oQIHNZXHJNJ6j9ZO-M_D7w.jpeg)\nImage by Author\nLet's check how derived scores are distributed.\npython\n\n```\ngrouped_df.reset_index(inplace=True)\nfull_scored_idx = h3_idx.merge(grouped_df,on='h3',how='left').fillna(0)\n\nfull_scored_idx['score'].plot.hist(color='skyblue',edgecolor='black',bins=5,figsize=(10,8))\nplt.title(\"Score Distibutin\")\nplt.xlabel(\"Score\")\nplt.ylabel(\"Frequency\")\nplt.grid(visible=True, linestyle='-.')\nplt.show()\n```\n\n![Score distribution | Image by Author](https://assets.insightmediagroup.io/media/wp-content/uploads/2023/01/1gNYP1vsc-xIS-RMuB8kXpg.png)\nScore distribution | Image by Author\nWith all of the hexagons in the region now scored, it is time to create a new data layer for visualization.\n![](https://assets.insightmediagroup.io/media/wp-content/uploads/2023/01/1e9ngM3SwpQmMU9s-7HeDdA.jpeg)\n![Region&#039;s hotspots | Image by Author](https://assets.insightmediagroup.io/media/wp-content/uploads/2023/01/1RDBOuQR_zy13e6PrBjU-Yg.jpeg)\nRegion's hotspots | Image by Author\nPlease note the color code above, greyish-blue colored hexagons represent low-importance hexagons, while pink and cream-colored hexagons represent relatively important hexagons within the region.\n### 4️⃣ Define outlet importance score\nWe now have a dataset containing scores for all the hexagons in the selected region. This allows us to identify the area's most critical (hotspot) hexagons. This solves half of the problem. Next, we need to define the importance scores for the outlets.\nThe steps that will be followed include the following:\n  1. Assigning unique hexagon IDs to the outlet dataset.\n  2. For each outlet, identify the closest _K_ hexagons.\n  3. Defining the importance of the outlet based on scores of the _K_ hexagons.\n\n\npython\n\n```\nh3_to_score = dict(zip(full_scored_idx['h3'],full_scored_idx['score']))\nget_krings = lambda h:h3.k_ring(h,k=3)\noutlets_h3['rings'] = outlets_h3['h3'].apply(get_krings)\n\nprint(outlets_h3[['category','h3','rings']])\n```\n\n![](https://assets.insightmediagroup.io/media/wp-content/uploads/2023/01/1Mb1zBFbwdQcTWfsAu5MKBg.png)\nIn the code snippet above, the `k_ring` function is used to retrieve the nearest K hexagons for each outlet. You will also notice that in this case, K has been set to 3.\nLet's visualize the data to understand better what we have accomplished in this step.\n![Image by Author](https://assets.insightmediagroup.io/media/wp-content/uploads/2023/01/13KeHwu9ourA6yBPn8KVITA.jpeg)\nImage by Author\nNow we are almost done. Because we have defined the scores for each hexagon cell in this region, all we need to do is aggregate the nearby hexagon scores for each outlet.\npython\n\n```\noutlets_exploded = outlets_h3.explode(column='rings')\noutlets_exploded['weight'] = outlets_exploded['rings'].map(h3_to_score)\n\n#can contains hexagons not relavent to current region\noutlets_exploded.dropna(inplace=True)\n\n#final scoring for outlets\noutlets_exploded.groupby(\"category\").agg(outlet_importance=(\"weight\",'sum'))\n```\n\n![Final Scoring | Image by Author](https://assets.insightmediagroup.io/media/wp-content/uploads/2023/01/1ZANv54FgxKtnEiT3QnyAvw.png)\nFinal Scoring | Image by Author\nGreat, we have now successfully established the importance score for each outlet. With that, both objectives have been accomplished. Well done! :)\nYou can access all codes below the GitHub repo.\n> [**GitHub - Ransaka/Spatial-indexing-with-h3**](https://github.com/Ransaka/Spatial-indexing-with-h3.git)\n### **Conclusion**\nThis simplified example highlights some of the valuable capabilities of the H3 library. From measuring the distance between two geographic locations to performing nearest neighbor analysis, the H3 library offers a wide range of options. By incorporating spatial indexing at the appropriate time, not only can resources be saved, but costs can also be reduced. The reason is that performing mathematical operations on point data can consume a significant amount of memory, but memory usage can be greatly minimized with indexing.\nThanks for reading! Connect with me on [LinkedIn](https://www.linkedin.com/in/ransaka/).\n## Register Now to Continue Reading\n### Unlock Towards Data Science with a Free Account\nAll articles on Towards Data Science are available to registered users. Create a free account today to access this article and thousands more.\nRegister for freeSign in to your account\n* * *\n![](https://assets.insightmediagroup.io/media/1787657265628_qm714e.jpeg)\nWritten By\n## [Ransaka Ravihara](https://towardsdatascience.com/author/ransakaravihara/)\n[See all from Ransaka Ravihara](https://towardsdatascience.com/author/ransakaravihara/)\n[Data Science](https://towardsdatascience.com/tag/data-science/)[Python](https://towardsdatascience.com/tag/python/)[Spatial Analysis](https://towardsdatascience.com/tag/spatial-analysis/)\nShare This Article\n  * [](https://www.facebook.com/sharer/sharer.php?u=https%3A%2F%2Ftowardsdatascience.com%2Fgeospatial-indexing-and-scoring-unlocking-the-power-of-location-based-data-analysis-b77a7599b4c%2F&title=Geospatial%20Indexing%20and%20Scoring%3A%20Unlocking%20the%20Power%20of%20Location-Based%20Data%20Analysis)\n  * [](https://www.linkedin.com/shareArticle?mini=true&url=https%3A%2F%2Ftowardsdatascience.com%2Fgeospatial-indexing-and-scoring-unlocking-the-power-of-location-based-data-analysis-b77a7599b4c%2F&title=Geospatial%20Indexing%20and%20Scoring%3A%20Unlocking%20the%20Power%20of%20Location-Based%20Data%20Analysis)\n  * [](https://x.com/share?url=https%3A%2F%2Ftowardsdatascience.com%2Fgeospatial-indexing-and-scoring-unlocking-the-power-of-location-based-data-analysis-b77a7599b4c%2F&text=Geospatial%20Indexing%20and%20Scoring%3A%20Unlocking%20the%20Power%20of%20Location-Based%20Data%20Analysis)\n\n\nTowards Data Science is a community publication. Submit your insights to reach our global audience and earn through the TDS Author Payment Program.\n[Write for TDS](https://towardsdatascience.com/submissions/)\n## Related Articles\n  * [![](https://assets.insightmediagroup.io/media/wp-content/uploads/2022/04/0k-oZn2dY_NRI5Uqr-scaled.jpg)](https://towardsdatascience.com/aws-essentials-for-data-science-why-cloud-computing-141cc6cee284/)\n## [AWS Essentials for Data Science: Why Cloud Computing?](https://towardsdatascience.com/aws-essentials-for-data-science-why-cloud-computing-141cc6cee284/)\n[Technology](https://towardsdatascience.com/category/technology/)\nHow to leverage this half-trillion dollar industry\n[Matt Sosna](https://towardsdatascience.com/author/mgsosna/)\nApril 19, 202213 min read\n  * [![](https://assets.insightmediagroup.io/media/wp-content/uploads/2021/02/1Syve2d77KLRX3nW7o1Q48w.png)](https://towardsdatascience.com/a-beginners-guide-to-using-djangos-impressive-data-management-abilities-9e94efe3bd6e/)\n## [Django for Data Scientists - An Introduction to Django and Django's ORM](https://towardsdatascience.com/a-beginners-guide-to-using-djangos-impressive-data-management-abilities-9e94efe3bd6e/)\n[](https://towardsdatascience.com/geospatial-indexing-and-scoring-unlocking-the-power-of-location-based-data-analysis-b77a7599b4c/)\nUse Django ORM for your data management tasks. Even without starting any web server.\n[Dominik Polzer](https://towardsdatascience.com/author/dmnkplzr/)\nFebruary 7, 202112 min read\n  * [![](https://assets.insightmediagroup.io/media/wp-content/uploads/2021/10/1WRt7jEmSZr7i5vM2copzLg.png)](https://towardsdatascience.com/svm-talking-algos-using-interior-point-methods-for-svm-training-d705cdf78c94/)\n## [SVM Talking algos: Using Interior Point Methods for SVM Training](https://towardsdatascience.com/svm-talking-algos-using-interior-point-methods-for-svm-training-d705cdf78c94/)\n[Machine Learning](https://towardsdatascience.com/category/artificial-intelligence/machine-learning/)\nTraining Support Vector Classifier from scratch using optimisation methods\n[Maria](https://towardsdatascience.com/author/marialavrovskaya/)\nOctober 18, 20218 min read\n  * [![](https://assets.insightmediagroup.io/media/wp-content/uploads/2020/08/00Fl-pArbs5J4UqRD-scaled.jpg)](https://towardsdatascience.com/recommendation-system-for-similar-content-creators-on-youtube-3fed96b3c783/)\n## [Recommendation system for similar content creators on YouTube](https://towardsdatascience.com/recommendation-system-for-similar-content-creators-on-youtube-3fed96b3c783/)\n[Data Science](https://towardsdatascience.com/category/data-science/)\nUsing unsupervised machine learning algorithm to recommend similar content creators for any given YouTube channel\n[Marcus Richard](https://towardsdatascience.com/author/naveenmarcus/)\nAugust 12, 20207 min read\n  * [![](https://assets.insightmediagroup.io/media/wp-content/uploads/2020/03/0oBHqFORpVJhxrlwF-scaled.jpg)](https://towardsdatascience.com/how-to-build-your-geocoding-web-app-with-python-133e1e9e2d1a/)\n## [How to Build Your Geocoding Web App with Python](https://towardsdatascience.com/how-to-build-your-geocoding-web-app-with-python-133e1e9e2d1a/)\n[Programming](https://towardsdatascience.com/category/programming/)\nTutorial with Code and Streamlit app\n[Abdishakur](https://towardsdatascience.com/author/shakasom/)\nMarch 31, 20204 min read\n  * [![](https://assets.insightmediagroup.io/media/wp-content/uploads/2023/10/1AesSE_wxa1UCZKKHZLt8rg.png)](https://towardsdatascience.com/the-perfect-way-to-smooth-your-noisy-data-4f3fe6b44440/)\n## [The Perfect Way to Smooth Your Noisy Data](https://towardsdatascience.com/the-perfect-way-to-smooth-your-noisy-data-4f3fe6b44440/)\n[Machine Learning](https://towardsdatascience.com/category/artificial-intelligence/machine-learning/)\nInsanely fast and reliable smoothing and interpolation with the Whittaker-Eilers method.\n[Andrew Bowell](https://towardsdatascience.com/author/anbowell/)\nOctober 25, 202312 min read\n  * [![](https://assets.insightmediagroup.io/media/wp-content/uploads/2020/10/1HpLPlWgRvoqlzpKZy1s5wg.png)](https://towardsdatascience.com/sentiments-of-google-play-store-apps-reviews-13f9ee7246c6/)\n## [Sentiments of Google Play Store Apps Reviews](https://towardsdatascience.com/sentiments-of-google-play-store-apps-reviews-13f9ee7246c6/)\n[Data Science](https://towardsdatascience.com/category/data-science/)\nAnalyzing the Google Play Store Apps Reviews based on sentiment reported by reviewers\n[Emanuel Arnaud](https://towardsdatascience.com/author/emanuelarnaud/)\nOctober 21, 20203 min read\n  * [![](https://assets.insightmediagroup.io/media/wp-content/uploads/2017/04/1-7oApYM0Zl_K0OsDD5V_fQ.png)](https://towardsdatascience.com/seismic-activities-around-the-world-976dbf759e54/)\n## [Seismic activities around the world](https://towardsdatascience.com/seismic-activities-around-the-world-976dbf759e54/)\n[Data Science](https://towardsdatascience.com/category/data-science/)\nMapping earthquake and nuclear bombs with leaflet\n[Hannah Yan Han](https://towardsdatascience.com/author/yanhann10/)\nApril 10, 20172 min read\n  * [![](https://assets.insightmediagroup.io/media/wp-content/uploads/2021/04/0HMZO2a6sMt9RPaJU-scaled.jpg)](https://towardsdatascience.com/metrics-metrics-and-more-metrics-plus-our-on-demand-beginners-guide-is-here-cd6a439949cd/)\n## [Metrics, Metrics, and More Metrics, Plus: Our On-Demand Beginners' Guide Is Here](https://towardsdatascience.com/metrics-metrics-and-more-metrics-plus-our-on-demand-beginners-guide-is-here-cd6a439949cd/)\n[Machine Learning](https://towardsdatascience.com/category/artificial-intelligence/machine-learning/)\nOur weekly selection of must-read Editors' Picks and original features\n[TDS Editors](https://towardsdatascience.com/author/towardsdatascience/)\nApril 22, 20213 min read\n\n\n  * [YouTube](https://www.youtube.com/c/TowardsDataScience)\n  * [X](https://x.com/TDataScience)\n  * [LinkedIn](https://www.linkedin.com/company/towards-data-science/)\n  * [Threads](https://www.threads.net/@towardsdatascience)\n  * [Bluesky](https://bsky.app/profile/towardsdatascience.com)\n\n\n[](https://towardsdatascience.com/)\nYour home for data science and AI. The world's leading publication for data science, data analytics, data engineering, machine learning, and artificial intelligence professionals.\nSubscribe to Our Newsletter[Write For TDS](https://towardsdatascience.com/submissions/)•[About](https://towardsdatascience.com/about-towards-data-science-d691af11cc2f/)•[Advertise](https://contact.towardsdatascience.com/advertise-with-towards-data-science)•[Privacy Policy](https://towardsdatascience.com/privacy-policy/)•[Terms of Use](https://towardsdatascience.com/website-terms-of-use/)\n© Insight Media Group, LLC 2026•[The New Stack](https://thenewstack.io)•[roadmap.sh](https://roadmap.sh)•[Creator Network](https://insightmediagroup.io/creator-network)\n####  Recommended Articles \nClose\n  * [ ![](https://h030.towardsdatascience.com/rest/v2/contentStores/d7d3a4ab-7caf-4383-bbd2-fbf7fb4f1787/items/607631/image?etag=1781543525510&width=500&height=500) Critical Mistakes Companies Make When Integrating AI/ML into Their Processes ](https://towardsdatascience.com/critical-mistakes-companies-make-when-integrating-ai-ml-into-their-processes/ \"Critical Mistakes Companies Make When Integrating AI/ML into Their Processes\")\n  * [ ![](https://h030.towardsdatascience.com/rest/v2/contentStores/d7d3a4ab-7caf-4383-bbd2-fbf7fb4f1787/items/607686/image?etag=1782161464448&width=500&height=500) How Relevance Models Foreshadowed Transformers for NLP ](https://towardsdatascience.com/how-relevance-models-foreshadowed-transformers-for-nlp/ \"How Relevance Models Foreshadowed Transformers for NLP\")\n  * [ ![](https://h030.towardsdatascience.com/rest/v2/contentStores/d7d3a4ab-7caf-4383-bbd2-fbf7fb4f1787/items/607639/image?etag=1781250125848&width=500&height=500) Javascript Fatigue: HTMX Is All You Need to Build ChatGPT — Part 1 ](https://towardsdatascience.com/javascript-fatigue-you-dont-need-js-to-build-chatgpt/ \"Javascript Fatigue: HTMX Is All You Need to Build ChatGPT — Part 1\")\n  * [ ![](https://h030.towardsdatascience.com/rest/v2/contentStores/d7d3a4ab-7caf-4383-bbd2-fbf7fb4f1787/items/607930/image?etag=1782124566054&width=500&height=500) The Subset Sum Problem Solved in Linear Time for Dense Enough Inputs ](https://towardsdatascience.com/subset-sum-problem-solved-in-linear-time-for-dense-enough-inputs/ \"The Subset Sum Problem Solved in Linear Time for Dense Enough Inputs\")\n\n\n",
  "metadata": {
    "title": "Geospatial Indexing and Scoring: Unlocking the Power of Location-Based Data Analysis | Towards Data Science",
    "description": "A hands-on guide on geospatial indexing using Python & H3",
    "keywords": null,
    "author": "Ransaka Ravihara",
    "og:locale": "en_US",
    "og:type": "article",
    "og:title": "Geospatial Indexing and Scoring: Unlocking the Power of Location-Based Data Analysis",
    "og:description": "A hands-on guide on geospatial indexing using Python & H3",
    "og:url": "https://towardsdatascience.com/geospatial-indexing-and-scoring-unlocking-the-power-of-location-based-data-analysis-b77a7599b4c/",
    "og:site_name": "Towards Data Science",
    "og:image": "https://assets.insightmediagroup.io/media/wp-content/uploads/2023/01/13KeHwu9ourA6yBPn8KVITA.jpeg",
    "og:image:width": "1105",
    "og:image:height": "729",
    "og:image:type": "image/jpeg",
    "twitter:card": "summary_large_image",
    "twitter:site": "@TDataScience",
    "twitter:creator": "@TDataScience",
    "twitter:label1": "Written by",
    "twitter:data1": "Ransaka Ravihara",
    "twitter:label2": "Est. reading time",
    "twitter:data2": "6 min read",
    "article:published_time": "2023-01-25T16:01:10.000Z",
    "article:modified_time": "2023-01-25T16:01:10.000Z",
    "article:author": "https://towardsdatascience.com/author/ransakaravihara/"
  },
  "paywall": {
    "listed_paid": true,
    "detected": false,
    "marker": "",
    "public_only": true,
    "policy": "付费/会员内容只保留页面公开可见部分，不绕过付费墙"
  },
  "crawl": {
    "success": true,
    "status_code": 200,
    "error": ""
  },
  "code_blocks": [
    {
      "language": "txt",
      "file": "attachments/1d92f3b349ae/code/block_000.txt",
      "chars": 89
    },
    {
      "language": "txt",
      "file": "attachments/1d92f3b349ae/code/block_001.txt",
      "chars": 368
    },
    {
      "language": "txt",
      "file": "attachments/1d92f3b349ae/code/block_002.txt",
      "chars": 620
    },
    {
      "language": "txt",
      "file": "attachments/1d92f3b349ae/code/block_003.txt",
      "chars": 336
    },
    {
      "language": "txt",
      "file": "attachments/1d92f3b349ae/code/block_004.txt",
      "chars": 326
    },
    {
      "language": "txt",
      "file": "attachments/1d92f3b349ae/code/block_005.txt",
      "chars": 214
    },
    {
      "language": "txt",
      "file": "attachments/1d92f3b349ae/code/block_006.txt",
      "chars": 324
    }
  ],
  "images": [
    {
      "src": "https://assets.insightmediagroup.io/media/wp-content/uploads/2023/01/09uVzh9jAw7JqJNkP-scaled.jpg",
      "alt": "Photo by Antoine Merour on Unsplash",
      "local_path": "attachments/1d92f3b349ae/images/000.jpg",
      "bytes": 968024,
      "downloaded": true
    },
    {
      "src": "https://assets.insightmediagroup.io/media/wp-content/uploads/2023/01/1AqoiZDvgRBsnDk_19kO-EQ.png",
      "alt": "",
      "local_path": "attachments/1d92f3b349ae/images/001.png",
      "bytes": 2330,
      "downloaded": true
    },
    {
      "src": "https://assets.insightmediagroup.io/media/wp-content/uploads/2023/01/1yC7MHmXbYIxIbG4qPMje-Q.png",
      "alt": "",
      "local_path": "attachments/1d92f3b349ae/images/002.png",
      "bytes": 2582,
      "downloaded": true
    },
    {
      "src": "https://assets.insightmediagroup.io/media/wp-content/uploads/2023/01/1ev1ZfyijaC3qSbzhCMZqSg.jpeg",
      "alt": "What we have so far | Image by Author",
      "local_path": "attachments/1d92f3b349ae/images/003.jpeg",
      "bytes": 37151,
      "downloaded": true
    },
    {
      "src": "https://assets.insightmediagroup.io/media/wp-content/uploads/2023/01/1B4_U6j0RiN_6nbpMalUxhg.jpeg",
      "alt": "Map multiple points to one hexagon | Image by Author",
      "local_path": "attachments/1d92f3b349ae/images/004.jpeg",
      "bytes": 4513,
      "downloaded": true
    },
    {
      "src": "https://assets.insightmediagroup.io/media/wp-content/uploads/2023/01/1Cm5lB-WG5wmVwsJBmvG1QQ.jpeg",
      "alt": "Converting geojson tile into a list of hexagons | Image by Author",
      "local_path": "attachments/1d92f3b349ae/images/005.jpeg",
      "bytes": 54908,
      "downloaded": true
    },
    {
      "src": "https://assets.insightmediagroup.io/media/wp-content/uploads/2023/01/1oQIHNZXHJNJ6j9ZO-M_D7w.jpeg",
      "alt": "Image by Author",
      "local_path": "attachments/1d92f3b349ae/images/006.jpeg",
      "bytes": 93911,
      "downloaded": true
    },
    {
      "src": "https://assets.insightmediagroup.io/media/wp-content/uploads/2023/01/1gNYP1vsc-xIS-RMuB8kXpg.png",
      "alt": "Score distribution | Image by Author",
      "local_path": "attachments/1d92f3b349ae/images/007.png",
      "bytes": 15591,
      "downloaded": true
    },
    {
      "src": "https://assets.insightmediagroup.io/media/wp-content/uploads/2023/01/1RDBOuQR_zy13e6PrBjU-Yg.jpeg",
      "alt": "Region&#039;s hotspots | Image by Author",
      "local_path": "attachments/1d92f3b349ae/images/008.jpeg",
      "bytes": 90153,
      "downloaded": true
    },
    {
      "src": "https://assets.insightmediagroup.io/media/wp-content/uploads/2022/04/0k-oZn2dY_NRI5Uqr-scaled.jpg",
      "alt": "",
      "local_path": "attachments/1d92f3b349ae/images/009.jpg",
      "bytes": 643338,
      "downloaded": true
    },
    {
      "src": "https://assets.insightmediagroup.io/media/wp-content/uploads/2021/02/1Syve2d77KLRX3nW7o1Q48w.png",
      "alt": "",
      "local_path": "attachments/1d92f3b349ae/images/010.png",
      "bytes": 245327,
      "downloaded": true
    },
    {
      "src": "https://assets.insightmediagroup.io/media/wp-content/uploads/2021/10/1WRt7jEmSZr7i5vM2copzLg.png",
      "alt": "",
      "local_path": "attachments/1d92f3b349ae/images/011.png",
      "bytes": 34527,
      "downloaded": true
    },
    {
      "src": "https://assets.insightmediagroup.io/media/wp-content/uploads/2020/08/00Fl-pArbs5J4UqRD-scaled.jpg",
      "alt": "",
      "local_path": "attachments/1d92f3b349ae/images/012.jpg",
      "bytes": 233755,
      "downloaded": true
    },
    {
      "src": "https://assets.insightmediagroup.io/media/wp-content/uploads/2020/03/0oBHqFORpVJhxrlwF-scaled.jpg",
      "alt": "",
      "local_path": "attachments/1d92f3b349ae/images/013.jpg",
      "bytes": 512880,
      "downloaded": true
    },
    {
      "src": "https://assets.insightmediagroup.io/media/wp-content/uploads/2023/10/1AesSE_wxa1UCZKKHZLt8rg.png",
      "alt": "",
      "local_path": "attachments/1d92f3b349ae/images/014.png",
      "bytes": 728144,
      "downloaded": true
    },
    {
      "src": "https://assets.insightmediagroup.io/media/wp-content/uploads/2020/10/1HpLPlWgRvoqlzpKZy1s5wg.png",
      "alt": "",
      "local_path": "attachments/1d92f3b349ae/images/015.png",
      "bytes": 194148,
      "downloaded": true
    },
    {
      "src": "https://assets.insightmediagroup.io/media/wp-content/uploads/2017/04/1-7oApYM0Zl_K0OsDD5V_fQ.png",
      "alt": "",
      "local_path": "attachments/1d92f3b349ae/images/016.png",
      "bytes": 141068,
      "downloaded": true
    },
    {
      "src": "https://assets.insightmediagroup.io/media/wp-content/uploads/2021/04/0HMZO2a6sMt9RPaJU-scaled.jpg",
      "alt": "",
      "local_path": "attachments/1d92f3b349ae/images/017.jpg",
      "bytes": 327651,
      "downloaded": true
    }
  ],
  "audio": [],
  "videos": [
    {
      "src": "https://www.youtube.com/c/TowardsDataScience",
      "quality": "unavailable",
      "local_path": "",
      "note": "无1080p且无720p，未交付更低清晰度"
    }
  ],
  "links": [
    {
      "type": "internal",
      "href": "https://towardsdatascience.com/"
    },
    {
      "type": "internal",
      "href": "https://towardsdatascience.com/latest/"
    },
    {
      "type": "internal",
      "href": "https://towardsdatascience.com/tag/editors-pick/"
    },
    {
      "type": "internal",
      "href": "https://towardsdatascience.com/tag/the-variable/"
    },
    {
      "type": "internal",
      "href": "https://towardsdatascience.com/shipai/"
    },
    {
      "type": "internal",
      "href": "https://towardsdatascience.com/submissions/"
    },
    {
      "type": "internal",
      "href": "https://towardsdatascience.com/category/data-science/"
    },
    {
      "type": "internal",
      "href": "https://towardsdatascience.com/author/ransakaravihara/"
    },
    {
      "type": "internal",
      "href": "https://towardsdatascience.com/geospatial-indexing-and-scoring-unlocking-the-power-of-location-based-data-analysis-b77a7599b4c/"
    },
    {
      "type": "internal",
      "href": "https://towardsdatascience.com/tag/data-science/"
    },
    {
      "type": "internal",
      "href": "https://towardsdatascience.com/tag/python/"
    },
    {
      "type": "internal",
      "href": "https://towardsdatascience.com/tag/spatial-analysis/"
    },
    {
      "type": "internal",
      "href": "https://towardsdatascience.com/aws-essentials-for-data-science-why-cloud-computing-141cc6cee284/"
    },
    {
      "type": "internal",
      "href": "https://towardsdatascience.com/category/technology/"
    },
    {
      "type": "internal",
      "href": "https://towardsdatascience.com/author/mgsosna/"
    },
    {
      "type": "internal",
      "href": "https://towardsdatascience.com/a-beginners-guide-to-using-djangos-impressive-data-management-abilities-9e94efe3bd6e/"
    },
    {
      "type": "internal",
      "href": "https://towardsdatascience.com/author/dmnkplzr/"
    },
    {
      "type": "internal",
      "href": "https://towardsdatascience.com/svm-talking-algos-using-interior-point-methods-for-svm-training-d705cdf78c94/"
    },
    {
      "type": "internal",
      "href": "https://towardsdatascience.com/category/artificial-intelligence/machine-learning/"
    },
    {
      "type": "internal",
      "href": "https://towardsdatascience.com/author/marialavrovskaya/"
    },
    {
      "type": "external",
      "href": "https://write.insightmediagroup.io"
    },
    {
      "type": "external",
      "href": "https://www.linkedin.com/company/towards-data-science/"
    },
    {
      "type": "external",
      "href": "https://x.com/TDataScience"
    },
    {
      "type": "external",
      "href": "https://unsplash.com/@amerour"
    },
    {
      "type": "external",
      "href": "https://unsplash.com"
    },
    {
      "type": "external",
      "href": "https://roadmap.sh/ai-data-scientist"
    },
    {
      "type": "external",
      "href": "https://github.com/Ransaka/Spatial-indexing-with-h3/tree/master/data"
    },
    {
      "type": "external",
      "href": "https://h3geo.org/"
    },
    {
      "type": "external",
      "href": "https://github.com/Ransaka/Spatial-indexing-with-h3.git"
    },
    {
      "type": "external",
      "href": "https://www.linkedin.com/in/ransaka/"
    },
    {
      "type": "external",
      "href": "https://www.facebook.com/sharer/sharer.php?title=Geospatial+Indexing+and+Scoring%3A+Unlocking+the+Power+of+Location-Based+Data+Analysis&u=https%3A%2F%2Ftowardsdatascience.com%2Fgeospatial-indexing-and-scoring-unlocking-the-power-of-location-based-data-analysis-b77a7599b4c%2F"
    },
    {
      "type": "external",
      "href": "https://www.linkedin.com/shareArticle?mini=true&title=Geospatial+Indexing+and+Scoring%3A+Unlocking+the+Power+of+Location-Based+Data+Analysis&url=https%3A%2F%2Ftowardsdatascience.com%2Fgeospatial-indexing-and-scoring-unlocking-the-power-of-location-based-data-analysis-b77a7599b4c%2F"
    },
    {
      "type": "external",
      "href": "https://x.com/share?text=Geospatial+Indexing+and+Scoring%3A+Unlocking+the+Power+of+Location-Based+Data+Analysis&url=https%3A%2F%2Ftowardsdatascience.com%2Fgeospatial-indexing-and-scoring-unlocking-the-power-of-location-based-data-analysis-b77a7599b4c%2F"
    },
    {
      "type": "external",
      "href": "https://www.youtube.com/c/TowardsDataScience"
    },
    {
      "type": "external",
      "href": "https://www.threads.net/@towardsdatascience"
    },
    {
      "type": "external",
      "href": "https://bsky.app/profile/towardsdatascience.com"
    },
    {
      "type": "external",
      "href": "https://thenewstack.io"
    },
    {
      "type": "external",
      "href": "https://roadmap.sh"
    },
    {
      "type": "external",
      "href": "https://insightmediagroup.io/creator-network"
    }
  ],
  "repair_version": 2,
  "repaired_at": "2026-10-14T11:11:49Z",
  "source_url": "https://towardsdatascience.com/geospatial-indexing-and-scoring-unlocking-the-power-of-location-based-data-analysis-b77a7599b4c/",
  "delivery_status": "excluded_paid",
  "discovery_status": "excluded_paid",
  "missing_reason": "按原约定排除付费/会员全文"
}