Explore all Geo open source software, libraries, packages, source code, cloud functions and APIs.

Explore Related Topics

Popular New Releases in Geo

openlayers

6.14.1

cesium

CesiumJS 1.92

mapbox-gl-js

v2.8.2

turf

v6.5.0

react-map-gl

v7.0.11

Popular Libraries in Geo

ChineseBQB

by zhaoolee doticonjavascriptdoticon

star image 9910 doticon

🇨🇳 Chinese sticker pack,More joy / 表情包的博物馆, Github最有毒的仓库, 中国表情包大集合, 聚欢乐~

openlayers

by openlayers doticonjavascriptdoticon

star image 8922 doticonBSD-2-Clause

OpenLayers

cesium

by CesiumGS doticonjavascriptdoticon

star image 8557 doticonApache-2.0

An open-source JavaScript library for world-class 3D globes and maps :earth_americas:

mapbox-gl-js

by mapbox doticonjavascriptdoticon

star image 8527 doticonNOASSERTION

Interactive, thoroughly customizable maps in the browser, powered by vector tiles and WebGL

turf

by Turfjs doticonjavascriptdoticon

star image 6754 doticonMIT

A modular geospatial engine written in JavaScript

react-map-gl

by visgl doticontypescriptdoticon

star image 6498 doticonNOASSERTION

React friendly API wrapper around MapboxGL JS

go-datastructures

by Workiva doticongodoticon

star image 6157 doticonApache-2.0

A collection of useful, performant, and threadsafe Go datastructures.

QGIS

by qgis doticonc++doticon

star image 5693 doticonGPL-2.0

QGIS is a free, open source, cross platform (lin/win/mac) geographical information system (GIS)

google-map-react

by google-map-react doticonjavascriptdoticon

star image 5643 doticonMIT

Google map library for react that allows rendering components as markers :tada:

Trending New libraries in Geo

prettymaps

by marceloprates doticonjupyter notebookdoticon

star image 5032 doticonMIT

A small set of Python functions to draw pretty maps from OpenStreetMap data. Based on osmnx, matplotlib and shapely libraries.

X-TRACK

by FASTSHIFT doticoncdoticon

star image 3251 doticonGPL-3.0

A GPS bicycle speedometer that supports offline maps and track recording

organicmaps

by organicmaps doticonc++doticon

star image 3208 doticonApache-2.0

🍃 Organic Maps is a free Android & iOS offline maps app for travelers, tourists, hikers, and cyclists. It uses crowd-sourced OpenStreetMap data and is developed with love by MapsWithMe (MapsMe) founders and our community. No ads, no tracking, no data collection, no crapware. Your donations and positive reviews motivate and inspire our small team!

maplibre-gl-js

by maplibre doticontypescriptdoticon

star image 3036 doticonNOASSERTION

The open-source fork of Mapbox GL JS: Interactive maps in the browser, powered by vector tiles and WebGL.

mapus

by alyssaxuu doticonjavascriptdoticon

star image 2178 doticonMIT

A map tool with real-time collaboration 🗺️

felicette

by plant99 doticonpythondoticon

star image 1748 doticonMIT

Satellite imagery for dummies.

Meshtastic-device

by meshtastic doticonc++doticon

star image 1647 doticonGPL-3.0

Device code for the Meshtastic ski/hike/fly/customizable open GPS radio

leafmap

by giswqs doticonpythondoticon

star image 1195 doticonMIT

A Python package for interactive mapping and geospatial analysis with minimal coding in a Jupyter environment

earthengine-py-notebooks

by giswqs doticonjupyter notebookdoticon

star image 913 doticonMIT

A collection of 360+ Jupyter Python notebook examples for using Google Earth Engine with interactive mapping

Top Authors in Geo

1

mapbox

110 Libraries

star icon29178

2

Esri

42 Libraries

star icon4274

3

osmlab

34 Libraries

star icon1699

4

giswqs

24 Libraries

star icon3539

5

digidem

21 Libraries

star icon697

6

openstreetmap

18 Libraries

star icon6281

7

iandees

16 Libraries

star icon184

8

developmentseed

16 Libraries

star icon474

9

makinacorpus

16 Libraries

star icon1312

10

perliedman

15 Libraries

star icon767

1

110 Libraries

star icon29178

2

42 Libraries

star icon4274

3

34 Libraries

star icon1699

4

24 Libraries

star icon3539

5

21 Libraries

star icon697

6

18 Libraries

star icon6281

7

16 Libraries

star icon184

8

16 Libraries

star icon474

9

16 Libraries

star icon1312

10

15 Libraries

star icon767

Trending Kits in Geo

Here are some famous Java Geospatial Libraries. Some Java Geospatial Libraries' use cases include Location-based services, GIS analysis, Spatial databases, Web mapping applications, and Mobile applications.


Java geospatial libraries refer to a set of software libraries written in the Java programming language that can be used for creating, manipulating, and analyzing geospatial data. These libraries allow developers to quickly and easily incorporate geospatial operations into their applications, such as mapping, searching, route optimization, and more.


Let us have a look at some of the famous Java Geospatial libraries.

geoserver

  • Supports advanced geometry operations, such as buffer, intersect, and union.
  • Has an extensive set of RESTful APIs.
  • Includes a robust security system.

proj4js

  • Support for a wide range of coordinate systems.
  • Ability to transform to and from multiple coordinate systems.
  • Open source and freely available.

jts

  • Supports polygonal and lineal geometry operations.
  • Provides a complete set of basic and extended spatial predicates and functions.
  • Designed to be thread-safe, so multiple threads can safely access the same geometry object.

geotools

  • Provides powerful tools for managing large, complex geospatial datasets.
  • Released under the LGPL open source license, making it free to use and modify.
  • Highly portable and makes it easy to share code .

geomesa

  • Support large-scale spatial analysis and data management, leveraging distributed storage and computation frameworks.
  • Supports a wide range of data formats and encodings, including GeoJSON, GML, and WKT.
  • Allows users to perform vector and raster analytics on large datasets.

h2gis

  • Offers a range of spatial analysis functions including buffer distance calculation and more.
  • Implements a custom R-Tree indexing scheme to support fast queries on geospatial data.
  • Offers an easy-to-use SQL interface to manipulate geospatial data stored in an H2 database.

udig-platform

  • Offers a drag-and-drop feature that allows users to visualize and edit GIS data.
  • Offers a fully integrated geoprocessing framework and an extensive library of GIS algorithms.
  • Has a sophisticated API and extensible plug-in architecture.

geoapi

  • Designed to be extensible and provides the ability to add custom data formats, services, and operations.
  • Written entirely in Java and is designed to be lightweight and fast.
  • Highly portable and can be used on any platform that supports Java.

You can use these tools to determine the location of website visitors based on their IP address or other location data.


These libraries provide a range of functionalities such as geocoding, reverse geocoding, distance calculations, and mapping. They allow developers to determine website visitors' country, city, region, and latitude/longitude based on their IP address. Google Maps Geolocation API is one of the most widely used PHP geolocation libraries. It provides a simple and reliable way to determine the location of website visitors using data from Google Maps. It allows developers to get the latitude and longitude of a location and its estimated accuracy. These libraries enable developers to provide a more personalized user experience by showing relevant content based on the location of website visitors. They also help you to create custom maps and visualizations based on geospatial data and enable location-based advertising and marketing strategies.


PHP Geolocation Libraries are essential tools for web developers who want to create location-based web applications. We have handpicked the top and trending open-source PHP routing libraries for your next application development project:

GeoIP2 PHP:

  • Used in Web Services, REST applications, etc.
  • Provides an easy-to-use API for working with MaxMind's GeoIP2 and GeoLite2 databases.
  • Allows developers to determine the location of website visitors based on their IP address.

Google Maps Geolocation API:

  • Used to determine the location of website visitors using data from Google Maps.
  • Allows developers to get the latitude and longitude of a location.
  • Also provides the estimated accuracy of the location.

Leaflet:

  • Used to handle dynamic map configurations working in a PHP context.
  • It is lightweight and easy to use for building mobile-friendly interactive maps.
  • Supports a wide range of map providers.

GeoPHP:

  • Used in Geo, Map applications, etc.
  • It’s a native PHP library for geometry operations and provides basic geospatial functionality.
  • Features include point-in-polygon testing, distance calculations, and geometry simplification.

Geocoder:

  • Used in Utilities, Command Line Interface, Laravel applications, etc.
  • Provides geocoding and reverse geocoding services.
  • Supports data from various providers such as Google Maps, OpenStreetMap, and Bing Maps.

IP2Location:

  • Used in Networking, TCP applications, etc.
  • Provides fast lookup and geolocation services based on IP address data.
  • Includes a database of IP address ranges and location data for various countries and regions.

SmartyStreets:

  • Used in Web Services, REST applications, etc.
  • Provides address validation and geocoding services.
  • Uses data from various providers such as Google Maps, OpenStreetMap, and Bing Maps.

Geotools:

  • Used in Manufacturing, Utilities, Aerospace, Defense, Geo, Map applications, etc.
  • Supports accept almost kinds of WGS84 geographic coordinates.
  • Built on top Geocoder and React libraries.

Location:

  • Used in Networking, TCP applications, etc.
  • Helps retrieve a user's location from their IP address using various services.
  • Works with PHP >= 7.3 and Laravel >= 5.0.

A React Native map library is a software library. It enables developers to incorporate interactive maps into their React Native mobile applications. It can add geographical data to an application. It will allow users to search and view a particular location in detail. Developers can use libraries like Leaflet and Google Maps for basic vector maps. These libraries have many features. The features include custom markers & annotations support, routing, and real-time traffic data. For complex map models, developers can use Google Maps for React Native 3D or Mapbox GL for React Native. Android Maps Utils is a library for Google Maps Android API. It simplifies many otherwise tedious and time-consuming operations. The common way to access these libraries is through the Google Developer Console. It offers a range of tools and services for developers to use. It allows developers to create custom maps and markers and customize their style.  


React Native map libraries use rendering methods to create maps and other visualizations. The most used rendering method is MapView's unique rendering method. It consists of custom components and views. It allows for a completely arbitrary set of React views that we need to render to the map. React Native libraries like React Navigation and react-native-maps provide their custom map components. We will allow a more intuitive and react-like API for creating maps. Also, developers can use platform-native code. The code can be the Google Maps API, the Native Google Map, or the Google Maps SDK to create maps. These native APIs provide their features and methods for creating and manipulating maps. They include map styling customization, center set-up, and enabling features like offline usage. iOS developers can use Apple Maps and MapKit. It helps create custom MapViews with the MapView initialRegion property. It will customize map views, markers, and tiles.  

Different features available in react native map libraries:  

  • Navigation functions include turn-by-turn directions, route optimization, and geofencing.  
  • Data Visualization – It will allow developers to visualize data on maps.  
  • Search – Search functions like autocomplete and geocoding allow users to find specific locations.  
  • Markers and Annotations – We can focus on specific locations or areas of interest.  
  • Real-time Traffic – Real-time data streams can display traffic information in near real-time.  
  • Indoor Navigation – Features like 3D models and floor plans. It will allow users to navigate indoors.  

Tips to use:  

  • Research the different libraries available to find the one that best fits your needs. It will check their documentation and tutorials.  
  • Familiarize yourself with the library's API to build the needed features.  
  • Use the library's features to customize the map to fit your project's requirements.  
  • Use caching to reduce the load on the API and improve performance.  
  • Monitor the library's performance and adjust the code. 


Note: One can start learning from OSM Wiki, a popular resource for React Native map libraries. It provides a comprehensive overview of the available libraries and their features. The wiki also includes information on how to update the androidMapsUtilsVersion. One can find information about how to use existing apps. Then install OpenStreetMap and use the components with intuitive and react-like API. They can also find jpw to store maps on the device and use the new AnimatedRegion in Native Geolocation.  

How to build a react map library?  

  • Choose the right platform. 
  • Install the libraries using the official installation guide provided by the library's documentation. 
  • Research existing libraries. 
  • Choose the right mapping API.  
  • Develop a user-friendly interface. 
  • Test and debug.  

React Native Map library doesn't include methods to find the location's latitude and longitude. But one can access a device's current location using the Geolocation API. In React native map libraries, a manifest file is a file. It contains information about the application and its package. It handles registering the application with the system and launching it if requested. The meta-data tag in these libraries is an XML tag specifying application information. This tag provides extra context to the user. It helps them understand the application better.  


AnimatedRegion is an object used to animate a region on a map. It is part of the React Native Map Library and provides a way to animate the center and zoom level of a region on the map. Animated Marker Position provides developers with powerful tools to animate their maps. Developers can add markers to the maps, customize views, and change positions in real-time. The xCode workspace helps developers to create and manage projects. It provides a graphical UI to manage the source files. It also helps build settings and other project-wide properties. Buildscript is a tool to compile code and manage dependencies. It helps developers to keep their projects organized and up to date with the latest changes. It also helps with debugging and troubleshooting any issues that may arise.  


React Native Map Libraries have a wide range of uses. These will range from navigation to data visualization to augmented reality. They help create smartphone applications. It will allow users to view detailed street maps of New York City to create applications. It allows users to visualize the disease spread and share the location with friends/family. It will let them search for real estate listings in each area and to navigate from one location to another. They support Android drawable. It will allow developers to add custom images and icons to apps. These libraries provide advantages like easy integration and support for native mapping components. It offers powerful rendering capabilities, performance compared, and flexibility in customizing and styling. Moreover, it provides features like geocoding and reverse geocoding. It will access all the Google Maps API features.  


Let's look at each library in detail. The links below allow you to access package commands, installation notes, and codesnippets.  

react-native-mapblox-gl:  

  • It supports localization so that one can display maps in different languages.  
  • Allows you to customize the map styling, like changing the color, line width, and more.  
  • It supports offline maps, allowing one to store and access map data offline.  

react-native-modals: 

  • Designed to be responsive, adjusting its size and position when the orientation changes.  
  • Built-in transition animations will allow users to customize the look and feel of their modal components.  
  • Allows for dynamic positioning of modal components on the screen. 

AirMapView: 

  • It allows cache mapping data in a local database for offline use.  
  • It provides a powerful SDK to customize the map view in various ways.  
  • Provides features to take advantage of the latest mapping technology. The technologies can be 3D terrain data and advanced search capabilities.  

react-native-amap3d: 

  • We can use it in many languages, including Chinese, English, Japanese, and Korean.  
  • It can provide geolocation services and location tracking.  
  • Provides real-time traffic data, which can analyze traffic patterns and plan routes.  

maps:  

  • Designed to work with geospatial data, such as points, lines, and polygons.  
  • Provide more advanced interactivity features such as zooming, panning, and hovering.  
  • Can use various geocoding APIs to convert a location into coordinates. 

react-native-google-places-autocomplete:  

  • Supports features for users with disabilities to use the library.  
  • It supports geocoding and reverse geocoding. It will do so by making it easier to get the latitude and longitude of a location.  
  • Designed to be easy to set up and use, with minimal code required.  

react-native-maps-directions:  

  • It provides voice guidance features to help you stay on track.  
  • It allows one to customize the markers that appear on the map.  
  • It can integrate with one's device's geolocation services to give one accurate direction. 

react-native-location: 

  • Allows developers to set up background location updates.  
  • Offers high accuracy for location data, allowing for precise location tracking.  
  • It supports an offline mode. It allows location tracking even when no internet connection is available.  

react-native-geolocation:  

  • Utilizes native geolocation APIs by providing a more accurate and reliable location experience.  
  • It provides a React component and a hook to track the user's real-time location.  
  • It supports tracking the user's location in both foreground and background modes.  

react-native-map-clustering:  

  • Supports Google Maps and Mapbox APIs.  
  • Update clusters as we zoom or pan the map, keeping the map updated with the most recent data.  
  • It supports advanced styling for clusters and markers. It will do so by making it easy to customize the look and feel of the map. 

FAQ: 

What is Native Google Map, and how does it compare to other map libraries?  

The library enables developers to embed Google Maps into their applications. It has many features, including Street View, 3D Buildings, real-time traffic, and more. It is easy to use and allows developers to customize the look and feel of the map. The Native Google Map offers more comprehensive features and is more user-friendly. It also offers options for customization, making it the go-to solution for developers.  

 

How does React's rendering method differ from other frameworks when using map libraries?  

React's rendering method differs from other frameworks when using map libraries. It is because it uses a virtual DOM to render components. This virtual DOM allows React to render components, as it only re-renders components. It will have changed instead of re-rendering the entire page. React's rendering allows declarative mapping library usage, like Mapbox, making creating interactive maps.  

 

What are React views? How do they interact with maps on mobile devices?  

React views are components of a React application used to create a user interface. They are usually composed of HTML, CSS, and JavaScript. React views can interact with maps on mobile devices in a few different ways. For example, they can render map tiles and display markers and pins on the map. They can also add interactive features like search and routing. React views can customize the look and feel of the map, such as changing the color scheme or adding custom logos.  

 

How can I use the React Native command line interface to integrate a map library into my codebase?  

You can use the command line to integrate a map library into your codebase by running the below command: 

 'react-native link [library name]' 

This will link the library to your project, allowing you to use them within your code. For specific instructions on how to link a library, refer to the documentation.  


What are some common use cases for map usage in a React application?  

  • Rendering lists of data on a map.  
  • Displaying the current location of a user.  
  • Generating routes between two or more locations  
  • Showing markers for places of interest.  
  • Adding geolocation search to an application.  
  • Creating heatmaps to display data.  
  • Showing nearby locations with a search radius.  
  • Calculating distances between two points.  
  • Adding interactive overlays to the map.  
  • Creating custom map styles.  

 

In what ways does iOS MapKit differ from Android's Google Maps API when used within a React Native app?  

