การเพิ่มประสิทธิภาพการค้นหาที่ตั้งร้านค้าตามที่ตั้งบนโฮสต์เว็บที่ใช้ร่วมกัน?


11

ฉันมีโครงการที่ฉันต้องการสร้างที่ตั้งร้านค้าสำหรับลูกค้า

ฉันใช้ประเภทโพสต์ที่กำหนดเอง " restaurant-location" และฉันได้เขียนรหัสเพื่อระบุตำแหน่งที่อยู่ที่เก็บไว้ใน postmeta โดยใช้Google Geocoding API (ลิงก์ที่เข้ารหัสตำแหน่งทำเนียบขาวของสหรัฐอเมริกาใน JSONและฉันได้เก็บละติจูดและลองจิจูดกลับไว้ ไปยังฟิลด์ที่กำหนดเอง

ฉันได้เขียนget_posts_by_geo_distance()ฟังก์ชั่นที่ส่งคืนรายการของโพสต์ตามลำดับที่ใกล้เคียงที่สุดโดยใช้สูตรที่ฉันพบในสไลด์โชว์ที่โพสต์นี้ คุณอาจเรียกฟังก์ชั่นของฉันได้ (ฉันเริ่มต้นด้วยละติจูด "ที่มา" คงที่ / ยาว):

include "wp-load.php";

$source_lat = 30.3935337;
$source_long = -86.4957833;

$results = get_posts_by_geo_distance(
    'restaurant-location',
    'geo_latitude',
    'geo_longitude',
    $source_lat,
    $source_long);

echo '<ul>';
foreach($results as $post) {
    $edit_url = get_edit_url($post->ID);
    echo "<li>{$post->distance}: <a href=\"{$edit_url}\" target=\"_blank\">{$post->location}</a></li>";
}
echo '</ul>';
return;

นี่คือฟังก์ชั่นของget_posts_by_geo_distance()ตัวเอง:

function get_posts_by_geo_distance($post_type,$lat_key,$lng_key,$source_lat,$source_lng) {
    global $wpdb;
    $sql =<<<SQL
SELECT
    rl.ID,
    rl.post_title AS location,
    ROUND(3956*2*ASIN(SQRT(POWER(SIN(({$source_lat}-abs(lat.lat))*pi()/180/2),2)+
    COS({$source_lat}*pi()/180)*COS(abs(lat.lat)*pi()/180)*
    POWER(SIN(({$source_lng}-lng.lng)*pi()/180/2),2))),3) AS distance
FROM
    wp_posts rl
    INNER JOIN (SELECT post_id,CAST(meta_value AS DECIMAL(11,7)) AS lat FROM wp_postmeta lat WHERE lat.meta_key='{$lat_key}') lat ON lat.post_id = rl.ID
    INNER JOIN (SELECT post_id,CAST(meta_value AS DECIMAL(11,7)) AS lng FROM wp_postmeta lng WHERE lng.meta_key='{$lng_key}') lng ON lng.post_id = rl.ID
WHERE
    rl.post_type='{$post_type}' AND rl.post_name<>'auto-draft'
ORDER BY
    distance
SQL;
    $sql = $wpdb->prepare($sql,$source_lat,$source_lat,$source_lng);
    return $wpdb->get_results($sql);
}

ความกังวลของฉันคือ SQL นั้นไม่ได้รับการปรับให้เหมาะสมที่สุดเท่าที่จะทำได้ MySQL ไม่สามารถเรียงลำดับตามดัชนีใด ๆ ที่มีอยู่เนื่องจากตำแหน่งทางภูมิศาสตร์นั้นมีการเปลี่ยนแปลงและไม่มีชุดแหล่งข้อมูลทางภูมิศาสตร์ที่จำกัด สำหรับการแคช ขณะนี้ฉันนิ่งงันเกี่ยวกับวิธีเพิ่มประสิทธิภาพ

เมื่อคำนึงถึงสิ่งที่ฉันทำไปแล้วคำถามก็คือคุณจะเพิ่มประสิทธิภาพการใช้งานกรณีนี้ได้อย่างไร

มันไม่สำคัญที่ฉันจะเก็บทุกอย่างที่ฉันทำไว้หากวิธีการแก้ปัญหาที่ดีกว่าจะทำให้ฉันทิ้งมันไป ฉันเปิดการพิจารณาโซลูชันเกือบทุกอย่างยกเว้นสิ่งที่ต้องทำบางอย่างเช่นการติดตั้งเซิร์ฟเวอร์ Sphinx หรืออะไรก็ตามที่ต้องมีการกำหนดค่า MySQL ที่กำหนดเอง โดยทั่วไปโซลูชั่นจะต้องสามารถทำงานกับการติดตั้งวานิลลา WordPress แบบธรรมดา (ที่กล่าวว่าจะเป็นการดีถ้าใครต้องการแสดงรายการทางเลือกสำหรับผู้อื่นที่อาจจะได้รับขั้นสูงขึ้นและเพื่อลูกหลาน)

พบแหล่งข้อมูล

FYI ฉันได้ทำการวิจัยเล็กน้อยเกี่ยวกับเรื่องนี้ดังนั้นแทนที่จะให้คุณทำวิจัยอีกครั้งหรือแทนที่จะให้คุณโพสต์ลิงก์เหล่านี้เป็นคำตอบที่ฉันจะไปข้างหน้าและรวมไว้ด้วย

เกี่ยวกับการค้นหาสฟิงซ์

คำตอบ:


6

คุณต้องการความแม่นยำระดับใด หากเป็นการค้นหาทั่วทั้งรัฐ / ประเทศคุณอาจทำการค้นหา lat-lon เพื่อ zip และตั้งค่าระยะทางที่คำนวณล่วงหน้าจากพื้นที่ zip ไปยังพื้นที่ zip ของร้านอาหาร หากคุณต้องการระยะทางที่แม่นยำซึ่งจะไม่เป็นตัวเลือกที่ดี

คุณควรมองเข้าไปในโซลูชันGeohashในบทความ Wikipedia มีลิงค์ไปยังไลบรารี PHP เพื่อเข้ารหัสถอดรหัส lat ยาวเป็น geohashs

ที่นี่คุณมีบทความที่ดีที่อธิบายถึงสาเหตุและวิธีการที่พวกเขาใช้มันใน Google App Engine (รหัส Python แต่ง่ายต่อการปฏิบัติ) เนื่องจากความต้องการใช้ geohash ใน GAE คุณสามารถค้นหาคลังไพ ธ อนและตัวอย่างที่ดีได้

ตามที่โพสต์บล็อกนี้อธิบายถึงข้อดีของการใช้ geohashes คือคุณสามารถสร้างดัชนีในตาราง MySQL บนฟิลด์นั้น


ขอบคุณสำหรับคำแนะนำเกี่ยวกับ GeoHash! ฉันจะตรวจสอบอย่างแน่นอน แต่ออกเดินทางไปที่ WordCamp Savannah ในอีกหนึ่งชั่วโมงดังนั้นตอนนี้ไม่สามารถทำได้ มันเป็นที่ตั้งร้านอาหารสำหรับนักท่องเที่ยวที่มาเยือนเมืองดังนั้น 0.1 ไมล์อาจเป็นความแม่นยำขั้นต่ำ เป็นการดีที่มันจะดีกว่านั้น ฉันจะแก้ไขลิงก์ของคุณ!
MikeSchinkel

หากคุณกำลังจะแสดงผลลัพธ์ในแผนที่ Google คุณสามารถใช้ API ของพวกเขาในการเรียงลำดับcode.google.com/apis/maps/documentation/mapsdata/?hl=th

เนื่องจากนี่เป็นคำตอบที่น่าสนใจที่สุดฉันจะยอมรับแม้ว่าฉันจะไม่มีเวลาค้นคว้าและลองทำ
MikeSchinkel

9

นี่อาจจะสายเกินไปสำหรับคุณ แต่ฉันจะตอบกลับด้วยคำตอบที่คล้ายกับที่ฉันให้กับคำถามที่เกี่ยวข้องนี้ดังนั้นผู้เยี่ยมชมในอนาคตสามารถอ้างถึงทั้งสองคำถาม

ฉันจะไม่เก็บค่าเหล่านี้ในตารางการโพสต์ข้อมูลเมตาหรืออย่างน้อยไม่เพียงมี คุณต้องการตารางที่มีpost_id, lat, lonคอลัมน์เพื่อให้คุณสามารถวางดัชนีlat, lonและแบบสอบถามในที่ สิ่งนี้ไม่ควรยากเกินไปที่จะติดตามด้วยการบันทึกและอัปเดตฮุก

เมื่อคุณทำการสืบค้นฐานข้อมูลคุณจะต้องกำหนดกล่องขอบล้อมรอบจุดเริ่มต้นดังนั้นคุณสามารถทำแบบสอบถามที่มีประสิทธิภาพสำหรับทุกlat, lonคู่ระหว่างเส้นขอบเหนือ - ใต้และตะวันออก - ตะวันตกของกล่อง

หลังจากที่คุณได้รับผลลัพธ์ที่ลดลงนี้คุณสามารถทำการคำนวณระยะทางขั้นสูง (วงกลมหรือเส้นทางการขับขี่จริง) เพื่อกรองตำแหน่งที่อยู่ในมุมของกล่องขอบเขตและไกลออกไปกว่าที่คุณต้องการ

ที่นี่คุณจะพบตัวอย่างโค้ดแบบง่าย ๆ ที่ทำงานในพื้นที่ผู้ดูแลระบบ คุณต้องสร้างตารางฐานข้อมูลเพิ่มเติมด้วยตัวเอง รหัสได้รับคำสั่งจากมากไปน้อยน่าสนใจ

<?php
/*
Plugin Name: Monkeyman geo test
Plugin URI: http://www.monkeyman.be
Description: Geolocation test
Version: 1.0
Author: Jan Fabry
*/

class Monkeyman_Geo
{
    public function __construct()
    {
        add_action('init', array(&$this, 'registerPostType'));
        add_action('save_post', array(&$this, 'saveLatLon'), 10, 2);

        add_action('admin_menu', array(&$this, 'addAdminPages'));
    }

    /**
     * On post save, save the metadata in our special table
     * (post_id INT, lat DECIMAL(10,5), lon DECIMAL (10,5))
     * Index on lat, lon
     */
    public function saveLatLon($post_id, $post)
    {
        if ($post->post_type != 'monkeyman_geo') {
            return;
        }
        $lat = floatval(get_post_meta($post_id, 'lat', true));
        $lon = floatval(get_post_meta($post_id, 'lon', true));

        global $wpdb;
        $result = $wpdb->replace(
            $wpdb->prefix . 'monkeyman_geo',
            array(
                'post_id' => $post_id,
                'lat' => $lat,
                'lon' => $lon,
            ),
            array('%s', '%F', '%F')
        );
    }

    public function addAdminPages()
    {
        add_management_page( 'Quick location generator', 'Quick generator', 'edit_posts', __FILE__  . 'generator', array($this, 'doGeneratorPage'));
        add_management_page( 'Location test', 'Location test', 'edit_posts', __FILE__ . 'test', array($this, 'doTestPage'));

    }

    /**
     * Simple test page with a location and a distance
     */
    public function doTestPage()
    {
        if (!array_key_exists('search', $_REQUEST)) {
            $default_lat = ini_get('date.default_latitude');
            $default_lon = ini_get('date.default_longitude');

            echo <<<EOF
<form action="" method="post">
    <p>Center latitude: <input size="10" name="center_lat" value="{$default_lat}"/>
        <br/>Center longitude: <input size="10" name="center_lon" value="{$default_lon}"/>
        <br/>Max distance (km): <input size="5" name="max_distance" value="100"/></p>
    <p><input type="submit" name="search" value="Search!"/></p>
</form>
EOF;
            return;
        }
        $center_lon = floatval($_REQUEST['center_lon']);
        $center_lat = floatval($_REQUEST['center_lat']);
        $max_distance = floatval($_REQUEST['max_distance']);

        var_dump(self::getPostsUntilDistanceKm($center_lon, $center_lat, $max_distance));
    }

    /**
     * Get all posts that are closer than the given distance to the given location
     */
    public static function getPostsUntilDistanceKm($center_lon, $center_lat, $max_distance)
    {
        list($north_lat, $east_lon, $south_lat, $west_lon) = self::getBoundingBox($center_lat, $center_lon, $max_distance);

        $geo_posts = self::getPostsInBoundingBox($north_lat, $east_lon, $south_lat, $west_lon);

        $close_posts = array();
        foreach ($geo_posts as $geo_post) {
            $post_lat = floatval($geo_post->lat);
            $post_lon = floatval($geo_post->lon);
            $post_distance = self::calculateDistanceKm($center_lat, $center_lon, $post_lat, $post_lon);
            if ($post_distance < $max_distance) {
                $close_posts[$geo_post->post_id] = $post_distance;
            }
        }
        return $close_posts;
    }

    /**
     * Select all posts ids in a given bounding box
     */
    public static function getPostsInBoundingBox($north_lat, $east_lon, $south_lat, $west_lon)
    {
        global $wpdb;
        $sql = $wpdb->prepare('SELECT post_id, lat, lon FROM ' . $wpdb->prefix . 'monkeyman_geo WHERE lat < %F AND lat > %F AND lon < %F AND lon > %F', array($north_lat, $south_lat, $west_lon, $east_lon));
        return $wpdb->get_results($sql, OBJECT_K);
    }

    /* Geographical calculations: distance and bounding box */

    /**
     * Calculate the distance between two coordinates
     * http://stackoverflow.com/questions/365826/calculate-distance-between-2-gps-coordinates/1416950#1416950
     */
    public static function calculateDistanceKm($a_lat, $a_lon, $b_lat, $b_lon)
    {
        $d_lon = deg2rad($b_lon - $a_lon);
        $d_lat = deg2rad($b_lat - $a_lat);
        $a = pow(sin($d_lat/2.0), 2) + cos(deg2rad($a_lat)) * cos(deg2rad($b_lat)) * pow(sin($d_lon/2.0), 2);
        $c = 2 * atan2(sqrt($a), sqrt(1-$a));
        $d = 6367 * $c;

        return $d;
    }

    /**
     * Create a box around a given point that extends a certain distance in each direction
     * http://www.colorado.edu/geography/gcraft/warmup/aquifer/html/distance.html
     *
     * @todo: Mind the gap at 180 degrees!
     */
    public static function getBoundingBox($center_lat, $center_lon, $distance_km)
    {
        $one_lat_deg_in_km = 111.321543; // Fixed
        $one_lon_deg_in_km = cos(deg2rad($center_lat)) * 111.321543; // Depends on latitude

        $north_lat = $center_lat + ($distance_km / $one_lat_deg_in_km);
        $south_lat = $center_lat - ($distance_km / $one_lat_deg_in_km);

        $east_lon = $center_lon - ($distance_km / $one_lon_deg_in_km);
        $west_lon = $center_lon + ($distance_km / $one_lon_deg_in_km);

        return array($north_lat, $east_lon, $south_lat, $west_lon);
    }

    /* Below this it's not interesting anymore */

    /**
     * Generate some test data
     */
    public function doGeneratorPage()
    {
        if (!array_key_exists('generate', $_REQUEST)) {
            $default_lat = ini_get('date.default_latitude');
            $default_lon = ini_get('date.default_longitude');

            echo <<<EOF
<form action="" method="post">
    <p>Number of posts: <input size="5" name="post_count" value="10"/></p>
    <p>Center latitude: <input size="10" name="center_lat" value="{$default_lat}"/>
        <br/>Center longitude: <input size="10" name="center_lon" value="{$default_lon}"/>
        <br/>Max distance (km): <input size="5" name="max_distance" value="100"/></p>
    <p><input type="submit" name="generate" value="Generate!"/></p>
</form>
EOF;
            return;
        }
        $post_count = intval($_REQUEST['post_count']);
        $center_lon = floatval($_REQUEST['center_lon']);
        $center_lat = floatval($_REQUEST['center_lat']);
        $max_distance = floatval($_REQUEST['max_distance']);

        list($north_lat, $east_lon, $south_lat, $west_lon) = self::getBoundingBox($center_lat, $center_lon, $max_distance);


        add_action('save_post', array(&$this, 'setPostLatLon'), 5);
        $precision = 100000;
        for ($p = 0; $p < $post_count; $p++) {
            self::$currentRandomLat = mt_rand($south_lat * $precision, $north_lat * $precision) / $precision;
            self::$currentRandomLon = mt_rand($west_lon * $precision, $east_lon * $precision) / $precision;

            $location = sprintf('(%F, %F)', self::$currentRandomLat, self::$currentRandomLon);

            $post_data = array(
                'post_status' => 'publish',
                'post_type' => 'monkeyman_geo',
                'post_content' => 'Point at ' . $location,
                'post_title' => 'Point at ' . $location,
            );

            var_dump(wp_insert_post($post_data));
        }
    }

    public static $currentRandomLat = null;
    public static $currentRandomLon = null;

    /**
     * Because I didn't know how to save meta data with wp_insert_post,
     * I do it here
     */
    public function setPostLatLon($post_id)
    {
        add_post_meta($post_id, 'lat', self::$currentRandomLat);
        add_post_meta($post_id, 'lon', self::$currentRandomLon);
    }

    /**
     * Register a simple post type for us
     */
    public function registerPostType()
    {
        register_post_type(
            'monkeyman_geo',
            array(
                'label' => 'Geo Location',
                'labels' => array(
                    'name' => 'Geo Locations',
                    'singular_name' => 'Geo Location',
                    'add_new' => 'Add new',
                    'add_new_item' => 'Add new location',
                    'edit_item' => 'Edit location',
                    'new_item' => 'New location',
                    'view_item' => 'View location',
                    'search_items' => 'Search locations',
                    'not_found' => 'No locations found',
                    'not_found_in_trash' => 'No locations found in trash',
                    'parent_item_colon' => null,
                ),
                'description' => 'Geographical locations',
                'public' => true,
                'exclude_from_search' => false,
                'publicly_queryable' => true,
                'show_ui' => true,
                'menu_position' => null,
                'menu_icon' => null,
                'capability_type' => 'post',
                'capabilities' => array(),
                'hierarchical' => false,
                'supports' => array(
                    'title',
                    'editor',
                    'custom-fields',
                ),
                'register_meta_box_cb' => null,
                'taxonomies' => array(),
                'permalink_epmask' => EP_PERMALINK,
                'rewrite' => array(
                    'slug' => 'locations',
                ),
                'query_var' => true,
                'can_export' => true,
                'show_in_nav_menus' => true,
            )
        );
    }
}

$monkeyman_Geo_instance = new Monkeyman_Geo();

@Jan : ขอบคุณสำหรับคำตอบ คุณคิดว่าคุณสามารถให้รหัสจริงที่แสดงถึงสิ่งเหล่านี้ได้หรือไม่
MikeSchinkel

@ ไมค์: มันเป็นความท้าทายที่น่าสนใจ แต่นี่คือโค้ดที่ควรใช้
Jan Fabry

@Jan Fabry: เจ๋ง! ฉันจะตรวจสอบมันเมื่อฉันกระโดดกลับในโครงการนั้น
MikeSchinkel

1

ฉันไปงานปาร์ตี้ในงานนี้ แต่เมื่อมองย้อนกลับไปนี่get_post_metaเป็นปัญหาจริงๆที่นี่แทนที่จะเป็นคำสั่ง SQL ที่คุณใช้อยู่

ฉันเพิ่งต้องค้นหา geo ที่คล้ายกันบนเว็บไซต์ที่ฉันเรียกใช้และแทนที่จะใช้ตาราง meta เพื่อจัดเก็บ lat และ lon (ซึ่งต้องมีสองรวมที่ดีที่สุดในการค้นหาและถ้าคุณใช้ get_post_meta สองฐานข้อมูลเพิ่มเติม ข้อความค้นหาต่อสถานที่) ฉันสร้างตารางใหม่ด้วยรูปแบบจุดข้อมูลที่จัดทำดัชนีเชิงเรขาคณิต

ข้อความค้นหาของฉันดูเหมือนของคุณมากโดยที่ MySQL ทำการยกของหนักจำนวนมาก (ฉันเลิกฟังก์ชั่นตรีโกณและทำให้ทุกอย่างกลายเป็นพื้นที่สองมิติได้ง่ายขึ้นเพราะมันใกล้พอสำหรับจุดประสงค์ของฉัน):

function nearby_property_listings( $number = 5 ) {
    global $client_location, $wpdb;

    //sanitize public inputs
    $lat = (float)$client_location['lat'];  
    $lon = (float)$client_location['lon']; 

    $sql = $wpdb->prepare( "SELECT *, ROUND( SQRT( ( ( ( Y(geolocation) - $lat) * 
                                                       ( Y(geolocation) - $lat) ) *
                                                         69.1 * 69.1) +
                                                  ( ( X(geolocation) - $lon ) * 
                                                       ( X(geolocation) - $lon ) * 
                                                         53 * 53 ) ) ) as distance
                            FROM {$wpdb->properties}
                            ORDER BY distance LIMIT %d", $number );

    return $wpdb->get_results( $sql );
}