The difference between iOS MapKit and Android's Google Maps API in a React Native app. It is the API and the functionality each provides. We can tailor the iOS MapKit to the Apple Maps app. It provides mapping functions like geocoding, traffic data, and route optimization. But we tailor the Google Maps API to the Google Maps app. It offers real-time traffic, satellite imagery, and public transit information. The Google Maps API also has many third-party libraries, plugins, and services. It can customize and extend the functionality of Google Maps.  

 

How can I implement the MapView component of my preferred maps library in my React-Native app?  

The steps depend on your library, but the general approach is the same. First, install the library of your choice (e.g., Google Maps, Apple Maps, Mapbox) and add it to your project. You can then use the library's API to create a new MapView component, which you can include in your React Native app. You must add any permissions or configurations to make the MapView component work.  

 

What kind of debugging tools help troubleshoot issues related to map integration?  

1. Network tab:  

Allows developers to view network requests, responses, and errors associated with map integration. It helps identify potential problems.  

2. Console tab:  

Provides a log of errors, warnings, and other messages related to map integration.  

3. Breakpoints:  

Provides the ability to pause the execution of code at a certain point. It can help inspect the application's state.  

4. Visualization tools:  

Provides graphical representations of the maps integration code that can identify potential issues.  

5. Performance tab:  

Measures map integration for its code performance to identify potential bottlenecks.  

 

Should I know any limitations or restrictions on map regions while developing applications?  

Yes, there are limitations and restrictions to be aware of when developing an application. The library only supports a limited number of map providers, and not all are available in all regions. Additionally, the library does not provide access to all available map data. You may need to investigate alternative map providers to access specific data. Also, features like clustering or markers, we can limit depending on your map provider. Finally, the library may need help handling large datasets. So, keep this in mind if your application requires loading large map datasets.  

 

Is there a library that provides features for building applications with Maps API?  

Libraries provide features for building better applications with Maps APIs and React Native. Some of the most popular libraries include react-native-maps, react-native-google-maps, react-native-geolocation, and react-native-mapbox-gl. 

PHP Map Libraries are designed to help developers display and manipulate maps on web pages using PHP. All PHP libraries offer ways to display maps on web pages. They provide different map styles, like satellite, terrain, and street views. These libraries offer customization options like changing map styles, adding custom data overlays, and customizing markers.  


Most PHP map libraries will let developers place markers on the map, which will indicate points of interest or for identifying locations. We can customize those markers with different labels or icons. Geocoding will help convert addresses into latitude and longitude coordinates, and these libraries offer these features for developers to pinpoint locations on the map. These libraries offer functionality for helping users in planning trips and getting directions. They offer support when you want to add layers to the map. They offer APIs for developers to integrate the map functionality into their applications.  


Here is the list of the top 7 PHP Map Libraries handpicked to help developers integrate their maps with their applications.  

GeoIP2-php: 

  • Is a PHP library that offers an easy-to-use and simple interface for MaxMind’s GeoIP2 database. 
  • Offers accurate and detailed information about the geographic location of IP addresses. 
  • Allows PHP developers to easily integrate MaxMind’s GeoIP2 databases directly into their web applications.  

phpgeo: 

  • Is a PHP library that offers an easy-to-use interface to work with geographic coordinates like latitude and longitude.  
  • Includes classes for working with bounding boxes, polygons, points, and conversion between coordinate systems and distance calculation.  
  • Is designed to be lightweight and easy to use, making it an excellent choice for developers who need to work with geographic coordinates in their PHP applications.  

geotools: 

  • Is a PHP library that offers various tools for working with geographic data like geographic projections, geometrics, and coordinates. 
  • Includes classes for workings with polygons, points, lines, and other geometric shapes and methods for transforming between different coordinate projections and systems. 
  • Is a useful tool for PHP developers who want to work with geographic data in their applications.  

Valinor: 

  • Is a PHP library that offers various tools for working with geographic spatial databases and data.  
  • Includes support for spatial data types and functions and integration with popular spatial databases like PostGIS.  
  • Includes classes for working with lines, points, polygons, and other shapes and methods for calculating areas, the intersection between shapes, and distances.  

geoPHP: 

  • Is a PHP library that offers tools to work with geographic data like geographic geometrics, projections, and coordinates.  
  • Support for different coordinate projections and systems, including popular systems like UTM, Lambert Conformal Conic, and WGS84.  
  • Supports various coordinate projections and systems and their geometry transformation and class methods, making it a powerful tool for working with geographic data. 

GeocoderLaravel: 

  • Is a PHP library that offers geocode and reverse geocoding services to Laravel applications. 
  • Uses popular geocoding services like Bing Maps, OpenStreetMap, and Google Maps for converting place names or addresses into geographic coordinates and vice versa. 
  • Includes caching functionality that helps improve the performance of geocoding requests by caching the results of previous requests.  

google-maps: 

  • Is a PHP client library for the Google Maps API, making it easy to integrate into your application.  
  • Offers a straightforward way to access different services offered by Google Maps, like directions, distance matrix, and geocoding.  
  • Offers support for directions that allows developers to retrieve directions between two or more locations.  

Here is the best open source React map libraries for your applications. You can use these simple and easy-to-use components for adding maps and mapping functionality to your React-based applications.

 

These libraries allow developers to create interactive maps quickly and easily with markers, popups, and other features. Also, they offer a wide range of customization options to fit their specific needs for creating maps with React. These features include vector tiles and styling with interaction options. Moreover, using these React map libraries, you can add advanced functionalities to your applications, such as vector and raster data, tiled maps, and more.


Using the Google Maps React library, you can also integrate Google Maps into React applications. It provides a simple and easy-to-use API for adding maps, markers, and other functionality with just a few lines of code.

 

There are several such libraries that can suit your specific needs and requirements. We have handpicked top and trending open source React map libraries based on popularity, licensing, and unique features to add mapping functionality to React applications:

Google Maps React:

  • Used for integrating Google Maps into React applications.
  • Provides a simple and easy-to-use API.
  • Allows adding maps, markers, and other functionality with just a few lines of code.

Maps | Mapbox GL:

  • Used in Geo, Map, React Native, and React applications. 
  • Offers react native module for creating custom maps.
  • Support MapLibre flavors of Mapbox SDKs.

React-simple-maps:

  • Used for creating simple, interactive maps in React.js.
  • Offers features such as panning, zooming, simple rendering optimization, etc.
  • Provides a declarative API built on top of D3.js with TopoJSON.
  • Can be used with other libraries to create more complex maps.

React-leaflet:

  • Used for creating maps with markers, popups, and other interaction options.
  • Offers a simple API and extensive documentation.
  • Provides bindings between React and Leaflet.

React-map-gl:

  • Provides a simple and intuitive API.
  • Allows adding maps, markers, and other functionality with just a few lines of code.
  • Offers features like vector tiles, styling, and other interaction options. Used in Geo, Map, and WebGL applications as a React-based wrapper around Mapbox GL JS.

bing-maps-react:

  • Used for integrating Bing Maps into React applications.
  • Provides a simple and easy-to-use API.
  • Offers complete Bing maps functionality, including maps, markers, and more.
  • Get a Bing Maps API key from the Bing Maps Dev Center to take full advantage of this component.

React-OpenLayers:

  • Used for creating feature-rich, interactive with React using OpenLayers.
  • Provides functionalities such as vector and raster data, tiled maps, and more.
  • Helps display a dynamic map on any web page.

A React map library is a powerful tool. It enables developers to integrate interactive maps into their React applications. These libraries are designed to work with React. It provides various components for map rendering, marker placement, and user interactions. By leveraging popular engines, these libraries offer a React-centric approach to working with maps. Developers can choose from Google Map React library, React Leaflet, and Pigeon Maps. It provides intuitive APIs and components to create appealing and engaging map-based experiences.  


Many features in the React map libraries make interacting with and seeing maps easier. These incorporate showing road maps, adding custom markers, and handling client collaborations. It helps in coordinating with outer information sources through APIs like GeoJSON. Developers can create interactive map applications thanks to the libraries' APIs and components. Developers can create map-based experiences that are appealing and engaging. They can use map styles, marker appearances, and information windows. Legitimate treatment of interface keys helps confirm demands and avoid use limits. Lazy loading maps or clustering markers can improve map rendering efficiency. It does so by optimizing performance.  


Applications for React map libraries include: 

  • location-based services, 
  • the visualization of geospatial data, 
  • the display of points of interest, and 
  • Immersive map-based experiences. 


They are useful in data analytics, logistics, tourism, and urban planning. It's where maps represent and analyze data. With the adaptability given by these libraries, engineers can make customized map arrangements. The arrangements that meet the particular requirements of their activities. By getting to know the Programming interface, engineers can use these libraries.  

react-map-gl:  

  • Used for creating interactive and customizable maps in React applications.  
  • Offers support for displaying maps with various layers. It includes markers, polygons, and heat maps.  
  • Provides support for different map styles and projections. It allows developers to create appealing and informative maps.  
  • It supports user interactions like zooming, panning, and rotating the map. It provides a seamless and intuitive map navigation experience.  
  • Offers built-in support for handling responsive design. It makes creating maps that adapt to different screen sizes and devices easier. 

Leaflet:  

  • Used for creating lightweight and versatile maps in React applications.  
  • Offers various features, including marker placement, polygon overlays, and tile layers.  
  • Provides extensive support for customizing map styles, marker icons, and pop-up windows.  
  • It offers a large community and ecosystem with various plugins and extensions. It enhances map functionality and integrates with other libraries.  

react-google-maps  

  • Used for integrating Google Maps into React applications.  
  • Offers support for displaying maps, markers, and polygons using the Google Maps API.  
  • It provides features like geocoding, directions, and Street View. It allows developers to build rich and interactive map experiences.  
  • Supports various customization options, such as map styles, marker icons, and info windows. It enables developers to create appealing and informative maps.  

react-simple-maps:  

  • Used for creating simple and customizable maps in React applications.  
  • Offers a straightforward API for displaying maps, markers, and other map components.  
  • Provides support for SVG and GeoJSON data, allowing developers to visualize geographic data.  
  • Supports map interactions like zooming and panning. It provides a smooth and intuitive map navigation experience.

react-mapbox-gl:  

  • Used for creating interactive, high-performance maps using the Mapbox GL JS library.  
  • Offers various features, including map layers, marker placement, and customizable map styles.  
  • Provides support for displaying vector maps and leveraging Mapbox's powerful data visualization capabilities.  
  • It supports user interactions like zooming, panning, and rotating the map. It provides a smooth and responsive map navigation experience.  
  • Offers seamless integration with React. It allows developers to leverage React's component-based architecture to build complex map applications.  

FAQ 

1. What is the Google Maps JavaScript API, and how does it compare to other map engine libraries?  

The Google Maps JavaScript API helps in integrating interactive maps into web applications. It offers features like map rendering, geocoding, and directions. Its extensive documentation and seamless integration with other Google services stand out.  

 

2. How do I get an API key for the Google Map React library?  

Build a project in the Google Cloud Console to get an API key for the library. It enables the Google Maps JavaScript API and generates a unique API key. This key is added to your application code to allow access to Google Maps services.  

 

3. What are some features in a React Component Library designed for maps?  

React Component Libraries provide components for map rendering, marker placement, and map interactions. It helps in simplifying map integration in React applications. They offer customization options for map styles, marker icons, and controls. It enhances the maps' visual appeal and user experience.  

 

4. Does the Google Maps library and other mapping APIs differ?  

The Google Maps library differs from Mapbox or Leaflet in features and focus. Mapbox offers powerful data visualization capabilities and extensive customization options. At the same time, Leaflet is known for its simplicity and versatility with various plugins.  

 

5. How can I use the map and maps objects with my Google Maps markers?  

With the Google Maps library, you can use the map and map objects to manipulate and interact with the view. This includes updating marker positions. It is based on user input or animating the map to specific locations. Attaching event listeners to markers enables handling interactions like clicks or hover effects. It helps in creating dynamic and interactive map experiences.  

 

6. Are any custom map options available within the Google Map React library?  

The Google Map React library offers custom map options. It lets you choose map types and customize zoom levels, map centers, and styles. 

Here are the best open-source Python geospatial analysis libraries for your applications. You can use these for a wide range of functionality, from reading and writing data to performing complex geometric operations to visualizing and exploring data.


Specific open-source Python libraries provide advanced tools for performing complex geospatial analysis, such as coordinate reference systems, spatial projections, and raster data analysis. Whether you're working on a GIS project or want to visualize certain data on a map, these libraries are a great place to start. These data analysis libraries in Python make working with geospatial data easy and intuitive. These libraries offer a simple and powerful interface for working with various geospatial file formats, including shapefiles, GeoJSON, and more. Also, developers get extensive options for creating static and interactive maps and working with different projections.


We have handpicked the top and tending open-source Python libraries that make geospatial analysis more accessible and efficient. Moreover, they are actively maintained and are an excellent choice for your next geospatial analysis project or application development.

Fiona:

  • Used in Geo, Map applications, etc.
  • Useful for reading and writing spatial data in various formats.
  • Supports shapefiles and GeoJSON.

Geopandas:

  • Used for working with geospatial data.
  • Adds support for geographic data to pandas objects.
  • Provides a high-level interface for multiple geometries.

Shapely:

  • Used for performing geometric operations on points, lines, and polygonal shapes.
  • Offers manipulation and analysis of planar geometric objects.
  • Build using the extensively deployed GEOS, a C++ open-source geometry library.

Pyproj:

  • Used for performing coordinate transformations.
  • Allows projections from one coordinate system to another.
  • Provides interface to PROJ (cartographic projections and coordinate transformations library).

Rasterio:

  • Used for reading and writing raster data, such as satellite imagery.
  • Provides a Python API based on N-D arrays.
  • Offers binary packages for Linux, macOS, and Windows.

Folium:

  • A library for creating interactive maps using the popular leaflet.js library.
  • Allows data manipulation in Python and visualization in a Leaflet map.
  • Supports image, video, GeoJSON, and TopoJSON overlays.

Geopy:

  • Used in Web Services, REST applications, etc.
  • Useful for working with geographic data, including geocoding and distance calculations.
  • Helps locate coordinates, addresses, cities, countries, and landmarks across the globe.

Trending Discussions on Geo

Apps targeting Android 12 and higher required to specify an explicit value for `android:exported` [Cordova]

Rearranging polygons in geopandas for matplotlib plotting

Google Geo Chart: Get fill color of a specific series

how to convert geojson to shapely polygon?

uploaded an APK which has an activity,activity alias,service or broadcast receiver with intentfilter, but without 'android : exported' property set

php foreach loop don't work when I want to traverse json file

Which Mime Types contain charset=utf-8 directive?

Merge two pandas DataFrame based on partial match

Using cartopy to project geostationary data points onto a regular grid

Extracting the measurement unit (degrees, metres, etc.) from spatial data in R

QUESTION

Apps targeting Android 12 and higher required to specify an explicit value for `android:exported` [Cordova]

Asked 2022-Apr-01 at 20:06

When I am running to make the Apk in GitHub I got the error. As I am building the Apk in GitHub. There is no way to define something inside manifest as it is building every time fresh. All I can do is inside the Config.Xml file. After Adding android:exported="false" to it, also getting same error. Both images for this question reference attached here. GitHub Error and Config.Xml. Help will be appreciated.