โดยที่ $ client_location เป็นค่าที่ส่งคืนโดยบริการการค้นหา IP ทางภูมิศาสตร์สาธารณะ (ฉันใช้ geoio.com แต่มีจำนวนที่คล้ายกัน)

มันอาจดูไม่สะดวกนัก แต่ในการทดสอบมันได้ส่งคืนตำแหน่งที่ใกล้ที่สุด 5 แห่งออกจากตาราง 80,000 แถวในเวลาต่ำกว่า 0.4 วินาที

จนกว่า MySQL จะเปิดตัวฟังก์ชัน DISTANCE ที่กำลังเสนออยู่นี่ก็เป็นวิธีที่ดีที่สุดที่ฉันพบว่าใช้การค้นหาตำแหน่ง

แก้ไข: การเพิ่มโครงสร้างตารางสำหรับตารางนี้โดยเฉพาะ มันเป็นชุดของรายชื่อสถานที่ให้บริการดังนั้นจึงอาจหรืออาจจะไม่คล้ายกับกรณีการใช้งานอื่น ๆ

CREATE TABLE IF NOT EXISTS `rh_properties` (
  `listingId` int(10) unsigned NOT NULL,
  `listingType` varchar(60) collate utf8_unicode_ci NOT NULL,
  `propertyType` varchar(60) collate utf8_unicode_ci NOT NULL,
  `status` varchar(20) collate utf8_unicode_ci NOT NULL,
  `street` varchar(64) collate utf8_unicode_ci NOT NULL,
  `city` varchar(24) collate utf8_unicode_ci NOT NULL,
  `state` varchar(5) collate utf8_unicode_ci NOT NULL,
  `zip` decimal(5,0) unsigned zerofill NOT NULL,
  `geolocation` point NOT NULL,
  `county` varchar(64) collate utf8_unicode_ci NOT NULL,
  `bedrooms` decimal(3,2) unsigned NOT NULL,
  `bathrooms` decimal(3,2) unsigned NOT NULL,
  `price` mediumint(8) unsigned NOT NULL,
  `image_url` varchar(255) collate utf8_unicode_ci NOT NULL,
  `description` mediumtext collate utf8_unicode_ci NOT NULL,
  `link` varchar(255) collate utf8_unicode_ci NOT NULL,
  PRIMARY KEY  (`listingId`),
  KEY `geolocation` (`geolocation`(25))
)

geolocationคอลัมน์เป็นสิ่งเดียวที่เกี่ยวข้องสำหรับวัตถุประสงค์ที่นี่; มันประกอบด้วย x (lon), y (lat) พิกัดที่ฉันเพิ่งค้นหาจากที่อยู่เมื่อนำเข้าค่าใหม่ในฐานข้อมูล


ขอบคุณสำหรับการติดตาม ฉันพยายามหลีกเลี่ยงการเพิ่มตาราง แต่ท้ายที่สุดก็เพิ่มตารางด้วย แต่พยายามทำให้เป็นเรื่องทั่วไปมากกว่ากรณีใช้เฉพาะ นอกจากนี้ฉันไม่ได้ใช้ประเภทข้อมูล POINT เพราะฉันต้องการติดกับชนิดข้อมูลมาตรฐานที่ดีกว่า ส่วนขยายทางภูมิศาสตร์ของ MySQL ต้องการการเรียนรู้ที่สะดวกสบาย ที่กล่าวว่าคุณสามารถอัปเดตคำตอบของคุณด้วย DDL สำหรับตารางที่คุณใช้หรือไม่ ฉันคิดว่ามันจะเป็นประโยชน์สำหรับคนอื่น ๆ ที่อ่านเรื่องนี้ในอนาคต
MikeSchinkel