1<?xml version='1.0' encoding='utf-8'?>
2<widget id="com.likehub.sweetheart" version="1.1.64" xmlns="http://www.w3.org/ns/widgets" xmlns:cdv="http://cordova.apache.org/ns/1.0">
3    <name>sweetheart</name>
4    <description>making love bird together</description>
5    <author email="mynamey9er@gmail.com" href="">likehub</author>
6    <content src="index.html" />
7    <access origin="*" />
8    <allow-intent href="http://*/*" />
9    <allow-intent href="https://*/*" />
10    <allow-intent href="tel:*" />
11    <allow-intent href="sms:*" />
12    <allow-intent href="mailto:*" />
13    <allow-intent href="geo:*" />
14    <preference name="AndroidXEnabled" value="true" />
15    <preference name="WebViewBounce" value="false" />
16    <preference name="UIWebViewBounce" value="false" />
17    <preference name="DisallowOverscroll" value="true" />
18    <preference name="LoadUrlTimeoutValue" value="700000" />
19    <preference name="ScrollEnabled" value="false" />
20    <preference name="SplashMaintainAspectRatio" value="true" />
21    <preference name="FadeSplashScreenDuration" value="1000" />
22    <preference name="FadeSplashScreen" value="true" />
23    <preference name="SplashShowOnlyFirstTime" value="false" />
24    <preference name="SplashScreen" value="screen" />
25    <preference name="SplashScreenDelay" value="5000" />
26    <preference name="AutoHideSplashScreen" value="true" />
27    <preference name="ShowSplashScreen" value="false" />
28    <preference name="ShowSplashScreenSpinner" value="false" />
29    <preference name="android-minSdkVersion" value="22" />
30    <preference name="BackupWebStorage" value="none" />
31    <preference name="Orientation" value="portrait" />
32    <preference name="AndroidPersistentFileLocation" value="Compatibility" />
33    <preference name="GradlePluginKotlinEnabled" value="true" />
34    <preference name="GradlePluginKotlinCodeStyle" value="official" />
35    <preference name="GradlePluginKotlinVersion" value="1.3.50" />
36    <preference name="AndroidLaunchMode" value="singleTask" />
37    <feature name="StatusBar">
38        <param name="ios-package" onload="true" value="CDVStatusBar" />
39    </feature>
40    <platform  name="android">
41        <preference name="android-targetSdkVersion" value="31" />
42        <edit-config  file="app/src/main/AndroidManifest.xml" mode="merge" android:exported="true" target="/manifest/application" xmlns:android="http://schemas.android.com/apk/res/android">
43            <application android:usesCleartextTraffic="true" />
44            <application android:networkSecurityConfig="@xml/network_security_config" />
45            
46            <intent-filter>
47                <action  android:name="MainActivity" android:exported="false"/>
48                <category android:name="android.intent.category.DEFAULT" />
49            </intent-filter>
50        </edit-config>
51        <resource-file src="resources/android/xml/network_security_config.xml" target="app/src/main/res/xml/network_security_config.xml" />
52        <allow-intent href="market:*" />
53        <icon density="ldpi" src="resources/android/icon/drawable-ldpi-icon.png" />
54        <icon density="mdpi" src="resources/android/icon/drawable-mdpi-icon.png" />
55        <icon density="hdpi" src="resources/android/icon/drawable-hdpi-icon.png" />
56        <icon density="xhdpi" src="resources/android/icon/drawable-xhdpi-icon.png" />
57        <icon density="xxhdpi" src="resources/android/icon/drawable-xxhdpi-icon.png" />
58        <icon density="xxxhdpi" src="resources/android/icon/drawable-xxxhdpi-icon.png" />
59        <splash density="land-ldpi" src="resources/android/splash/drawable-land-ldpi-screen.png" />
60        <splash density="land-mdpi" src="resources/android/splash/drawable-land-mdpi-screen.png" />
61        <splash density="land-hdpi" src="resources/android/splash/drawable-land-hdpi-screen.png" />
62        <splash density="land-xhdpi" src="resources/android/splash/drawable-land-xhdpi-screen.png" />
63        <splash density="land-xxhdpi" src="resources/android/splash/drawable-land-xxhdpi-screen.png" />
64        <splash density="land-xxxhdpi" src="resources/android/splash/drawable-land-xxxhdpi-screen.png" />
65        <splash density="ldpi" src="resources/android/splash/drawable-port-ldpi-screen.png" />
66        <splash density="port-ldpi" src="resources/android/splash/drawable-port-ldpi-screen.png" />
67        <splash density="mdpi" src="resources/android/splash/drawable-port-mdpi-screen.png" />
68        <splash density="port-mdpi" src="resources/android/splash/drawable-port-mdpi-screen.png" />
69        <splash density="hdpi" src="resources/android/splash/drawable-port-hdpi-screen.png" />
70        <splash density="port-hdpi" src="resources/android/splash/drawable-port-hdpi-screen.png" />
71        <splash density="xhdpi" src="resources/android/splash/drawable-port-xhdpi-screen.png" />
72        <splash density="port-xhdpi" src="resources/android/splash/drawable-port-xhdpi-screen.png" />
73        <splash density="xxhdpi" src="resources/android/splash/drawable-port-xxhdpi-screen.png" />
74        <splash density="port-xxhdpi" src="resources/android/splash/drawable-port-xxhdpi-screen.png" />
75        <splash density="xxxhdpi" src="resources/android/splash/drawable-port-xxxhdpi-screen.png" />
76        <splash density="port-xxxhdpi" src="resources/android/splash/drawable-port-xxxhdpi-screen.png" />
77    </platform>
78    <platform name="ios">
79        <allow-intent href="itms:*" />
80        <allow-intent href="itms-apps:*" />
81        <icon height="57" src="resources/ios/icon/icon.png" width="57" />
82        <icon height="114" src="resources/ios/icon/icon@2x.png" width="114" />
83        <icon height="29" src="resources/ios/icon/icon-small.png" width="29" />
84        <icon height="58" src="resources/ios/icon/icon-small@2x.png" width="58" />
85        <icon height="87" src="resources/ios/icon/icon-small@3x.png" width="87" />
86        <icon height="20" src="resources/ios/icon/icon-20.png" width="20" />
87        <icon height="40" src="resources/ios/icon/icon-20@2x.png" width="40" />
88        <icon height="60" src="resources/ios/icon/icon-20@3x.png" width="60" />
89        <icon height="48" src="resources/ios/icon/icon-24@2x.png" width="48" />
90        <icon height="55" src="resources/ios/icon/icon-27.5@2x.png" width="55" />
91        <icon height="29" src="resources/ios/icon/icon-29.png" width="29" />
92        <icon height="58" src="resources/ios/icon/icon-29@2x.png" width="58" />
93        <icon height="87" src="resources/ios/icon/icon-29@3x.png" width="87" />
94        <icon height="40" src="resources/ios/icon/icon-40.png" width="40" />
95        <icon height="80" src="resources/ios/icon/icon-40@2x.png" width="80" />
96        <icon height="120" src="resources/ios/icon/icon-40@3x.png" width="120" />
97        <icon height="88" src="resources/ios/icon/icon-44@2x.png" width="88" />
98        <icon height="50" src="resources/ios/icon/icon-50.png" width="50" />
99        <icon height="100" src="resources/ios/icon/icon-50@2x.png" width="100" />
100        <icon height="60" src="resources/ios/icon/icon-60.png" width="60" />
101        <icon height="120" src="resources/ios/icon/icon-60@2x.png" width="120" />
102        <icon height="180" src="resources/ios/icon/icon-60@3x.png" width="180" />
103        <icon height="72" src="resources/ios/icon/icon-72.png" width="72" />
104        <icon height="144" src="resources/ios/icon/icon-72@2x.png" width="144" />
105        <icon height="76" src="resources/ios/icon/icon-76.png" width="76" />
106        <icon height="152" src="resources/ios/icon/icon-76@2x.png" width="152" />
107        <icon height="167" src="resources/ios/icon/icon-83.5@2x.png" width="167" />
108        <icon height="172" src="resources/ios/icon/icon-86@2x.png" width="172" />
109        <icon height="196" src="resources/ios/icon/icon-98@2x.png" width="196" />
110        <icon height="1024" src="resources/ios/icon/icon-1024.png" width="1024" />
111        <splash height="480" src="resources/ios/splash/Default~iphone.png" width="320" />
112        <splash height="960" src="resources/ios/splash/Default@2x~iphone.png" width="640" />
113        <splash height="1024" src="resources/ios/splash/Default-Portrait~ipad.png" width="768" />
114        <splash height="768" src="resources/ios/splash/Default-Landscape~ipad.png" width="1024" />
115        <splash height="1125" src="resources/ios/splash/Default-Landscape-2436h.png" width="2436" />
116        <splash height="1242" src="resources/ios/splash/Default-Landscape-736h.png" width="2208" />
117        <splash height="2048" src="resources/ios/splash/Default-Portrait@2x~ipad.png" width="1536" />
118        <splash height="1536" src="resources/ios/splash/Default-Landscape@2x~ipad.png" width="2048" />
119        <splash height="2732" src="resources/ios/splash/Default-Portrait@~ipadpro.png" width="2048" />
120        <splash height="2048" src="resources/ios/splash/Default-Landscape@~ipadpro.png" width="2732" />
121        <splash height="1136" src="resources/ios/splash/Default-568h@2x~iphone.png" width="640" />
122        <splash height="1334" src="resources/ios/splash/Default-667h.png" width="750" />
123        <splash height="2208" src="resources/ios/splash/Default-736h.png" width="1242" />
124        <splash height="2436" src="resources/ios/splash/Default-2436h.png" width="1125" />
125        <splash height="2732" src="resources/ios/splash/Default@2x~universal~anyany.png" width="2732" />
126        <icon height="216" src="resources/ios/icon/icon-108@2x.png" width="216" />
127        <splash height="2688" src="resources/ios/splash/Default-2688h~iphone.png" width="1242" />
128        <splash height="1242" src="resources/ios/splash/Default-Landscape-2688h~iphone.png" width="2688" />
129        <splash height="1792" src="resources/ios/splash/Default-1792h~iphone.png" width="828" />
130        <splash height="828" src="resources/ios/splash/Default-Landscape-1792h~iphone.png" width="1792" />
131    </platform>
132    <plugin name="cordova-plugin-googleplus" spec="^8.4.0">
133        <variable name="WEB_APPLICATION_CLIENT_ID" value="0000000000000-wwwwwwwmkv51oxxxxxxxxxxx.apps.googleusercontent.co" />
134    </plugin>
135    <platform name="android">
136        <preference name="GoogleAndroidClientId" value="888809hhju-i9hd0hc6v51obgdubbgxwbnhiywgdiueh.apps.googleusercontent.com" />
137    </platform>
138    <plugin name="cordova-plugin-whitelist" spec="1.3.5" />
139    <plugin name="cordova-plugin-statusbar" spec="2.4.3" />
140    <plugin name="cordova-plugin-device" spec="2.0.3" />
141    <plugin name="cordova-plugin-splashscreen" spec="6.0.0" />
142    <plugin name="cordova-plugin-ionic-webview" spec="5.0.0" />
143    <plugin name="cordova-plugin-ionic-keyboard" spec="^2.2.0" />
144</widget>

Apps targeting Android 12 and higher are required to specify an explicit value for android:exported when the corresponding component has an intent filter defined. See https://developer.android.com/guide/topics/manifest/activity-element#exported for details.

ANSWER

Answered 2021-Nov-18 at 19:22

You can try like this in config.xml under android platform -

1<?xml version='1.0' encoding='utf-8'?>
2<widget id="com.likehub.sweetheart" version="1.1.64" xmlns="http://www.w3.org/ns/widgets" xmlns:cdv="http://cordova.apache.org/ns/1.0">
3    <name>sweetheart</name>
4    <description>making love bird together</description>
5    <author email="mynamey9er@gmail.com" href="">likehub</author>
6    <content src="index.html" />
7    <access origin="*" />
8    <allow-intent href="http://*/*" />
9    <allow-intent href="https://*/*" />
10    <allow-intent href="tel:*" />
11    <allow-intent href="sms:*" />
12    <allow-intent href="mailto:*" />
13    <allow-intent href="geo:*" />
14    <preference name="AndroidXEnabled" value="true" />
15    <preference name="WebViewBounce" value="false" />
16    <preference name="UIWebViewBounce" value="false" />
17    <preference name="DisallowOverscroll" value="true" />
18    <preference name="LoadUrlTimeoutValue" value="700000" />
19    <preference name="ScrollEnabled" value="false" />
20    <preference name="SplashMaintainAspectRatio" value="true" />
21    <preference name="FadeSplashScreenDuration" value="1000" />
22    <preference name="FadeSplashScreen" value="true" />
23    <preference name="SplashShowOnlyFirstTime" value="false" />
24    <preference name="SplashScreen" value="screen" />
25    <preference name="SplashScreenDelay" value="5000" />
26    <preference name="AutoHideSplashScreen" value="true" />
27    <preference name="ShowSplashScreen" value="false" />
28    <preference name="ShowSplashScreenSpinner" value="false" />
29    <preference name="android-minSdkVersion" value="22" />
30    <preference name="BackupWebStorage" value="none" />
31    <preference name="Orientation" value="portrait" />
32    <preference name="AndroidPersistentFileLocation" value="Compatibility" />
33    <preference name="GradlePluginKotlinEnabled" value="true" />
34    <preference name="GradlePluginKotlinCodeStyle" value="official" />
35    <preference name="GradlePluginKotlinVersion" value="1.3.50" />
36    <preference name="AndroidLaunchMode" value="singleTask" />
37    <feature name="StatusBar">
38        <param name="ios-package" onload="true" value="CDVStatusBar" />
39    </feature>
40    <platform  name="android">
41        <preference name="android-targetSdkVersion" value="31" />
42        <edit-config  file="app/src/main/AndroidManifest.xml" mode="merge" android:exported="true" target="/manifest/application" xmlns:android="http://schemas.android.com/apk/res/android">
43            <application android:usesCleartextTraffic="true" />
44            <application android:networkSecurityConfig="@xml/network_security_config" />
45            
46            <intent-filter>
47                <action  android:name="MainActivity" android:exported="false"/>
48                <category android:name="android.intent.category.DEFAULT" />
49            </intent-filter>
50        </edit-config>
51        <resource-file src="resources/android/xml/network_security_config.xml" target="app/src/main/res/xml/network_security_config.xml" />
52        <allow-intent href="market:*" />
53        <icon density="ldpi" src="resources/android/icon/drawable-ldpi-icon.png" />
54        <icon density="mdpi" src="resources/android/icon/drawable-mdpi-icon.png" />
55        <icon density="hdpi" src="resources/android/icon/drawable-hdpi-icon.png" />
56        <icon density="xhdpi" src="resources/android/icon/drawable-xhdpi-icon.png" />
57        <icon density="xxhdpi" src="resources/android/icon/drawable-xxhdpi-icon.png" />
58        <icon density="xxxhdpi" src="resources/android/icon/drawable-xxxhdpi-icon.png" />
59        <splash density="land-ldpi" src="resources/android/splash/drawable-land-ldpi-screen.png" />
60        <splash density="land-mdpi" src="resources/android/splash/drawable-land-mdpi-screen.png" />
61        <splash density="land-hdpi" src="resources/android/splash/drawable-land-hdpi-screen.png" />
62        <splash density="land-xhdpi" src="resources/android/splash/drawable-land-xhdpi-screen.png" />
63        <splash density="land-xxhdpi" src="resources/android/splash/drawable-land-xxhdpi-screen.png" />
64        <splash density="land-xxxhdpi" src="resources/android/splash/drawable-land-xxxhdpi-screen.png" />
65        <splash density="ldpi" src="resources/android/splash/drawable-port-ldpi-screen.png" />
66        <splash density="port-ldpi" src="resources/android/splash/drawable-port-ldpi-screen.png" />
67        <splash density="mdpi" src="resources/android/splash/drawable-port-mdpi-screen.png" />
68        <splash density="port-mdpi" src="resources/android/splash/drawable-port-mdpi-screen.png" />
69        <splash density="hdpi" src="resources/android/splash/drawable-port-hdpi-screen.png" />
70        <splash density="port-hdpi" src="resources/android/splash/drawable-port-hdpi-screen.png" />
71        <splash density="xhdpi" src="resources/android/splash/drawable-port-xhdpi-screen.png" />
72        <splash density="port-xhdpi" src="resources/android/splash/drawable-port-xhdpi-screen.png" />
73        <splash density="xxhdpi" src="resources/android/splash/drawable-port-xxhdpi-screen.png" />
74        <splash density="port-xxhdpi" src="resources/android/splash/drawable-port-xxhdpi-screen.png" />
75        <splash density="xxxhdpi" src="resources/android/splash/drawable-port-xxxhdpi-screen.png" />
76        <splash density="port-xxxhdpi" src="resources/android/splash/drawable-port-xxxhdpi-screen.png" />
77    </platform>
78    <platform name="ios">
79        <allow-intent href="itms:*" />
80        <allow-intent href="itms-apps:*" />
81        <icon height="57" src="resources/ios/icon/icon.png" width="57" />
82        <icon height="114" src="resources/ios/icon/icon@2x.png" width="114" />
83        <icon height="29" src="resources/ios/icon/icon-small.png" width="29" />
84        <icon height="58" src="resources/ios/icon/icon-small@2x.png" width="58" />
85        <icon height="87" src="resources/ios/icon/icon-small@3x.png" width="87" />
86        <icon height="20" src="resources/ios/icon/icon-20.png" width="20" />
87        <icon height="40" src="resources/ios/icon/icon-20@2x.png" width="40" />
88        <icon height="60" src="resources/ios/icon/icon-20@3x.png" width="60" />
89        <icon height="48" src="resources/ios/icon/icon-24@2x.png" width="48" />
90        <icon height="55" src="resources/ios/icon/icon-27.5@2x.png" width="55" />
91        <icon height="29" src="resources/ios/icon/icon-29.png" width="29" />
92        <icon height="58" src="resources/ios/icon/icon-29@2x.png" width="58" />
93        <icon height="87" src="resources/ios/icon/icon-29@3x.png" width="87" />
94        <icon height="40" src="resources/ios/icon/icon-40.png" width="40" />
95        <icon height="80" src="resources/ios/icon/icon-40@2x.png" width="80" />
96        <icon height="120" src="resources/ios/icon/icon-40@3x.png" width="120" />
97        <icon height="88" src="resources/ios/icon/icon-44@2x.png" width="88" />
98        <icon height="50" src="resources/ios/icon/icon-50.png" width="50" />
99        <icon height="100" src="resources/ios/icon/icon-50@2x.png" width="100" />
100        <icon height="60" src="resources/ios/icon/icon-60.png" width="60" />
101        <icon height="120" src="resources/ios/icon/icon-60@2x.png" width="120" />
102        <icon height="180" src="resources/ios/icon/icon-60@3x.png" width="180" />
103        <icon height="72" src="resources/ios/icon/icon-72.png" width="72" />
104        <icon height="144" src="resources/ios/icon/icon-72@2x.png" width="144" />
105        <icon height="76" src="resources/ios/icon/icon-76.png" width="76" />
106        <icon height="152" src="resources/ios/icon/icon-76@2x.png" width="152" />
107        <icon height="167" src="resources/ios/icon/icon-83.5@2x.png" width="167" />
108        <icon height="172" src="resources/ios/icon/icon-86@2x.png" width="172" />
109        <icon height="196" src="resources/ios/icon/icon-98@2x.png" width="196" />
110        <icon height="1024" src="resources/ios/icon/icon-1024.png" width="1024" />
111        <splash height="480" src="resources/ios/splash/Default~iphone.png" width="320" />
112        <splash height="960" src="resources/ios/splash/Default@2x~iphone.png" width="640" />
113        <splash height="1024" src="resources/ios/splash/Default-Portrait~ipad.png" width="768" />
114        <splash height="768" src="resources/ios/splash/Default-Landscape~ipad.png" width="1024" />
115        <splash height="1125" src="resources/ios/splash/Default-Landscape-2436h.png" width="2436" />
116        <splash height="1242" src="resources/ios/splash/Default-Landscape-736h.png" width="2208" />
117        <splash height="2048" src="resources/ios/splash/Default-Portrait@2x~ipad.png" width="1536" />
118        <splash height="1536" src="resources/ios/splash/Default-Landscape@2x~ipad.png" width="2048" />
119        <splash height="2732" src="resources/ios/splash/Default-Portrait@~ipadpro.png" width="2048" />
120        <splash height="2048" src="resources/ios/splash/Default-Landscape@~ipadpro.png" width="2732" />
121        <splash height="1136" src="resources/ios/splash/Default-568h@2x~iphone.png" width="640" />
122        <splash height="1334" src="resources/ios/splash/Default-667h.png" width="750" />
123        <splash height="2208" src="resources/ios/splash/Default-736h.png" width="1242" />
124        <splash height="2436" src="resources/ios/splash/Default-2436h.png" width="1125" />
125        <splash height="2732" src="resources/ios/splash/Default@2x~universal~anyany.png" width="2732" />
126        <icon height="216" src="resources/ios/icon/icon-108@2x.png" width="216" />
127        <splash height="2688" src="resources/ios/splash/Default-2688h~iphone.png" width="1242" />
128        <splash height="1242" src="resources/ios/splash/Default-Landscape-2688h~iphone.png" width="2688" />
129        <splash height="1792" src="resources/ios/splash/Default-1792h~iphone.png" width="828" />
130        <splash height="828" src="resources/ios/splash/Default-Landscape-1792h~iphone.png" width="1792" />
131    </platform>
132    <plugin name="cordova-plugin-googleplus" spec="^8.4.0">
133        <variable name="WEB_APPLICATION_CLIENT_ID" value="0000000000000-wwwwwwwmkv51oxxxxxxxxxxx.apps.googleusercontent.co" />
134    </plugin>
135    <platform name="android">
136        <preference name="GoogleAndroidClientId" value="888809hhju-i9hd0hc6v51obgdubbgxwbnhiywgdiueh.apps.googleusercontent.com" />
137    </platform>
138    <plugin name="cordova-plugin-whitelist" spec="1.3.5" />
139    <plugin name="cordova-plugin-statusbar" spec="2.4.3" />
140    <plugin name="cordova-plugin-device" spec="2.0.3" />
141    <plugin name="cordova-plugin-splashscreen" spec="6.0.0" />
142    <plugin name="cordova-plugin-ionic-webview" spec="5.0.0" />
143    <plugin name="cordova-plugin-ionic-keyboard" spec="^2.2.0" />
144</widget><edit-config
145  file="app/src/main/AndroidManifest.xml"
146  target="/manifest/application/activity[@android:name='MainActivity']"
147  mode="merge">
148    <activity android:exported="true"/>
149</edit-config>
150