0

เพียงคำนวณระยะทางระหว่างเอนทิตีทั้งหมด ฉันจะเก็บมันไว้ในตารางฐานข้อมูลด้วยตัวมันเองพร้อมความสามารถในการทำดัชนีค่า


นั่นเป็นจำนวนที่ไม่ จำกัด ในทางปฏิบัติ ...
MikeSchinkel

Infinte? ฉันเห็นเฉพาะ n ^ 2 ที่นี่นั่นไม่ใช่ infinte โดยเฉพาะอย่างยิ่งกับรายการมากขึ้น precalcultaion ควรพิจารณามากขึ้น
hakre

แทบไม่มีที่สิ้นสุด ให้ Lat / Long ที่ความแม่นยำทศนิยม 7 ตำแหน่งซึ่งจะให้ 6.41977E + 17 บันทึก ใช่เราไม่ได้มีจำนวนมาก แต่เรามีมากกว่าสิ่งที่สมเหตุสมผล
MikeSchinkel

อนันต์เป็นคำที่กำหนดไว้อย่างดีและการเพิ่มคำคุณศัพท์นั้นไม่เปลี่ยนแปลงมากนัก แต่ฉันรู้ว่าคุณหมายถึงอะไรคุณคิดว่านี่เป็นการคำนวณมากเกินไป หากคุณไม่ได้เพิ่มสถานที่ใหม่จำนวนมากอย่างต่อเนื่องในช่วงเวลาหนึ่งการคำนวณล่วงหน้านี้สามารถทำได้ทีละขั้นตอนโดยงานที่ดำเนินการนอกเหนือจากแอปพลิเคชันของคุณในพื้นหลัง ความแม่นยำไม่เปลี่ยนแปลงจำนวนการคำนวณ จำนวนสถานที่ทำ แต่บางทีฉันก็อ่านส่วนนั้นผิดไป ตัวอย่างเช่น 64 ตำแหน่งจะส่งผลให้เกิดการคำนวณ 4 096 (หรือ 4 032 สำหรับ n * (n-1)) ดังนั้นจึงบันทึก
hakre
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.