Make sure to target the file and the activity's name properly.

Due to merge mode, android:exported="true" will be added to target activity element. This will replace the values if the it is already exist in the target element.

Source https://stackoverflow.com/questions/68678008

QUESTION

Rearranging polygons in geopandas for matplotlib plotting

Asked 2022-Mar-08 at 20:20

I am working on a project where I am using a shape file to make a choropleth map of the United States. To do this, I downloaded the standard shape file here from the US Census Bureau. After a little bit of cleaning up (there were some extraneous island territories which I removed by changing the plot's axis limits), I was able to get the contiguous states to fit neatly within the bounds of the matplotlib figure. For reference, please see Edit 4 below.

Edit 1: I am using the cb_2018_us_state_500k.zip [3.2 MB] shape file.

The only problem now is that by setting axis limits I now am no longer able to view Alaska and Hawaii (as these are obviously cut out by restricting the axis limits). I would now like to add both of these polygons back in my map but now towards the lower part of the plot figure (the treatment that is given by most other maps of this type) despite its geographical inaccuracy.

To put this more concretely, I am interested in selecting the polygon shapes representing Alaska and Hawaii and moving them to the lower left hand side of my figure. Is this something that would be possible?

I can create a Boolean mask using:

1mask = df['STUSPS'] == 'AK'
2

to get this polygon for this state by itself; however, I am a little bit stuck now on how to move it/reposition it once selected.

Edit 2: Since each state is represented by a geometry dtype, could I just apply a transformation to each point in the polygon? For Alaska the geometry column shows:

1mask = df['STUSPS'] == 'AK'
227    MULTIPOLYGON (((179.48246 51.98283, 179.48656 ...
3Name: geometry, dtype: geometry
4

Would say multiplying each number in this list by the same constant accomplish this?

I would like to place Alaska down in the lower left somewhere around the (-125, 27) region and Hawaii next to it at around (-112, 27).

Edit 3:

My code:

1mask = df['STUSPS'] == 'AK'
227    MULTIPOLYGON (((179.48246 51.98283, 179.48656 ...
3Name: geometry, dtype: geometry
4import geopandas as gpd
5import matplotlib.pyplot as plt
6
7# import the United States shape file 
8df = gpd.read_file('Desktop/cb_2018_us_state_500k/cb_2018_us_state_500k.shp')
9
10# exclude the values that we would not like to display
11exclude = df[~df['STUSPS'].isin(['PR', 'AS', 'VI', 'MP', 'GU','AK'])]
12
13# create a plot figure
14fig, ax = plt.subplots(1, figsize=(20, 10))
15
16exclude.plot(column="NAME", ax=ax)
17_ = ax.set_xlim([-130, -64])
18_ = ax.set_ylim([22, 53])
19

Example figure that I have right now:

enter image description here

Any insight or links to resources, explanations, or examples would be greatly appreciated.

Note: Technically, I could obviate this by simply using a shape file that already has Alaska and Hawaii in this location, such as the one provided by the Department of Interior; however, this would not work if I wanted to say add Guam or Puerto Rico.

Desired Outcome:

Edit 4: What I am looking to do is something similar to this question, but in Python and not R.

enter image description here

Image source: Murphy

ANSWER

Answered 2021-Sep-22 at 17:25

You could do something like this. You will have to find the right offsets to position Alaska where you want it to be exactly.

Now, you have the following dataframe:

1mask = df['STUSPS'] == 'AK'
227    MULTIPOLYGON (((179.48246 51.98283, 179.48656 ...
3Name: geometry, dtype: geometry
4import geopandas as gpd
5import matplotlib.pyplot as plt
6
7# import the United States shape file 
8df = gpd.read_file('Desktop/cb_2018_us_state_500k/cb_2018_us_state_500k.shp')
9
10# exclude the values that we would not like to display
11exclude = df[~df['STUSPS'].isin(['PR', 'AS', 'VI', 'MP', 'GU','AK'])]
12
13# create a plot figure
14fig, ax = plt.subplots(1, figsize=(20, 10))
15
16exclude.plot(column="NAME", ax=ax)
17_ = ax.set_xlim([-130, -64])
18_ = ax.set_ylim([22, 53])
19 STATEFP   STATENS     AFFGEOID GEOID STUSPS            NAME LSAD  \
200      28  01779790  0400000US28    28     MS     Mississippi   00   
211      37  01027616  0400000US37    37     NC  North Carolina   00   
222      40  01102857  0400000US40    40     OK        Oklahoma   00   
23
24          ALAND       AWATER  \
250  121533519481   3926919758   
261  125923656064  13466071395   
272  177662925723   3374587997   
28
29                                            geometry  
300  MULTIPOLYGON (((-88.50297 30.21523, -88.49176 ...  
311  MULTIPOLYGON (((-75.72681 35.93584, -75.71827 ...  
322  POLYGON ((-103.00257 36.52659, -103.00219 36.6...  
33

You can extract Alaska the way you did, or something similar:

1mask = df['STUSPS'] == 'AK'
227    MULTIPOLYGON (((179.48246 51.98283, 179.48656 ...
3Name: geometry, dtype: geometry
4import geopandas as gpd
5import matplotlib.pyplot as plt
6
7# import the United States shape file 
8df = gpd.read_file('Desktop/cb_2018_us_state_500k/cb_2018_us_state_500k.shp')
9
10# exclude the values that we would not like to display
11exclude = df[~df['STUSPS'].isin(['PR', 'AS', 'VI', 'MP', 'GU','AK'])]
12
13# create a plot figure
14fig, ax = plt.subplots(1, figsize=(20, 10))
15
16exclude.plot(column="NAME", ax=ax)
17_ = ax.set_xlim([-130, -64])
18_ = ax.set_ylim([22, 53])
19 STATEFP   STATENS     AFFGEOID GEOID STUSPS            NAME LSAD  \
200      28  01779790  0400000US28    28     MS     Mississippi   00   
211      37  01027616  0400000US37    37     NC  North Carolina   00   
222      40  01102857  0400000US40    40     OK        Oklahoma   00   
23
24          ALAND       AWATER  \
250  121533519481   3926919758   
261  125923656064  13466071395   
272  177662925723   3374587997   
28
29                                            geometry  
300  MULTIPOLYGON (((-88.50297 30.21523, -88.49176 ...  
311  MULTIPOLYGON (((-75.72681 35.93584, -75.71827 ...  
322  POLYGON ((-103.00257 36.52659, -103.00219 36.6...  
33USA_ALS = USA[USA.STUSPS=='AK']
34

From there you do the following:

1mask = df['STUSPS'] == 'AK'
227    MULTIPOLYGON (((179.48246 51.98283, 179.48656 ...
3Name: geometry, dtype: geometry
4import geopandas as gpd
5import matplotlib.pyplot as plt
6
7# import the United States shape file 
8df = gpd.read_file('Desktop/cb_2018_us_state_500k/cb_2018_us_state_500k.shp')
9
10# exclude the values that we would not like to display
11exclude = df[~df['STUSPS'].isin(['PR', 'AS', 'VI', 'MP', 'GU','AK'])]
12
13# create a plot figure
14fig, ax = plt.subplots(1, figsize=(20, 10))
15
16exclude.plot(column="NAME", ax=ax)
17_ = ax.set_xlim([-130, -64])
18_ = ax.set_ylim([22, 53])
19 STATEFP   STATENS     AFFGEOID GEOID STUSPS            NAME LSAD  \
200      28  01779790  0400000US28    28     MS     Mississippi   00   
211      37  01027616  0400000US37    37     NC  North Carolina   00   
222      40  01102857  0400000US40    40     OK        Oklahoma   00   
23
24          ALAND       AWATER  \
250  121533519481   3926919758   
261  125923656064  13466071395   
272  177662925723   3374587997   
28
29                                            geometry  
300  MULTIPOLYGON (((-88.50297 30.21523, -88.49176 ...  
311  MULTIPOLYGON (((-75.72681 35.93584, -75.71827 ...  
322  POLYGON ((-103.00257 36.52659, -103.00219 36.6...  
33USA_ALS = USA[USA.STUSPS=='AK']
34USA_ALS['geometry'] = USA_ALS.geometry.apply(lambda x: shapely.affinity.translate(x, xoff=0, yoff=-100))
35

which translates the geometry along the x and y axis.

Remove the old Alska from the original df and concatenate with the new one:

1mask = df['STUSPS'] == 'AK'
227    MULTIPOLYGON (((179.48246 51.98283, 179.48656 ...
3Name: geometry, dtype: geometry
4import geopandas as gpd
5import matplotlib.pyplot as plt
6
7# import the United States shape file 
8df = gpd.read_file('Desktop/cb_2018_us_state_500k/cb_2018_us_state_500k.shp')
9
10# exclude the values that we would not like to display
11exclude = df[~df['STUSPS'].isin(['PR', 'AS', 'VI', 'MP', 'GU','AK'])]
12
13# create a plot figure
14fig, ax = plt.subplots(1, figsize=(20, 10))
15
16exclude.plot(column="NAME", ax=ax)
17_ = ax.set_xlim([-130, -64])
18_ = ax.set_ylim([22, 53])
19 STATEFP   STATENS     AFFGEOID GEOID STUSPS            NAME LSAD  \
200      28  01779790  0400000US28    28     MS     Mississippi   00   
211      37  01027616  0400000US37    37     NC  North Carolina   00   
222      40  01102857  0400000US40    40     OK        Oklahoma   00   
23
24          ALAND       AWATER  \
250  121533519481   3926919758   
261  125923656064  13466071395   
272  177662925723   3374587997   
28
29                                            geometry  
300  MULTIPOLYGON (((-88.50297 30.21523, -88.49176 ...  
311  MULTIPOLYGON (((-75.72681 35.93584, -75.71827 ...  
322  POLYGON ((-103.00257 36.52659, -103.00219 36.6...  
33USA_ALS = USA[USA.STUSPS=='AK']
34USA_ALS['geometry'] = USA_ALS.geometry.apply(lambda x: shapely.affinity.translate(x, xoff=0, yoff=-100))
35USA = USA[USA.STUSPS!='AK']
36New_USA = pd.concat([USA,USA_ALS])
37New_USA.geometry.plot()
38

This gives:

enter image description here

``

Source https://stackoverflow.com/questions/69278742

QUESTION

Google Geo Chart: Get fill color of a specific series

Asked 2022-Feb-22 at 13:19

I've created a geo chart that shows the map of the US:

1var data = google.visualization.arrayToDataTable(response.data.states);
2                var formatter = new google.visualization.NumberFormat({
3                    pattern: '$###,###.##'
4                });
5                formatter.format(data, 1);
6
7                var options = {
8                    region: 'US',
9                    displayMode: 'regions',
10                    resolution: 'provinces',
11                    colorAxis: {
12                        colors: ['#e6f4ff', '#008ffb', '#ff4560']
13                    },
14                    geochartVersion: 11,
15                    legend: {
16                        numberFormat: '$###,###.##'
17                    },
18                };
19
20                var chart = new google.visualization.GeoChart(document.getElementById(='kt_charts_states'));
21                chart.draw(data, options);
22

Now this properly creates the chart and each states fill is based on a gradient scale from the colorAxis option. My questions is: How do you go about getting the specific fill color of a state / series? For example:

enter image description here

EDIT:

Here's some sample data that I'm using:

1var data = google.visualization.arrayToDataTable(response.data.states);
2                var formatter = new google.visualization.NumberFormat({
3                    pattern: '$###,###.##'
4                });
5                formatter.format(data, 1);
6
7                var options = {
8                    region: 'US',
9                    displayMode: 'regions',
10                    resolution: 'provinces',
11                    colorAxis: {
12                        colors: ['#e6f4ff', '#008ffb', '#ff4560']
13                    },
14                    geochartVersion: 11,
15                    legend: {
16                        numberFormat: '$###,###.##'
17                    },
18                };
19
20                var chart = new google.visualization.GeoChart(document.getElementById(='kt_charts_states'));
21                chart.draw(data, options);
22[
23['State', 'Sales', 'Order Count'],
24['Alabama', 5939.95, 6],
25['Arizona', 5256.83, 9],
26['Arkansas', 7917.89, 14],
27['California', 24587.1, 37],
28['Colorado', 7494.87, 8],
29]
30

ANSWER

Answered 2022-Feb-22 at 07:44

We can interpolate colors ourselves using formula:

1var data = google.visualization.arrayToDataTable(response.data.states);
2                var formatter = new google.visualization.NumberFormat({
3                    pattern: '$###,###.##'
4                });
5                formatter.format(data, 1);
6
7                var options = {
8                    region: 'US',
9                    displayMode: 'regions',
10                    resolution: 'provinces',
11                    colorAxis: {
12                        colors: ['#e6f4ff', '#008ffb', '#ff4560']
13                    },
14                    geochartVersion: 11,
15                    legend: {
16                        numberFormat: '$###,###.##'
17                    },
18                };
19
20                var chart = new google.visualization.GeoChart(document.getElementById(='kt_charts_states'));
21                chart.draw(data, options);
22[
23['State', 'Sales', 'Order Count'],
24['Alabama', 5939.95, 6],
25['Arizona', 5256.83, 9],
26['Arkansas', 7917.89, 14],
27['California', 24587.1, 37],
28['Colorado', 7494.87, 8],
29]
30r = (1 - point - start)/end * r1  +  (point-start)/end * r2
31g = (1 - point - start)/end * g1  +  (point-start)/end * g2
32b = (1 - point - start)/end * b1  +  (point-start)/end * b2
33
34where,
35rgb    - the color we want to find on the gradient
36r1g1b1 - starting color
37r2g2b2 - end color
38point  - sales value of the state
39start  - minimum sales: $80
40end    - maximum sales: $25,460.26
41

Using above formula, following demo considers multiple colors on the colorAxis/gradient. And shows state names with their corresponding names on top left.

1var data = google.visualization.arrayToDataTable(response.data.states);
2                var formatter = new google.visualization.NumberFormat({
3                    pattern: '$###,###.##'
4                });
5                formatter.format(data, 1);
6
7                var options = {
8                    region: 'US',
9                    displayMode: 'regions',
10                    resolution: 'provinces',
11                    colorAxis: {
12                        colors: ['#e6f4ff', '#008ffb', '#ff4560']
13                    },
14                    geochartVersion: 11,
15                    legend: {
16                        numberFormat: '$###,###.##'
17                    },
18                };
19
20                var chart = new google.visualization.GeoChart(document.getElementById(='kt_charts_states'));
21                chart.draw(data, options);
22[
23['State', 'Sales', 'Order Count'],
24['Alabama', 5939.95, 6],
25['Arizona', 5256.83, 9],
26['Arkansas', 7917.89, 14],
27['California', 24587.1, 37],
28['Colorado', 7494.87, 8],
29]
30r = (1 - point - start)/end * r1  +  (point-start)/end * r2
31g = (1 - point - start)/end * g1  +  (point-start)/end * g2
32b = (1 - point - start)/end * b1  +  (point-start)/end * b2
33
34where,
35rgb    - the color we want to find on the gradient
36r1g1b1 - starting color
37r2g2b2 - end color
38point  - sales value of the state
39start  - minimum sales: $80
40end    - maximum sales: $25,460.26
41let info = [
42  ['State', 'Sales', 'Order Count'],
43  ['Alabama', 1939.95, 6],
44  ['Arizona', 5256.83, 9],
45  ['Arkansas', 7917.89, 14],
46  ['California', 20587.1, 32],
47  ['Colorado', 7494.87, 8],
48  ['Idaho', 80, 1],
49  ['Missouri', 25460.26, 40],
50  ['Texas', 13000, 20],
51];
52
53let gradient = ['#e6f4ff', '#008ffb', '#ff4560'];
54let range = {
55  start: 80,
56  end: 25460.26
57};
58
59google.charts.load('current', {
60  'packages': ['geochart'],
61  // Note: Because this chart requires geocoding, you'll need mapsApiKey.
62  // See: https://developers.google.com/chart/interactive/docs/basic_load_libs#load-settings
63  'mapsApiKey': 'AIzaSyD-9tSrke72PouQMnMX-a7eZSW0jkFMBWY'
64});
65google.charts.setOnLoadCallback(drawRegionsMap);
66
67function drawRegionsMap() {
68  var data = google.visualization.arrayToDataTable(info);
69  var formatter = new google.visualization.NumberFormat({
70    pattern: '$###,###.##'
71  });
72  formatter.format(data, 1);
73  var options = {
74    region: 'US',
75    displayMode: 'regions',
76    resolution: 'provinces',
77    colorAxis: {
78      colors: gradient
79    },
80    geochartVersion: 11,
81    legend: {
82      numberFormat: '$###,###.##'
83    },
84  };
85
86  var chart = new google.visualization.GeoChart(document.getElementById('kt_charts_states'));
87  chart.draw(data, options);
88};
89
90// display colors for each state
91let content = ''
92info.forEach((state, i) => {
93  if (i === 0) return;
94  content += `<div style='background-color: ${getStateColor(gradient, range, state[1])}'>${state[0]}</div>`;
95});
96stat.innerHTML = content;
97
98// interpolate colors
99function getStateColor(gradient, range, value) {
100  let colors = gradient.map(c => hexToRgb(c));
101  let sectionLength = (range.end - range.start) / (gradient.length - 1);
102  let section = (value / sectionLength) | 0;
103  if (section + 1 == gradient.length) section -= 1;
104
105  value = value - sectionLength * section - range.start;
106  let result = ['r', 'g', 'b'].map(c => {
107    // interpolate color from start color to end color
108    let out = (1 - (value / sectionLength)) * colors[section][c];
109    out += (value / sectionLength) * colors[section + 1][c];
110    return Math.ceil(out);
111  });
112  return rgbToHex(...result);
113}
114
115// utility functions
116function hexToRgb(hex) {
117  var shorthandRegex = /^#?([a-f\d])([a-f\d])([a-f\d])$/i;
118  hex = hex.replace(shorthandRegex, function(m, r, g, b) {
119    return r + r + g + g + b + b;
120  });
121
122  var result = /^#?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})$/i.exec(hex);
123  return result ? {
124    r: parseInt(result[1], 16),
125    g: parseInt(result[2], 16),
126    b: parseInt(result[3], 16)
127  } : null;
128}
129
130function rgbToHex(r, g, b) {
131  return "#" + ((1 << 24) + ((r | 0) << 16) + ((g | 0) << 8) + (b | 0)).toString(16).slice(1);
132}
1var data = google.visualization.arrayToDataTable(response.data.states);
2                var formatter = new google.visualization.NumberFormat({
3                    pattern: '$###,###.##'
4                });
5                formatter.format(data, 1);
6
7                var options = {
8                    region: 'US',
9                    displayMode: 'regions',
10                    resolution: 'provinces',
11                    colorAxis: {
12                        colors: ['#e6f4ff', '#008ffb', '#ff4560']
13                    },
14                    geochartVersion: 11,
15                    legend: {
16                        numberFormat: '$###,###.##'
17                    },
18                };
19
20                var chart = new google.visualization.GeoChart(document.getElementById(='kt_charts_states'));
21                chart.draw(data, options);
22[
23['State', 'Sales', 'Order Count'],
24['Alabama', 5939.95, 6],
25['Arizona', 5256.83, 9],
26['Arkansas', 7917.89, 14],
27['California', 24587.1, 37],
28['Colorado', 7494.87, 8],
29]
30r = (1 - point - start)/end * r1  +  (point-start)/end * r2
31g = (1 - point - start)/end * g1  +  (point-start)/end * g2
32b = (1 - point - start)/end * b1  +  (point-start)/end * b2
33
34where,
35rgb    - the color we want to find on the gradient
36r1g1b1 - starting color
37r2g2b2 - end color
38point  - sales value of the state
39start  - minimum sales: $80
40end    - maximum sales: $25,460.26
41let info = [
42  ['State', 'Sales', 'Order Count'],
43  ['Alabama', 1939.95, 6],
44  ['Arizona', 5256.83, 9],
45  ['Arkansas', 7917.89, 14],
46  ['California', 20587.1, 32],
47  ['Colorado', 7494.87, 8],
48  ['Idaho', 80, 1],
49  ['Missouri', 25460.26, 40],
50  ['Texas', 13000, 20],
51];
52
53let gradient = ['#e6f4ff', '#008ffb', '#ff4560'];
54let range = {
55  start: 80,
56  end: 25460.26
57};
58
59google.charts.load('current', {
60  'packages': ['geochart'],
61  // Note: Because this chart requires geocoding, you'll need mapsApiKey.
62  // See: https://developers.google.com/chart/interactive/docs/basic_load_libs#load-settings
63  'mapsApiKey': 'AIzaSyD-9tSrke72PouQMnMX-a7eZSW0jkFMBWY'
64});
65google.charts.setOnLoadCallback(drawRegionsMap);
66
67function drawRegionsMap() {
68  var data = google.visualization.arrayToDataTable(info);
69  var formatter = new google.visualization.NumberFormat({
70    pattern: '$###,###.##'
71  });
72  formatter.format(data, 1);
73  var options = {
74    region: 'US',
75    displayMode: 'regions',
76    resolution: 'provinces',
77    colorAxis: {
78      colors: gradient
79    },
80    geochartVersion: 11,
81    legend: {
82      numberFormat: '$###,###.##'
83    },
84  };
85
86  var chart = new google.visualization.GeoChart(document.getElementById('kt_charts_states'));
87  chart.draw(data, options);
88};
89
90// display colors for each state
91let content = ''
92info.forEach((state, i) => {
93  if (i === 0) return;
94  content += `<div style='background-color: ${getStateColor(gradient, range, state[1])}'>${state[0]}</div>`;
95});
96stat.innerHTML = content;
97
98// interpolate colors
99function getStateColor(gradient, range, value) {
100  let colors = gradient.map(c => hexToRgb(c));
101  let sectionLength = (range.end - range.start) / (gradient.length - 1);
102  let section = (value / sectionLength) | 0;
103  if (section + 1 == gradient.length) section -= 1;
104
105  value = value - sectionLength * section - range.start;
106  let result = ['r', 'g', 'b'].map(c => {
107    // interpolate color from start color to end color
108    let out = (1 - (value / sectionLength)) * colors[section][c];
109    out += (value / sectionLength) * colors[section + 1][c];
110    return Math.ceil(out);
111  });
112  return rgbToHex(...result);
113}
114
115// utility functions
116function hexToRgb(hex) {
117  var shorthandRegex = /^#?([a-f\d])([a-f\d])([a-f\d])$/i;
118  hex = hex.replace(shorthandRegex, function(m, r, g, b) {
119    return r + r + g + g + b + b;
120  });
121
122  var result = /^#?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})$/i.exec(hex);
123  return result ? {
124    r: parseInt(result[1], 16),
125    g: parseInt(result[2], 16),
126    b: parseInt(result[3], 16)
127  } : null;
128}
129
130function rgbToHex(r, g, b) {
131  return "#" + ((1 << 24) + ((r | 0) << 16) + ((g | 0) << 8) + (b | 0)).toString(16).slice(1);
132}#kt_charts_states{
133   width: 95vw;
134   height:92vh;
135}
136
137#stat {
138  position: fixed;
139  top: .5rem;
140  right: 1rem;
141}
142#stat div{
143  width: 100px
144}
1var data = google.visualization.arrayToDataTable(response.data.states);
2                var formatter = new google.visualization.NumberFormat({
3                    pattern: '$###,###.##'
4                });
5                formatter.format(data, 1);
6
7                var options = {
8                    region: 'US',
9                    displayMode: 'regions',
10                    resolution: 'provinces',
11                    colorAxis: {
12                        colors: ['#e6f4ff', '#008ffb', '#ff4560']
13                    },
14                    geochartVersion: 11,
15                    legend: {
16                        numberFormat: '$###,###.##'
17                    },
18                };
19
20                var chart = new google.visualization.GeoChart(document.getElementById(='kt_charts_states'));
21                chart.draw(data, options);
22[
23['State', 'Sales', 'Order Count'],
24['Alabama', 5939.95, 6],
25['Arizona', 5256.83, 9],
26['Arkansas', 7917.89, 14],
27['California', 24587.1, 37],
28['Colorado', 7494.87, 8],
29]
30r = (1 - point - start)/end * r1  +  (point-start)/end * r2
31g = (1 - point - start)/end * g1  +  (point-start)/end * g2
32b = (1 - point - start)/end * b1  +  (point-start)/end * b2
33
34where,
35rgb    - the color we want to find on the gradient
36r1g1b1 - starting color
37r2g2b2 - end color
38point  - sales value of the state
39start  - minimum sales: $80
40end    - maximum sales: $25,460.26
41let info = [
42  ['State', 'Sales', 'Order Count'],
43  ['Alabama', 1939.95, 6],
44  ['Arizona', 5256.83, 9],
45  ['Arkansas', 7917.89, 14],
46  ['California', 20587.1, 32],
47  ['Colorado', 7494.87, 8],
48  ['Idaho', 80, 1],
49  ['Missouri', 25460.26, 40],
50  ['Texas', 13000, 20],
51];
52
53let gradient = ['#e6f4ff', '#008ffb', '#ff4560'];
54let range = {
55  start: 80,
56  end: 25460.26
57};
58
59google.charts.load('current', {
60  'packages': ['geochart'],
61  // Note: Because this chart requires geocoding, you'll need mapsApiKey.
62  // See: https://developers.google.com/chart/interactive/docs/basic_load_libs#load-settings
63  'mapsApiKey': 'AIzaSyD-9tSrke72PouQMnMX-a7eZSW0jkFMBWY'
64});
65google.charts.setOnLoadCallback(drawRegionsMap);
66
67function drawRegionsMap() {
68  var data = google.visualization.arrayToDataTable(info);
69  var formatter = new google.visualization.NumberFormat({
70    pattern: '$###,###.##'
71  });
72  formatter.format(data, 1);
73  var options = {
74    region: 'US',
75    displayMode: 'regions',
76    resolution: 'provinces',
77    colorAxis: {
78      colors: gradient
79    },
80    geochartVersion: 11,
81    legend: {
82      numberFormat: '$###,###.##'
83    },
84  };
85
86  var chart = new google.visualization.GeoChart(document.getElementById('kt_charts_states'));
87  chart.draw(data, options);
88};
89
90// display colors for each state
91let content = ''
92info.forEach((state, i) => {
93  if (i === 0) return;
94  content += `<div style='background-color: ${getStateColor(gradient, range, state[1])}'>${state[0]}</div>`;
95});
96stat.innerHTML = content;
97
98// interpolate colors
99function getStateColor(gradient, range, value) {
100  let colors = gradient.map(c => hexToRgb(c));
101  let sectionLength = (range.end - range.start) / (gradient.length - 1);
102  let section = (value / sectionLength) | 0;
103  if (section + 1 == gradient.length) section -= 1;
104
105  value = value - sectionLength * section - range.start;
106  let result = ['r', 'g', 'b'].map(c => {
107    // interpolate color from start color to end color
108    let out = (1 - (value / sectionLength)) * colors[section][c];
109    out += (value / sectionLength) * colors[section + 1][c];
110    return Math.ceil(out);
111  });
112  return rgbToHex(...result);
113}
114
115// utility functions
116function hexToRgb(hex) {
117  var shorthandRegex = /^#?([a-f\d])([a-f\d])([a-f\d])$/i;
118  hex = hex.replace(shorthandRegex, function(m, r, g, b) {
119    return r + r + g + g + b + b;
120  });
121
122  var result = /^#?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})$/i.exec(hex);
123  return result ? {
124    r: parseInt(result[1], 16),
125    g: parseInt(result[2], 16),
126    b: parseInt(result[3], 16)
127  } : null;
128}
129
130function rgbToHex(r, g, b) {
131  return "#" + ((1 << 24) + ((r | 0) << 16) + ((g | 0) << 8) + (b | 0)).toString(16).slice(1);
132}#kt_charts_states{
133   width: 95vw;
134   height:92vh;
135}
136
137#stat {
138  position: fixed;
139  top: .5rem;
140  right: 1rem;
141}
142#stat div{
143  width: 100px
144}<script type="text/javascript" src="https://www.gstatic.com/charts/loader.js"></script>
145<div id="kt_charts_states"></div>
146<div id="stat"></div>

Source https://stackoverflow.com/questions/71179322

QUESTION

how to convert geojson to shapely polygon?

Asked 2022-Feb-16 at 09:56

i have a geoJSON

1geo = {'type': 'Polygon',
2 'coordinates': [[[23.08437310100004, 53.15448536100007],
3   [23.08459767900007, 53.15448536100007],
4   [23.08594514600003, 53.153587050000056],
5   (...)
6   [23.08437310100004, 53.15448536100007]]]}
7

and i want to use these coordinates as an input to shapely.geometry.Polygon. The problem is that Polygon only accepts tuple values, meaning i have to convert this geojson to a polygon. When i try to input this type of data into a Polygon there's an error ValueError: A LinearRing must have at least 3 coordinate tuples

I tried this:

1geo = {'type': 'Polygon',
2 'coordinates': [[[23.08437310100004, 53.15448536100007],
3   [23.08459767900007, 53.15448536100007],
4   [23.08594514600003, 53.153587050000056],
5   (...)
6   [23.08437310100004, 53.15448536100007]]]}
7[tuple(l) for l in geo['coordinates']]
8

but this dosen't quite work since it only returns this

1geo = {'type': 'Polygon',
2 'coordinates': [[[23.08437310100004, 53.15448536100007],
3   [23.08459767900007, 53.15448536100007],
4   [23.08594514600003, 53.153587050000056],
5   (...)
6   [23.08437310100004, 53.15448536100007]]]}
7[tuple(l) for l in geo['coordinates']]
8[([23.08437310100004, 53.15448536100007],
9  [23.08459767900007, 53.15448536100007],
10  (...)
11  [23.08437310100004, 53.15448536100007])]
12

and what i need is this (i think it's a tuple)

1geo = {'type': 'Polygon',
2 'coordinates': [[[23.08437310100004, 53.15448536100007],
3   [23.08459767900007, 53.15448536100007],
4   [23.08594514600003, 53.153587050000056],
5   (...)
6   [23.08437310100004, 53.15448536100007]]]}
7[tuple(l) for l in geo['coordinates']]
8[([23.08437310100004, 53.15448536100007],
9  [23.08459767900007, 53.15448536100007],
10  (...)
11  [23.08437310100004, 53.15448536100007])]
12([(23.08437310100004, 53.15448536100007),
13  (23.08459767900007, 53.15448536100007),
14  (...)
15  (23.08437310100004, 53.15448536100007)])
16

is there a function for this?

ANSWER

Answered 2021-Aug-17 at 15:40

Try this,

1geo = {'type': 'Polygon',
2 'coordinates': [[[23.08437310100004, 53.15448536100007],
3   [23.08459767900007, 53.15448536100007],
4   [23.08594514600003, 53.153587050000056],
5   (...)
6   [23.08437310100004, 53.15448536100007]]]}
7[tuple(l) for l in geo['coordinates']]
8[([23.08437310100004, 53.15448536100007],
9  [23.08459767900007, 53.15448536100007],
10  (...)
11  [23.08437310100004, 53.15448536100007])]
12([(23.08437310100004, 53.15448536100007),
13  (23.08459767900007, 53.15448536100007),
14  (...)
15  (23.08437310100004, 53.15448536100007)])
16from itertools import chain
17
18
19geom = {...}
20polygon = Polygon(list(chain(*geom['coordinates']))
21

Source https://stackoverflow.com/questions/68820085

QUESTION

uploaded an APK which has an activity,activity alias,service or broadcast receiver with intentfilter, but without 'android : exported' property set

Asked 2022-Feb-03 at 10:56

I'm having an issue when i'm uploading app bundle to the play console that You uploaded an APK or Android App Bundle which has an activity, activity alias, service or broadcast receiver with intent filter, but without 'android:exported' property set. This file can't be installed on Android 12 or higher. but my manifest file includes the property.

Manifest file

1    <?xml version="1.0" encoding="utf-8"?>
2    <manifest xmlns:android="http://schemas.android.com/apk/res/android"
3        package="**********">
4        <!-- io.flutter.app.FlutterApplication is an android.app.Application that
5             calls FlutterMain.startInitialization(this); in its onCreate method.
6             In most cases you can leave this as-is, but you if you want to provide
7             additional functionality it is fine to subclass or reimplement
8             FlutterApplication and put your custom class here. -->
9        <uses-permission android:name="android.permission.INTERNET" />
10        <uses-permission android:name="android.permission.CAMERA" />
11        <uses-feature android:name="android.hardware.camera" />
12        <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
13        <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
14        <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
15        <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
16        <uses-permission android:name="android.permission.ACCESS_BACKGROUND_LOCATION" />
17        <uses-permission android:name="android.permission.WAKE_LOCK"/>
18        <uses-permission android:name="android.permission.FOREGROUND_SERVICE"/>
19        <uses-permission android:name="android.permission.VIBRATE" />
20        <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>
21        <uses-permission android:name="android.permission.WAKE_LOCK" />
22        <uses-permission android:name="android.permission.ACTIVITY_RECOGNITION" />
23        <uses-permission android:name="com.google.android.gms.permission.ACTIVITY_RECOGNITION" />
24    
25    
26        <application
27            android:name="io.flutter.app.FlutterApplication"
28            android:label="*****"
29            android:requestLegacyExternalStorage="true"
30            android:usesCleartextTraffic="true"
31            android:icon="@mipmap/ic_launcher">
32    
33    
34            <meta-data
35              android:name="com.google.firebase.messaging.default_notification_icon"
36              android:resource="@drawable/ic_stat_artboard_1" />
37    
38            <meta-data android:name="com.google.android.geo.API_KEY"
39                android:value="Z*********"/>
40    
41            <provider
42                android:name="vn.hunghd.flutterdownloader.DownloadedFileProvider"
43                android:authorities="im.mingguang.mingguang_app.flutter_downloader.provider"
44                android:grantUriPermissions="true"
45                android:requestLegacyExternalStorage="true">
46                <meta-data
47                    android:name="android.support.FILE_PROVIDER_PATHS"
48                    android:resource="@xml/provider_paths"/>
49            </provider>
50    
51            <provider
52        android:name="androidx.core.content.FileProvider"
53        android:authorities="${applicationId}.provider"
54        android:grantUriPermissions="true">
55        <meta-data
56            android:name="android.support.FILE_PROVIDER_PATHS"
57            android:resource="@xml/provider_paths"/>
58    </provider>
59            <activity
60                android:name=".MainActivity"
61                android:launchMode="singleTop"
62                android:theme="@style/LaunchTheme"
63                android:configChanges="orientation|keyboardHidden|keyboard|screenSize|smallestScreenSize|locale|layoutDirection|fontScale|screenLayout|density|uiMode"
64                android:hardwareAccelerated="true"
65                android:exported="true"
66                android:windowSoftInputMode="adjustResize">
67                <intent-filter>
68                    <action android:name="android.intent.action.MAIN"/>
69                    <category android:name="android.intent.category.DEFAULT"/>
70                    <category android:name="android.intent.category.LAUNCHER"/>
71                </intent-filter>
72                <intent-filter>
73                    <action android:name="FLUTTER_NOTIFICATION_CLICK" />
74                    <category android:name="android.intent.category.DEFAULT"/>
75                </intent-filter>
76            </activity>
77            <!-- Don't delete the meta-data below.
78                 This is used by the Flutter tool to generate GeneratedPluginRegistrant.java -->
79            <meta-data
80                android:name="flutterEmbedding"
81                android:value="2" />
82        </application>
83    </manifest>
84

Play Console Error

enter image description here

ANSWER

Answered 2022-Jan-12 at 23:56

I face the same Issue but i solved by writing android:exported="true" in activity bellow the android:name=".MainActivity" image shown

Source https://stackoverflow.com/questions/70684516

QUESTION

php foreach loop don't work when I want to traverse json file

Asked 2022-Jan-25 at 20:24

My foreach loop dont work. It brings me only 1st item info when i use $arr in my foreach loop but when i change that to $value it gives me nothing :(

1<?php
2      $url = file_get_contents("libs/json/countryBorders.geo.json");
3      $arr = json_decode($url,true);
4    
5    
6      foreach($arr as $value)  {
7             echo $value['features'][0]['properties']['name'];
8             echo $value['features'][0]['properties']['iso_a2'];
9       };
10        
11?>
12

Here is one of my elements in json file. I want to print all names and iso_a2 codes

1<?php
2      $url = file_get_contents("libs/json/countryBorders.geo.json");
3      $arr = json_decode($url,true);
4    
5    
6      foreach($arr as $value)  {
7             echo $value['features'][0]['properties']['name'];
8             echo $value['features'][0]['properties']['iso_a2'];
9       };
10        
11?>
12{
13   "type":"FeatureCollection",
14   "features":[
15      {
16         "type":"Feature",
17         "properties":{
18            "name":"Bahamas",
19            "iso_a2":"BS",
20            "iso_a3":"BHS",
21            "iso_n3":"044"
22         },
23         "geometry":{
24            "type":"MultiPolygon",
25            "coordinates":[
26               [
27                  [
28                     [
29                        -77.53466,
30                        23.75975
31                     ],
32                     [
33                        -77.78,
34                        23.71
35                     ],
36                     [
37                        -78.03405,
38                        24.28615
39                     ],
40                     [
41                        -78.40848,
42                        24.57564
43                     ],
44                     [
45                        -78.19087,
46                        25.2103
47                     ],
48                     [
49                        -77.89,
50                        25.17
51                     ],
52                     [
53                        -77.54,
54                        24.34
55                     ],
56                     [
57                        -77.53466,
58                        23.75975
59                     ]
60                  ]
61               ],
62               [
63                  [
64                     [
65                        -77.82,
66                        26.58
67                     ],
68                     [
69                        -78.91,
70                        26.42
71                     ],
72                     [
73                        -78.98,
74                        26.79
75                     ],
76                     [
77                        -78.51,
78                        26.87
79                     ],
80                     [
81                        -77.85,
82                        26.84
83                     ],
84                     [
85                        -77.82,
86                        26.58
87                     ]
88                  ]
89               ],
90               [
91                  [
92                     [
93                        -77,
94                        26.59
95                     ],
96                     [
97                        -77.17255,
98                        25.87918
99                     ],
100                     [
101                        -77.35641,
102                        26.00735
103                     ],
104                     [
105                        -77.34,
106                        26.53
107                     ],
108                     [
109                        -77.78802,
110                        26.92516
111                     ],
112                     [
113                        -77.79,
114                        27.04
115                     ],
116                     [
117                        -77,
118                        26.59
119                     ]
120                  ]
121               ]
122            ]
123         }
124      }
125

ANSWER

Answered 2022-Jan-25 at 20:11

I'm assuming you're parsing a collection of geospatial data and it is one entry you've copied in your question, in which case you'll need a nested loop. Something like the following should do it.

1<?php
2      $url = file_get_contents("libs/json/countryBorders.geo.json");
3      $arr = json_decode($url,true);
4    
5    
6      foreach($arr as $value)  {
7             echo $value['features'][0]['properties']['name'];
8             echo $value['features'][0]['properties']['iso_a2'];
9       };
10        
11?>
12{
13   "type":"FeatureCollection",
14   "features":[
15      {
16         "type":"Feature",
17         "properties":{
18            "name":"Bahamas",
19            "iso_a2":"BS",
20            "iso_a3":"BHS",
21            "iso_n3":"044"
22         },
23         "geometry":{
24            "type":"MultiPolygon",
25            "coordinates":[
26               [
27                  [
28                     [
29                        -77.53466,
30                        23.75975
31                     ],
32                     [
33                        -77.78,
34                        23.71
35                     ],
36                     [
37                        -78.03405,
38                        24.28615
39                     ],
40                     [
41                        -78.40848,
42                        24.57564
43                     ],
44                     [
45                        -78.19087,
46                        25.2103
47                     ],
48                     [
49                        -77.89,
50                        25.17
51                     ],
52                     [
53                        -77.54,
54                        24.34
55                     ],
56                     [
57                        -77.53466,
58                        23.75975
59                     ]
60                  ]
61               ],
62               [
63                  [
64                     [
65                        -77.82,
66                        26.58
67                     ],
68                     [
69                        -78.91,
70                        26.42
71                     ],
72                     [
73                        -78.98,
74                        26.79
75                     ],
76                     [
77                        -78.51,
78                        26.87
79                     ],
80                     [
81                        -77.85,
82                        26.84
83                     ],
84                     [
85                        -77.82,
86                        26.58
87                     ]
88                  ]
89               ],
90               [
91                  [
92                     [
93                        -77,
94                        26.59
95                     ],
96                     [
97                        -77.17255,
98                        25.87918
99                     ],
100                     [
101                        -77.35641,
102                        26.00735
103                     ],
104                     [
105                        -77.34,
106                        26.53
107                     ],
108                     [
109                        -77.78802,
110                        26.92516
111                     ],
112                     [
113                        -77.79,
114                        27.04
115                     ],
116                     [
117                        -77,
118                        26.59
119                     ]
120                  ]
121               ]
122            ]
123         }
124      }
125$url = file_get_contents("libs/json/countryBorders.geo.json");
126$arr = json_decode($url, true);
127    
128foreach($arr as $value)  {
129    foreach($value['features'] as $feature) {
130        echo $feature['properties']['name'];
131        echo $feature['properties']['iso_a2'];
132    }
133}
134

Source https://stackoverflow.com/questions/70854979

QUESTION

Which Mime Types contain charset=utf-8 directive?

Asked 2022-Jan-10 at 05:00

To make it easy to visualize, below is the following Record lookup table.

I just can't seem to find anywhere online where it tells you which of these are supposed to also contain charset=utf-8.

Should I just assume it's anything similar to text?

Take a look:

1const MEDIA_TYPES: Record<string, string> = {
2  ".md": "text/markdown",
3  ".html": "text/html",
4  ".htm": "text/html",
5  ".json": "application/json",
6  ".map": "application/json",
7  ".txt": "text/plain",
8  ".ts": "text/typescript",
9  ".tsx": "text/tsx",
10  ".js": "application/javascript",
11  ".jsx": "text/jsx",
12  ".gz": "application/gzip",
13  ".css": "text/css",
14  ".wasm": "application/wasm",
15  ".mjs": "application/javascript",
16  ".otf": "font/otf",
17  ".ttf": "font/ttf",
18  ".woff": "font/woff",
19  ".woff2": "font/woff2",
20  ".conf": "text/plain",
21  ".list": "text/plain",
22  ".log": "text/plain",
23  ".ini": "text/plain",
24  ".vtt": "text/vtt",
25  ".yaml": "text/yaml",
26  ".yml": "text/yaml",
27  ".mid": "audio/midi",
28  ".midi": "audio/midi",
29  ".mp3": "audio/mp3",
30  ".mp4a": "audio/mp4",
31  ".m4a": "audio/mp4",
32  ".ogg": "audio/ogg",
33  ".spx": "audio/ogg",
34  ".opus": "audio/ogg",
35  ".wav": "audio/wav",
36  ".webm": "audio/webm",
37  ".aac": "audio/x-aac",
38  ".flac": "audio/x-flac",
39  ".mp4": "video/mp4",
40  ".mp4v": "video/mp4",
41  ".mkv": "video/x-matroska",
42  ".mov": "video/quicktime",
43  ".svg": "image/svg+xml",
44  ".avif": "image/avif",
45  ".bmp": "image/bmp",
46  ".gif": "image/gif",
47  ".heic": "image/heic",
48  ".heif": "image/heif",
49  ".jpeg": "image/jpeg",
50  ".jpg": "image/jpeg",
51  ".png": "image/png",
52  ".tiff": "image/tiff",
53  ".psd": "image/vnd.adobe.photoshop",
54  ".ico": "image/vnd.microsoft.icon",
55  ".webp": "image/webp",
56  ".es": "application/ecmascript",
57  ".epub": "application/epub+zip",
58  ".jar": "application/java-archive",
59  ".war": "application/java-archive",
60  ".webmanifest": "application/manifest+json",
61  ".doc": "application/msword",
62  ".dot": "application/msword",
63  ".docx": "application/vnd.openxmlformats-officedocument.wordprocessingml.document",
64  ".dotx": "application/vnd.openxmlformats-officedocument.wordprocessingml.template",
65  ".cjs": "application/node",
66  ".bin": "application/octet-stream",
67  ".pkg": "application/octet-stream",
68  ".dump": "application/octet-stream",
69  ".exe": "application/octet-stream",
70  ".deploy": "application/octet-stream",
71  ".img": "application/octet-stream",
72  ".msi": "application/octet-stream",
73  ".pdf": "application/pdf",
74  ".pgp": "application/pgp-encrypted",
75  ".asc": "application/pgp-signature",
76  ".sig": "application/pgp-signature",
77  ".ai": "application/postscript",
78  ".eps": "application/postscript",
79  ".ps": "application/postscript",
80  ".rdf": "application/rdf+xml",
81  ".rss": "application/rss+xml",
82  ".rtf": "application/rtf",
83  ".apk": "application/vnd.android.package-archive",
84  ".key": "application/vnd.apple.keynote",
85  ".numbers": "application/vnd.apple.keynote",
86  ".pages": "application/vnd.apple.pages",
87  ".geo": "application/vnd.dynageo",
88  ".gdoc": "application/vnd.google-apps.document",
89  ".gslides": "application/vnd.google-apps.presentation",
90  ".gsheet": "application/vnd.google-apps.spreadsheet",
91  ".kml": "application/vnd.google-earth.kml+xml",
92  ".mkz": "application/vnd.google-earth.kmz",
93  ".icc": "application/vnd.iccprofile",
94  ".icm": "application/vnd.iccprofile",
95  ".xls": "application/vnd.ms-excel",
96  ".xlsx": "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet",
97  ".xlm": "application/vnd.ms-excel",
98  ".ppt": "application/vnd.ms-powerpoint",
99  ".pot": "application/vnd.ms-powerpoint",
100  ".pptx": "application/vnd.openxmlformats-officedocument.presentationml.presentation",
101  ".potx": "application/vnd.openxmlformats-officedocument.presentationml.template",
102  ".xps": "application/vnd.ms-xpsdocument",
103  ".odc": "application/vnd.oasis.opendocument.chart",
104  ".odb": "application/vnd.oasis.opendocument.database",
105  ".odf": "application/vnd.oasis.opendocument.formula",
106  ".odg": "application/vnd.oasis.opendocument.graphics",
107  ".odp": "application/vnd.oasis.opendocument.presentation",
108  ".ods": "application/vnd.oasis.opendocument.spreadsheet",
109  ".odt": "application/vnd.oasis.opendocument.text",
110  ".rar": "application/vnd.rar",
111  ".unityweb": "application/vnd.unity",
112  ".dmg": "application/x-apple-diskimage",
113  ".bz": "application/x-bzip",
114  ".crx": "application/x-chrome-extension",
115  ".deb": "application/x-debian-package",
116  ".php": "application/x-httpd-php",
117  ".iso": "application/x-iso9660-image",
118  ".sh": "application/x-sh",
119  ".sql": "application/x-sql",
120  ".srt": "application/x-subrip",
121  ".xml": "application/xml",
122  ".zip": "application/zip",
123};
124
125/** Returns the content-type based on the extension of a path. */
126function contentType(pathname: string): string | undefined {
127  return MEDIA_TYPES[pathname];
128}
129
130console.log(contentType("/dashboard/v1/index.html"));
131console.log(contentType("/dashboard/v1/logo.svg"));
132

ANSWER

Answered 2022-Jan-10 at 05:00

MDN Says:

For example, for any MIME type whose main type is text, you can add the optional charset parameter to specify the character set used for the characters in the data. If no charset is specified, the default is ASCII (US-ASCII) unless overridden by the user agent's settings. To specify a UTF-8 text file, the MIME type text/plain;charset=UTF-8 is used.

So, for anything based on text/... you can optionally add the charset.

https://developer.mozilla.org/en-US/docs/Web/HTTP/Basics_of_HTTP/MIME_types#structure_of_a_mime_type

The following update to contentType() function demonstrates one solution.

1const MEDIA_TYPES: Record<string, string> = {
2  ".md": "text/markdown",
3  ".html": "text/html",
4  ".htm": "text/html",
5  ".json": "application/json",
6  ".map": "application/json",
7  ".txt": "text/plain",
8  ".ts": "text/typescript",
9  ".tsx": "text/tsx",
10  ".js": "application/javascript",
11  ".jsx": "text/jsx",
12  ".gz": "application/gzip",
13  ".css": "text/css",
14  ".wasm": "application/wasm",
15  ".mjs": "application/javascript",
16  ".otf": "font/otf",
17  ".ttf": "font/ttf",
18  ".woff": "font/woff",
19  ".woff2": "font/woff2",
20  ".conf": "text/plain",
21  ".list": "text/plain",
22  ".log": "text/plain",
23  ".ini": "text/plain",
24  ".vtt": "text/vtt",
25  ".yaml": "text/yaml",
26  ".yml": "text/yaml",
27  ".mid": "audio/midi",
28  ".midi": "audio/midi",
29  ".mp3": "audio/mp3",
30  ".mp4a": "audio/mp4",
31  ".m4a": "audio/mp4",
32  ".ogg": "audio/ogg",
33  ".spx": "audio/ogg",
34  ".opus": "audio/ogg",
35  ".wav": "audio/wav",
36  ".webm": "audio/webm",
37  ".aac": "audio/x-aac",
38  ".flac": "audio/x-flac",
39  ".mp4": "video/mp4",
40  ".mp4v": "video/mp4",
41  ".mkv": "video/x-matroska",
42  ".mov": "video/quicktime",
43  ".svg": "image/svg+xml",
44  ".avif": "image/avif",
45  ".bmp": "image/bmp",
46  ".gif": "image/gif",
47  ".heic": "image/heic",
48  ".heif": "image/heif",
49  ".jpeg": "image/jpeg",
50  ".jpg": "image/jpeg",
51  ".png": "image/png",
52  ".tiff": "image/tiff",
53  ".psd": "image/vnd.adobe.photoshop",
54  ".ico": "image/vnd.microsoft.icon",
55  ".webp": "image/webp",
56  ".es": "application/ecmascript",
57  ".epub": "application/epub+zip",
58  ".jar": "application/java-archive",
59  ".war": "application/java-archive",
60  ".webmanifest": "application/manifest+json",
61  ".doc": "application/msword",
62  ".dot": "application/msword",
63  ".docx": "application/vnd.openxmlformats-officedocument.wordprocessingml.document",
64  ".dotx": "application/vnd.openxmlformats-officedocument.wordprocessingml.template",
65  ".cjs": "application/node",
66  ".bin": "application/octet-stream",
67  ".pkg": "application/octet-stream",
68  ".dump": "application/octet-stream",
69  ".exe": "application/octet-stream",
70  ".deploy": "application/octet-stream",
71  ".img": "application/octet-stream",
72  ".msi": "application/octet-stream",
73  ".pdf": "application/pdf",
74  ".pgp": "application/pgp-encrypted",
75  ".asc": "application/pgp-signature",
76  ".sig": "application/pgp-signature",
77  ".ai": "application/postscript",
78  ".eps": "application/postscript",
79  ".ps": "application/postscript",
80  ".rdf": "application/rdf+xml",
81  ".rss": "application/rss+xml",
82  ".rtf": "application/rtf",
83  ".apk": "application/vnd.android.package-archive",
84  ".key": "application/vnd.apple.keynote",
85  ".numbers": "application/vnd.apple.keynote",
86  ".pages": "application/vnd.apple.pages",
87  ".geo": "application/vnd.dynageo",
88  ".gdoc": "application/vnd.google-apps.document",
89  ".gslides": "application/vnd.google-apps.presentation",
90  ".gsheet": "application/vnd.google-apps.spreadsheet",
91  ".kml": "application/vnd.google-earth.kml+xml",
92  ".mkz": "application/vnd.google-earth.kmz",
93  ".icc": "application/vnd.iccprofile",
94  ".icm": "application/vnd.iccprofile",
95  ".xls": "application/vnd.ms-excel",
96  ".xlsx": "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet",
97  ".xlm": "application/vnd.ms-excel",
98  ".ppt": "application/vnd.ms-powerpoint",
99  ".pot": "application/vnd.ms-powerpoint",
100  ".pptx": "application/vnd.openxmlformats-officedocument.presentationml.presentation",
101  ".potx": "application/vnd.openxmlformats-officedocument.presentationml.template",
102  ".xps": "application/vnd.ms-xpsdocument",
103  ".odc": "application/vnd.oasis.opendocument.chart",
104  ".odb": "application/vnd.oasis.opendocument.database",
105  ".odf": "application/vnd.oasis.opendocument.formula",
106  ".odg": "application/vnd.oasis.opendocument.graphics",
107  ".odp": "application/vnd.oasis.opendocument.presentation",
108  ".ods": "application/vnd.oasis.opendocument.spreadsheet",
109  ".odt": "application/vnd.oasis.opendocument.text",
110  ".rar": "application/vnd.rar",
111  ".unityweb": "application/vnd.unity",
112  ".dmg": "application/x-apple-diskimage",
113  ".bz": "application/x-bzip",
114  ".crx": "application/x-chrome-extension",
115  ".deb": "application/x-debian-package",
116  ".php": "application/x-httpd-php",
117  ".iso": "application/x-iso9660-image",
118  ".sh": "application/x-sh",
119  ".sql": "application/x-sql",
120  ".srt": "application/x-subrip",
121  ".xml": "application/xml",
122  ".zip": "application/zip",
123};
124
125/** Returns the content-type based on the extension of a path. */
126function contentType(pathname: string): string | undefined {
127  return MEDIA_TYPES[pathname];
128}
129
130console.log(contentType("/dashboard/v1/index.html"));
131console.log(contentType("/dashboard/v1/logo.svg"));
132/** Returns the content-type based on the extension of a path. */
133function contentType(ext: string): string | undefined {
134
135  const charsetUtf8 = "; charset=UTF-8";
136
137  // Content types that do not start with text/.. but usually contain charset=utf-8
138  const specialCase = [
139    "application/json",
140    "application/xml",
141    "application/rss+xml",
142  ];
143
144  let outputContentType = MEDIA_TYPES[ext];
145
146  // Return undefined.
147  if(!outputContentType) return;
148
149  if(outputContentType.startsWith("text/") || specialCase.includes(outputContentType)) {
150
151    // Combine Content-Type with charset=utf-8
152    outputContentType = outputContentType + charsetUtf8;
153
154  // Return combined.
155    return outputContentType;
156
157  } else {
158    // Return for any other types or undefined.
159    return outputContentType;
160  }
161  
162}
163

Then theoretically, you could return a 422: Unprocessable Entity on any content type NOT present in the mime type list.

1const MEDIA_TYPES: Record<string, string> = {
2  ".md": "text/markdown",
3  ".html": "text/html",
4  ".htm": "text/html",
5  ".json": "application/json",
6  ".map": "application/json",
7  ".txt": "text/plain",
8  ".ts": "text/typescript",
9  ".tsx": "text/tsx",
10  ".js": "application/javascript",
11  ".jsx": "text/jsx",
12  ".gz": "application/gzip",
13  ".css": "text/css",
14  ".wasm": "application/wasm",
15  ".mjs": "application/javascript",
16  ".otf": "font/otf",
17  ".ttf": "font/ttf",
18  ".woff": "font/woff",
19  ".woff2": "font/woff2",
20  ".conf": "text/plain",
21  ".list": "text/plain",
22  ".log": "text/plain",
23  ".ini": "text/plain",
24  ".vtt": "text/vtt",
25  ".yaml": "text/yaml",
26  ".yml": "text/yaml",
27  ".mid": "audio/midi",
28  ".midi": "audio/midi",
29  ".mp3": "audio/mp3",
30  ".mp4a": "audio/mp4",
31  ".m4a": "audio/mp4",
32  ".ogg": "audio/ogg",
33  ".spx": "audio/ogg",
34  ".opus": "audio/ogg",
35  ".wav": "audio/wav",
36  ".webm": "audio/webm",
37  ".aac": "audio/x-aac",
38  ".flac": "audio/x-flac",
39  ".mp4": "video/mp4",
40  ".mp4v": "video/mp4",
41  ".mkv": "video/x-matroska",
42  ".mov": "video/quicktime",
43  ".svg": "image/svg+xml",
44  ".avif": "image/avif",
45  ".bmp": "image/bmp",
46  ".gif": "image/gif",
47  ".heic": "image/heic",
48  ".heif": "image/heif",
49  ".jpeg": "image/jpeg",
50  ".jpg": "image/jpeg",
51  ".png": "image/png",
52  ".tiff": "image/tiff",
53  ".psd": "image/vnd.adobe.photoshop",
54  ".ico": "image/vnd.microsoft.icon",
55  ".webp": "image/webp",
56  ".es": "application/ecmascript",
57  ".epub": "application/epub+zip",
58  ".jar": "application/java-archive",
59  ".war": "application/java-archive",
60  ".webmanifest": "application/manifest+json",
61  ".doc": "application/msword",
62  ".dot": "application/msword",
63  ".docx": "application/vnd.openxmlformats-officedocument.wordprocessingml.document",
64  ".dotx": "application/vnd.openxmlformats-officedocument.wordprocessingml.template",
65  ".cjs": "application/node",
66  ".bin": "application/octet-stream",
67  ".pkg": "application/octet-stream",
68  ".dump": "application/octet-stream",
69  ".exe": "application/octet-stream",
70  ".deploy": "application/octet-stream",
71  ".img": "application/octet-stream",
72  ".msi": "application/octet-stream",
73  ".pdf": "application/pdf",
74  ".pgp": "application/pgp-encrypted",
75  ".asc": "application/pgp-signature",
76  ".sig": "application/pgp-signature",
77  ".ai": "application/postscript",
78  ".eps": "application/postscript",
79  ".ps": "application/postscript",
80  ".rdf": "application/rdf+xml",
81  ".rss": "application/rss+xml",
82  ".rtf": "application/rtf",
83  ".apk": "application/vnd.android.package-archive",
84  ".key": "application/vnd.apple.keynote",
85  ".numbers": "application/vnd.apple.keynote",
86  ".pages": "application/vnd.apple.pages",
87  ".geo": "application/vnd.dynageo",
88  ".gdoc": "application/vnd.google-apps.document",
89  ".gslides": "application/vnd.google-apps.presentation",
90  ".gsheet": "application/vnd.google-apps.spreadsheet",
91  ".kml": "application/vnd.google-earth.kml+xml",
92  ".mkz": "application/vnd.google-earth.kmz",
93  ".icc": "application/vnd.iccprofile",
94  ".icm": "application/vnd.iccprofile",
95  ".xls": "application/vnd.ms-excel",
96  ".xlsx": "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet",
97  ".xlm": "application/vnd.ms-excel",
98  ".ppt": "application/vnd.ms-powerpoint",
99  ".pot": "application/vnd.ms-powerpoint",
100  ".pptx": "application/vnd.openxmlformats-officedocument.presentationml.presentation",
101  ".potx": "application/vnd.openxmlformats-officedocument.presentationml.template",
102  ".xps": "application/vnd.ms-xpsdocument",
103  ".odc": "application/vnd.oasis.opendocument.chart",
104  ".odb": "application/vnd.oasis.opendocument.database",
105  ".odf": "application/vnd.oasis.opendocument.formula",
106  ".odg": "application/vnd.oasis.opendocument.graphics",
107  ".odp": "application/vnd.oasis.opendocument.presentation",
108  ".ods": "application/vnd.oasis.opendocument.spreadsheet",
109  ".odt": "application/vnd.oasis.opendocument.text",
110  ".rar": "application/vnd.rar",
111  ".unityweb": "application/vnd.unity",
112  ".dmg": "application/x-apple-diskimage",
113  ".bz": "application/x-bzip",
114  ".crx": "application/x-chrome-extension",
115  ".deb": "application/x-debian-package",
116  ".php": "application/x-httpd-php",
117  ".iso": "application/x-iso9660-image",
118  ".sh": "application/x-sh",
119  ".sql": "application/x-sql",
120  ".srt": "application/x-subrip",
121  ".xml": "application/xml",
122  ".zip": "application/zip",
123};
124
125/** Returns the content-type based on the extension of a path. */
126function contentType(pathname: string): string | undefined {
127  return MEDIA_TYPES[pathname];
128}
129
130console.log(contentType("/dashboard/v1/index.html"));
131console.log(contentType("/dashboard/v1/logo.svg"));
132/** Returns the content-type based on the extension of a path. */
133function contentType(ext: string): string | undefined {
134
135  const charsetUtf8 = "; charset=UTF-8";
136
137  // Content types that do not start with text/.. but usually contain charset=utf-8
138  const specialCase = [
139    "application/json",
140    "application/xml",
141    "application/rss+xml",
142  ];
143
144  let outputContentType = MEDIA_TYPES[ext];
145
146  // Return undefined.
147  if(!outputContentType) return;
148
149  if(outputContentType.startsWith("text/") || specialCase.includes(outputContentType)) {
150
151    // Combine Content-Type with charset=utf-8
152    outputContentType = outputContentType + charsetUtf8;
153
154  // Return combined.
155    return outputContentType;
156
157  } else {
158    // Return for any other types or undefined.
159    return outputContentType;
160  }
161  
162}
163let requestedFilePath = path.join("./", context.main.http.server.root, urlPathNameParsed.dir, urlPathNameParsed.base);
164
165try {
166  // try as file...
167  const file = await Deno.readFile(requestedFilePath);
168
169  // If file extension is not on media list...
170  if(typeof(contentType(urlPathNameParsed.ext)) === 'undefined') { 
171
172    // Set Content-Type header for this response
173    responseHeaders.set('Content-Type', 'text/plain; charset=UTF-8');
174
175    await e.respondWith(
176      new Response("HTTP 422: Unprocessable Entity", {
177        headers: responseHeaders,
178        status: 422,
179        statusText: 'Unprocessable Entity',
180      })
181    );
182
183  } else {
184
185    // Set Content-Type header for this response
186    responseHeaders.set('Content-Type', `${contentType(urlPathNameParsed.ext)}`);
187
188    // Build and send the response
189    await e.respondWith(
190      new Response(file, {
191        headers: responseHeaders, 
192        status: 200, 
193        statusText: 'OK'
194      })
195    );
196
197  }
198

Source https://stackoverflow.com/questions/70643383

QUESTION

Merge two pandas DataFrame based on partial match

Asked 2022-Jan-06 at 00:54

Two DataFrames have city names that are not formatted the same way. I'd like to do a Left-outer join and pull geo field for all partial string matches between the field City in both DataFrames.

1import pandas as pd
2
3df1 = pd.DataFrame({
4                    'City': ['San Francisco, CA','Oakland, CA'], 
5                    'Val': [1,2]
6                  })
7
8df2 = pd.DataFrame({
9                    'City': ['San Francisco-Oakland, CA','Salinas, CA'], 
10                    'Geo': ['geo1','geo2']
11                  })
12

Expected DataFrame upon join:

1import pandas as pd
2
3df1 = pd.DataFrame({
4                    'City': ['San Francisco, CA','Oakland, CA'], 
5                    'Val': [1,2]
6                  })
7
8df2 = pd.DataFrame({
9                    'City': ['San Francisco-Oakland, CA','Salinas, CA'], 
10                    'Geo': ['geo1','geo2']
11                  })
12 City                   Val   Geo
13
14 San Francisco, CA      1     geo1
15 Oakland, CA            2     geo1
16

ANSWER

Answered 2021-Sep-12 at 20:24

This should do the job. String match with Levenshtein_distance.

pip install thefuzz[speedup]

1import pandas as pd
2
3df1 = pd.DataFrame({
4                    'City': ['San Francisco, CA','Oakland, CA'], 
5                    'Val': [1,2]
6                  })
7
8df2 = pd.DataFrame({
9                    'City': ['San Francisco-Oakland, CA','Salinas, CA'], 
10                    'Geo': ['geo1','geo2']
11                  })
12 City                   Val   Geo
13
14 San Francisco, CA      1     geo1
15 Oakland, CA            2     geo1
16import pandas as pd
17import numpy as np
18
19from thefuzz import process
20
21def fuzzy_match(
22    a: pd.DataFrame, b: pd.DataFrame, col: str, limit: int = 5, thresh: int = 80
23):
24    """use fuzzy matching to join on column"""
25
26    s = b[col].tolist()
27
28    matches = a[col].apply(lambda x: process.extract(x, s, limit=limit))
29    matches = pd.DataFrame(np.concatenate(matches), columns=["match", "score"])
30
31    # join other columns in b to matches
32    to_join = (
33        pd.merge(left=b, right=matches, how="right", left_on="City", right_on="match")
34        .set_index(  # create an index that represents the matching row in df a, you can drop this when `limit=1`
35            np.array(
36                list(
37                    np.repeat(i, limit if limit < len(b) else len(b))
38                    for i in range(len(a))
39                )
40            ).flatten()
41        )
42        .drop(columns=["match"])
43        .astype({"score": "int16"})
44    )
45    print(f"\t the index here represents the row in dataframe a on which to join")
46    print(to_join)
47
48    res = pd.merge(
49        left=a, right=to_join, left_index=True, right_index=True, suffixes=("", "_b")
50    )
51
52    # return only the highest match or you can just set the limit to 1
53    # and remove this
54    df = res.reset_index()
55    df = df.iloc[df.groupby(by="index")["score"].idxmax()].reset_index(drop=True)
56
57    return df.drop(columns=["City_b", "score", "index"])
58
59def test(df):
60
61    expected = pd.DataFrame(
62        {
63            "City": ["San Francisco, CA", "Oakland, CA"],
64            "Val": [1, 2],
65            "Geo": ["geo1", "geo1"],
66        }
67    )
68
69    print(f'{"expected":-^70}')
70    print(expected)
71
72    print(f'{"res":-^70}')
73    print(df)
74
75    assert expected.equals(df)
76
77
78if __name__ == "__main__":
79
80    a = pd.DataFrame({"City": ["San Francisco, CA", "Oakland, CA"], "Val": [1, 2]})
81    b = pd.DataFrame(
82        {"City": ["San Francisco-Oakland, CA", "Salinas, CA"], "Geo": ["geo1", "geo2"]}
83    )
84
85    print(f'\n\n{"fuzzy match":-^70}')
86    res = fuzzy_match(a, b, col="City")
87    test(res)
88
89

Source https://stackoverflow.com/questions/69125666

QUESTION

Using cartopy to project geostationary data points onto a regular grid

Asked 2022-Jan-03 at 17:25

I'm trying to use Cartopy to project GOES satellite imagery data onto a regular grid across the USA. I'm doing something wrong with my translation from GOES to grid at the end of this colab workbook. I'm doing this:

1geos.transform_point(us_bbox[0][0] + x, us_bbox[0][1] + y, ccrs.PlateCarree()) / sat_h
2

As you can see from the image at the end, it isn't projecting onto the grid and is getting distorted somehow.

Edit: here's a bit more of the code from the colab workbook:

1geos.transform_point(us_bbox[0][0] + x, us_bbox[0][1] + y, ccrs.PlateCarree()) / sat_h
2grid_width = 500
3grid_height = 500
4grid = np.zeros((grid_width, grid_height))
5
6for x in range(0, grid_width):
7  for y in range(0, grid_height):
8    location_geos = geos.transform_point(us_bbox[0][0] + x, us_bbox[0][1] + y, ccrs.PlateCarree()) / sat_h
9    if not np.any(np.isnan(location_geos)):
10      grid[(x, y)] = C['BCM'].sel(y=location_geos[1],x=location_geos[0],method='nearest').values
11

Any help would be greatly appreciated.

enter image description here

ANSWER

Answered 2022-Jan-03 at 17:25

Probably a really silly question, as I don't know the libraries in question, but in the line

1geos.transform_point(us_bbox[0][0] + x, us_bbox[0][1] + y, ccrs.PlateCarree()) / sat_h
2grid_width = 500
3grid_height = 500
4grid = np.zeros((grid_width, grid_height))
5
6for x in range(0, grid_width):
7  for y in range(0, grid_height):
8    location_geos = geos.transform_point(us_bbox[0][0] + x, us_bbox[0][1] + y, ccrs.PlateCarree()) / sat_h
9    if not np.any(np.isnan(location_geos)):
10      grid[(x, y)] = C['BCM'].sel(y=location_geos[1],x=location_geos[0],method='nearest').values
11location_geos = geos.transform_point(us_bbox[0][0] + x, us_bbox[0][1] + y, ccrs.PlateCarree()) / sat_h
12

are you adding latitude/longitude (us_bbox values) to integers (x, y)? If so your final plotted image has a range of 500 degrees latitude/longitude and, actually, this might make sense of the image.

Source https://stackoverflow.com/questions/70535067

QUESTION

Extracting the measurement unit (degrees, metres, etc.) from spatial data in R

Asked 2021-Dec-21 at 15:05

I would like to extract the unit of measurement (decimal degrees, metres, feet, etc.) from a spatial object in R. For example, if I have an SF data frame that uses the WGS84 co-ordinate reference system (EPSG:4326), I would like to be able to determine that the co-ordinates are specified in decimal degrees. Similarly, I'd like to be able to determine that UTM co-ordinates (e.g. EPSG:32615) are specified in metres.

I have tried using the st_crs() function from the sf package, which returns the co-ordinate reference system in well-known text format. However, I'm struggling to be certain that a regex that extracts the unit of measurement from that well-known text will operate reliably for a wide range of co-ordinate systems.

Is there an existing function that returns the measurement unit for a spatial object?

For example, the following code produces an SF data frame that uses the WGS84 co-ordinate system:

1library(sf)
2#> Linking to GEOS 3.8.1, GDAL 3.2.1, PROJ 7.2.1
3
4cities <- st_sf(city = "London", geometry = st_sfc(st_point(c(-0.1276, 51.5072))), crs = 4326)
5
6cities
7#> Simple feature collection with 1 feature and 1 field
8#> Geometry type: POINT
9#> Dimension:     XY
10#> Bounding box:  xmin: -0.1276 ymin: 51.5072 xmax: -0.1276 ymax: 51.5072
11#> Geodetic CRS:  WGS 84
12#>     city                geometry
13#> 1 London POINT (-0.1276 51.5072)
14

Created on 2021-12-21 by the reprex package (v2.0.1)

I am ideally looking for a function that allows me to determine that the spatial unit for this dataset is decimal degrees, e.g. if the function was called st_crs_unit() I would like to call st_crs_unit(cities) and that function return the unit "degrees" or similar.

st_crs() produces information about the CRS in well-known text format, including that the co-ordinate system (CS[]) uses the ANGLEUNIT "degree" for both axes, but the structure of this text varies considerably across co-ordinate systems, so I cannot be sure a regex trained on some systems will work for all.

1library(sf)
2#> Linking to GEOS 3.8.1, GDAL 3.2.1, PROJ 7.2.1
3
4cities <- st_sf(city = "London", geometry = st_sfc(st_point(c(-0.1276, 51.5072))), crs = 4326)
5
6cities
7#> Simple feature collection with 1 feature and 1 field
8#> Geometry type: POINT
9#> Dimension:     XY
10#> Bounding box:  xmin: -0.1276 ymin: 51.5072 xmax: -0.1276 ymax: 51.5072
11#> Geodetic CRS:  WGS 84
12#>     city                geometry
13#> 1 London POINT (-0.1276 51.5072)
14st_crs(cities)
15#> Coordinate Reference System:
16#>   User input: EPSG:4326 
17#>   wkt:
18#> GEOGCRS["WGS 84",
19#>     DATUM["World Geodetic System 1984",
20#>         ELLIPSOID["WGS 84",6378137,298.257223563,
21#>             LENGTHUNIT["metre",1]]],
22#>     PRIMEM["Greenwich",0,
23#>         ANGLEUNIT["degree",0.0174532925199433]],
24#>     CS[ellipsoidal,2],
25#>         AXIS["geodetic latitude (Lat)",north,
26#>             ORDER[1],
27#>             ANGLEUNIT["degree",0.0174532925199433]],
28#>         AXIS["geodetic longitude (Lon)",east,
29#>             ORDER[2],
30#>             ANGLEUNIT["degree",0.0174532925199433]],
31#>     USAGE[
32#>         SCOPE["Horizontal component of 3D system."],
33#>         AREA["World."],
34#>         BBOX[-90,-180,90,180]],
35#>     ID["EPSG",4326]]
36

Created on 2021-12-21 by the reprex package (v2.0.1)

For example, if we transform the same data to use the UTM zone 30N co-ordinate system, the output from st_crs() changes substantially.

1library(sf)
2#> Linking to GEOS 3.8.1, GDAL 3.2.1, PROJ 7.2.1
3
4cities <- st_sf(city = "London", geometry = st_sfc(st_point(c(-0.1276, 51.5072))), crs = 4326)
5
6cities
7#> Simple feature collection with 1 feature and 1 field
8#> Geometry type: POINT
9#> Dimension:     XY
10#> Bounding box:  xmin: -0.1276 ymin: 51.5072 xmax: -0.1276 ymax: 51.5072
11#> Geodetic CRS:  WGS 84
12#>     city                geometry
13#> 1 London POINT (-0.1276 51.5072)
14st_crs(cities)
15#> Coordinate Reference System:
16#>   User input: EPSG:4326 
17#>   wkt:
18#> GEOGCRS["WGS 84",
19#>     DATUM["World Geodetic System 1984",
20#>         ELLIPSOID["WGS 84",6378137,298.257223563,
21#>             LENGTHUNIT["metre",1]]],
22#>     PRIMEM["Greenwich",0,
23#>         ANGLEUNIT["degree",0.0174532925199433]],
24#>     CS[ellipsoidal,2],
25#>         AXIS["geodetic latitude (Lat)",north,
26#>             ORDER[1],
27#>             ANGLEUNIT["degree",0.0174532925199433]],
28#>         AXIS["geodetic longitude (Lon)",east,
29#>             ORDER[2],
30#>             ANGLEUNIT["degree",0.0174532925199433]],
31#>     USAGE[
32#>         SCOPE["Horizontal component of 3D system."],
33#>         AREA["World."],
34#>         BBOX[-90,-180,90,180]],
35#>     ID["EPSG",4326]]
36st_crs(st_transform(cities, crs = 32630))
37#> Coordinate Reference System:
38#>   User input: EPSG:32630 
39#>   wkt:
40#> PROJCRS["WGS 84 / UTM zone 30N",
41#>     BASEGEOGCRS["WGS 84",
42#>         DATUM["World Geodetic System 1984",
43#>             ELLIPSOID["WGS 84",6378137,298.257223563,
44#>                 LENGTHUNIT["metre",1]]],
45#>         PRIMEM["Greenwich",0,
46#>             ANGLEUNIT["degree",0.0174532925199433]],
47#>         ID["EPSG",4326]],
48#>     CONVERSION["UTM zone 30N",
49#>         METHOD["Transverse Mercator",
50#>             ID["EPSG",9807]],
51#>         PARAMETER["Latitude of natural origin",0,
52#>             ANGLEUNIT["degree",0.0174532925199433],
53#>             ID["EPSG",8801]],
54#>         PARAMETER["Longitude of natural origin",-3,
55#>             ANGLEUNIT["degree",0.0174532925199433],
56#>             ID["EPSG",8802]],
57#>         PARAMETER["Scale factor at natural origin",0.9996,
58#>             SCALEUNIT["unity",1],
59#>             ID["EPSG",8805]],
60#>         PARAMETER["False easting",500000,
61#>             LENGTHUNIT["metre",1],
62#>             ID["EPSG",8806]],
63#>         PARAMETER["False northing",0,
64#>             LENGTHUNIT["metre",1],
65#>             ID["EPSG",8807]]],
66#>     CS[Cartesian,2],
67#>         AXIS["(E)",east,
68#>             ORDER[1],
69#>             LENGTHUNIT["metre",1]],
70#>         AXIS["(N)",north,
71#>             ORDER[2],
72#>             LENGTHUNIT["metre",1]],
73#>     USAGE[
74#>         SCOPE["Engineering survey, topographic mapping."],
75#>         AREA["Between 6°W and 0°W, northern hemisphere between equator and 84°N, onshore and offshore. Algeria. Burkina Faso. Côte' Ivoire (Ivory Coast). Faroe Islands - offshore. France. Ghana. Gibraltar. Ireland - offshore Irish Sea. Mali. Mauritania. Morocco. Spain. United Kingdom (UK)."],
76#>         BBOX[0,-6,84,0]],
77#>     ID["EPSG",32630]]
78

Created on 2021-12-21 by the reprex package (v2.0.1)

Is there an existing R function that returns the measurement unit for a spatial object?

ANSWER

Answered 2021-Dec-21 at 15:05

st_crs() has a parameters argument that returns a list of useful CRS parameters when TRUE, including the units of the CRS. Here's an example with the built-in nc data:

1library(sf)
2#> Linking to GEOS 3.8.1, GDAL 3.2.1, PROJ 7.2.1
3
4cities <- st_sf(city = "London", geometry = st_sfc(st_point(c(-0.1276, 51.5072))), crs = 4326)
5
6cities
7#> Simple feature collection with 1 feature and 1 field
8#> Geometry type: POINT
9#> Dimension:     XY
10#> Bounding box:  xmin: -0.1276 ymin: 51.5072 xmax: -0.1276 ymax: 51.5072
11#> Geodetic CRS:  WGS 84
12#>     city                geometry
13#> 1 London POINT (-0.1276 51.5072)
14st_crs(cities)
15#> Coordinate Reference System:
16#>   User input: EPSG:4326 
17#>   wkt:
18#> GEOGCRS["WGS 84",
19#>     DATUM["World Geodetic System 1984",
20#>         ELLIPSOID["WGS 84",6378137,298.257223563,
21#>             LENGTHUNIT["metre",1]]],
22#>     PRIMEM["Greenwich",0,
23#>         ANGLEUNIT["degree",0.0174532925199433]],
24#>     CS[ellipsoidal,2],
25#>         AXIS["geodetic latitude (Lat)",north,
26#>             ORDER[1],
27#>             ANGLEUNIT["degree",0.0174532925199433]],
28#>         AXIS["geodetic longitude (Lon)",east,
29#>             ORDER[2],
30#>             ANGLEUNIT["degree",0.0174532925199433]],
31#>     USAGE[
32#>         SCOPE["Horizontal component of 3D system."],
33#>         AREA["World."],
34#>         BBOX[-90,-180,90,180]],
35#>     ID["EPSG",4326]]
36st_crs(st_transform(cities, crs = 32630))
37#> Coordinate Reference System:
38#>   User input: EPSG:32630 
39#>   wkt:
40#> PROJCRS["WGS 84 / UTM zone 30N",
41#>     BASEGEOGCRS["WGS 84",
42#>         DATUM["World Geodetic System 1984",
43#>             ELLIPSOID["WGS 84",6378137,298.257223563,
44#>                 LENGTHUNIT["metre",1]]],
45#>         PRIMEM["Greenwich",0,
46#>             ANGLEUNIT["degree",0.0174532925199433]],
47#>         ID["EPSG",4326]],
48#>     CONVERSION["UTM zone 30N",
49#>         METHOD["Transverse Mercator",
50#>             ID["EPSG",9807]],
51#>         PARAMETER["Latitude of natural origin",0,
52#>             ANGLEUNIT["degree",0.0174532925199433],
53#>             ID["EPSG",8801]],
54#>         PARAMETER["Longitude of natural origin",-3,
55#>             ANGLEUNIT["degree",0.0174532925199433],
56#>             ID["EPSG",8802]],
57#>         PARAMETER["Scale factor at natural origin",0.9996,
58#>             SCALEUNIT["unity",1],
59#>             ID["EPSG",8805]],
60#>         PARAMETER["False easting",500000,
61#>             LENGTHUNIT["metre",1],
62#>             ID["EPSG",8806]],
63#>         PARAMETER["False northing",0,
64#>             LENGTHUNIT["metre",1],
65#>             ID["EPSG",8807]]],
66#>     CS[Cartesian,2],
67#>         AXIS["(E)",east,
68#>             ORDER[1],
69#>             LENGTHUNIT["metre",1]],
70#>         AXIS["(N)",north,
71#>             ORDER[2],
72#>             LENGTHUNIT["metre",1]],
73#>     USAGE[
74#>         SCOPE["Engineering survey, topographic mapping."],
75#>         AREA["Between 6°W and 0°W, northern hemisphere between equator and 84°N, onshore and offshore. Algeria. Burkina Faso. Côte' Ivoire (Ivory Coast). Faroe Islands - offshore. France. Ghana. Gibraltar. Ireland - offshore Irish Sea. Mali. Mauritania. Morocco. Spain. United Kingdom (UK)."],
76#>         BBOX[0,-6,84,0]],
77#>     ID["EPSG",32630]]
78library(sf)
79
80nc_4267 <- read_sf(system.file("shape/nc.shp", package="sf"))
81nc_3857 <- st_transform(nc_4267, 3857)
82
83st_crs(nc_4267, parameters = TRUE)$units_gdal
84#> [1] "degree"
85st_crs(nc_3857, parameters = TRUE)$units_gdal
86#> [1] "metre"
87

Note that for some purposes st_is_longlat() might be sufficient:

1library(sf)
2#> Linking to GEOS 3.8.1, GDAL 3.2.1, PROJ 7.2.1
3
4cities <- st_sf(city = "London", geometry = st_sfc(st_point(c(-0.1276, 51.5072))), crs = 4326)
5
6cities
7#> Simple feature collection with 1 feature and 1 field
8#> Geometry type: POINT
9#> Dimension:     XY
10#> Bounding box:  xmin: -0.1276 ymin: 51.5072 xmax: -0.1276 ymax: 51.5072
11#> Geodetic CRS:  WGS 84
12#>     city                geometry
13#> 1 London POINT (-0.1276 51.5072)
14st_crs(cities)
15#> Coordinate Reference System:
16#>   User input: EPSG:4326 
17#>   wkt:
18#> GEOGCRS["WGS 84",
19#>     DATUM["World Geodetic System 1984",
20#>         ELLIPSOID["WGS 84",6378137,298.257223563,
21#>             LENGTHUNIT["metre",1]]],
22#>     PRIMEM["Greenwich",0,
23#>         ANGLEUNIT["degree",0.0174532925199433]],
24#>     CS[ellipsoidal,2],
25#>         AXIS["geodetic latitude (Lat)",north,
26#>             ORDER[1],
27#>             ANGLEUNIT["degree",0.0174532925199433]],
28#>         AXIS["geodetic longitude (Lon)",east,
29#>             ORDER[2],
30#>             ANGLEUNIT["degree",0.0174532925199433]],
31#>     USAGE[
32#>         SCOPE["Horizontal component of 3D system."],
33#>         AREA["World."],
34#>         BBOX[-90,-180,90,180]],
35#>     ID["EPSG",4326]]
36st_crs(st_transform(cities, crs = 32630))
37#> Coordinate Reference System:
38#>   User input: EPSG:32630 
39#>   wkt:
40#> PROJCRS["WGS 84 / UTM zone 30N",
41#>     BASEGEOGCRS["WGS 84",
42#>         DATUM["World Geodetic System 1984",
43#>             ELLIPSOID["WGS 84",6378137,298.257223563,
44#>                 LENGTHUNIT["metre",1]]],
45#>         PRIMEM["Greenwich",0,
46#>             ANGLEUNIT["degree",0.0174532925199433]],
47#>         ID["EPSG",4326]],
48#>     CONVERSION["UTM zone 30N",
49#>         METHOD["Transverse Mercator",
50#>             ID["EPSG",9807]],
51#>         PARAMETER["Latitude of natural origin",0,
52#>             ANGLEUNIT["degree",0.0174532925199433],
53#>             ID["EPSG",8801]],
54#>         PARAMETER["Longitude of natural origin",-3,
55#>             ANGLEUNIT["degree",0.0174532925199433],
56#>             ID["EPSG",8802]],
57#>         PARAMETER["Scale factor at natural origin",0.9996,
58#>             SCALEUNIT["unity",1],
59#>             ID["EPSG",8805]],
60#>         PARAMETER["False easting",500000,
61#>             LENGTHUNIT["metre",1],
62#>             ID["EPSG",8806]],
63#>         PARAMETER["False northing",0,
64#>             LENGTHUNIT["metre",1],
65#>             ID["EPSG",8807]]],
66#>     CS[Cartesian,2],
67#>         AXIS["(E)",east,
68#>             ORDER[1],
69#>             LENGTHUNIT["metre",1]],
70#>         AXIS["(N)",north,
71#>             ORDER[2],
72#>             LENGTHUNIT["metre",1]],
73#>     USAGE[
74#>         SCOPE["Engineering survey, topographic mapping."],
75#>         AREA["Between 6°W and 0°W, northern hemisphere between equator and 84°N, onshore and offshore. Algeria. Burkina Faso. Côte' Ivoire (Ivory Coast). Faroe Islands - offshore. France. Ghana. Gibraltar. Ireland - offshore Irish Sea. Mali. Mauritania. Morocco. Spain. United Kingdom (UK)."],
76#>         BBOX[0,-6,84,0]],
77#>     ID["EPSG",32630]]
78library(sf)
79
80nc_4267 <- read_sf(system.file("shape/nc.shp", package="sf"))
81nc_3857 <- st_transform(nc_4267, 3857)
82
83st_crs(nc_4267, parameters = TRUE)$units_gdal
84#> [1] "degree"
85st_crs(nc_3857, parameters = TRUE)$units_gdal
86#> [1] "metre"
87st_is_longlat(nc_4267)
88#> [1] TRUE
89st_is_longlat(nc_3857)
90#> [1] FALSE
91

Source https://stackoverflow.com/questions/70436019

Community Discussions contain sources that include Stack Exchange Network

Tutorials and Learning Resources in Geo

Tutorials and Learning Resources are not available at this moment for Geo

Share this Page

share link

Get latest updates on Geo